记录下keil对FPU的配置,及对应的宏参数。
前言
FPU单元是芯片上一个独立于CPU处理的浮点运算单元,整个单元可以被使能和关闭。
STM32F4带有32位单精度硬件FPU支持浮点指令集。相比Cortex-M3、Cortex-M0等无FPU的芯片高出数十倍甚至上百倍的运算性能。
STM32F7/H7及以上处理器带有双精度硬件FPU。
如果芯片支持FPU的话,ST公司会在驱动库中添加对应宏定义__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界面):
那么这个选项到底影响了什么?
先说结论,看库的这段代码:
如果用的编译器是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。文章来源:https://www.toymoban.com/news/detail-669271.html
以下的测试代码是我当时为了搞明白对应关系写的,可以有选择地注释掉部分报错指令,来观察定义关系:文章来源地址https://www.toymoban.com/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详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!