記錄下keil對FPU的配置,及對應的宏參數(shù)。
前言
FPU單元是芯片上一個獨立于CPU處理的浮點運算單元,整個單元可以被使能和關閉。
STM32F4帶有32位單精度硬件FPU支持浮點指令集。相比Cortex-M3、Cortex-M0等無FPU的芯片高出數(shù)十倍甚至上百倍的運算性能。
STM32F7/H7及以上處理器帶有雙精度硬件FPU。
如果芯片支持FPU的話,ST公司會在驅(qū)動庫中添加對應宏定義__FPU_PRESENT
。
下面這個是STM32G4系列,支持FPU
沒有FPU的芯片一般不會有這個宏定義,就像下面這個F1的
一、一些宏的說明
有效配置FPU的方法如下圖所示:
其中可以看到,真正有效的配置是一句寄存器設置,而控制這句指令是否使用的是兩個宏(__FPU_PRESENT == 1) && (__FPU_USED == 1)
。前者是表示FPU功能是否存在,后者表示程序員是否要使用FPU。
所以對于有FPU的芯片,直接在C/C++
的全局宏定義里添加__FPU_USED=1
便可以打開FPU功能。像下面這樣:
但是這種方法不常用,也不方便。
二、勾選開啟FPU
對于使用CubeMX的用戶,如果芯片帶有FPU,會默認開啟FPU功能,即下面的勾選框:
無FPU的芯片是沒有這個選項的(附F1界面):
那么這個選項到底影響了什么?
先說結(jié)論,看庫的這段代碼:
如果用的編譯器是ARM Compiler 5,那么__CC_ARM
是定義的,次一級的__TARGET_FPU_VFP
就是對應上面的選擇框的,選了__TARGET_FPU_VFP
就有定義,不選他就會把__FPU_USED
置0,也就是不使用FPU。如果勾選了選擇框,首先會檢查是否有FPU,沒有就會報錯;有的話他會#define __FPU_USED 1U
把它置1,從而使能system_stm32xxxx.c
中那句指令,開啟FPU。文章來源:http://www.zghlxwxcb.cn/news/detail-669271.html
以下的測試代碼是我當時為了搞明白對應關系寫的,可以有選擇地注釋掉部分報錯指令,來觀察定義關系:文章來源地址http://www.zghlxwxcb.cn/news/detail-669271.html
#if defined __TARGET_FPU_VFP
#error "def __TARGET_FPU_VFP"
#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
#error "def __FPU_PRESENT == 1U"
#define __FPU_USED 1U
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
#error "FPU OK!!!"
#endif
#else
#error "device without an FPU (check __FPU_PRESENT)"
#define __FPU_USED 0U
#endif
#else
#error "undef __TARGET_FPU_VFP"
#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
#error "def __FPU_PRESENT == 1U"
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
#error "FPU OK!!!"
#else
#error "__FPU_PRESENT != 1 || __FPU_USED != 1"
#endif
#else
#error "device without an FPU (check __FPU_PRESENT)"
#endif
#endif
到了這里,關于STM32 keil MDK配置FPU詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!