APM32F407xG FPU——如何在Keil下使用内核自带的FPU
本帖最后由 zjh20070904 于 2022-5-20 14:36 编辑#申请原创# #技术资源#
APM32F407xG的内核自带FPU,可使用该模块在处理浮点运算时加快运算速度,以下总结、记录了如何在Keil下使用FPU,并通过1000次 sin运算对比使用FPU、不使用FPU的运算速率差异。1 找到arm_cortexm4lf_math.lib文件C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.4.0\CMSIS\Lib\ARM(Keil_v5的安装路径因电脑而异)
各类库文件的差异如下:- arm-cortexM4b_math.lib(M4内核的大端模式)- arm_cortexM4bf_math.lib (M4内核的大端模式,浮点单元)- arm_cortexM4l_math.lib (M4内核的小端模式)- arm_cortexM4lf_math.lib (M4内核的小端模式,浮点单元)MCU是小端模式,在此使用浮点单元,因此选择arm_cortexM4lf_math.lib。
另外:C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.4.0\CMSIS有源文件、例程
2 将arm_cortexM4lf_math.lib复制到FPU的工程目录下,并添加到工程中
3 复制arm_math.h头文件C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.4.0\CMSIS\Include
将arm_math.h添加至工程中
4 配置Keil工程4.1 配置Keil工程,选择使用FPU
4.2 添加以下宏定义ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,ARM_MATH_CM4,__CC_ARM
宏定义的解释(摘录网上的资料)如下:(1)ARM_MATH_MATRIX_CHECK是库函数的参数检查开关,这里添加后,就打开。(2)ARM_MATH_ROUNDING这个是库函数在运算是是否开启四舍五入的功能,我这里添加,可以根据自己的需要进行配置。(3)ARM_MATH_CM4这个就非常重要,必须要配置进去,否则在编译之后,会默认使用math.h的库函数,而不会用到硬件的FPU的。(4)__CC_ARM是不同编译器的编译配置宏定义,(5)__CC_ARM就是代表MDK开发环境。4.3 包含头文件arm_math.h路径(路径因工程而异)
5 编写测试函数参考测试代码如下:#include "arm_math.h"
void float_test(void){ floata=1.2345, sum = 0; int i=0; for(i=0;i<1000;i++) { sum= sum+a; }}
extern float32_t arm_sin_f32(float32_t x);
void float_sin_test(void){ int i=0; float32_ta={0}; float32_tresult=0;
for(i=1;i<1000;i++) {a=PI/i;} result=0;//方便设置断点 for(i=1;i<1000;i++) {result=arm_sin_f32(a);}}
int main(void){ float_sin_test();
while(1);}6 对比使用、不使用FPU的计算速率6.1 设置断点,记录计算sin使用的States数量
6.2 使用FPU
消耗的States=98029-38868=59161
6.3 不使用FPU6.3.1 需要重新调整Keil的配置(1)添加arm_cortexM4l_math.lib文件
(2)配置Keil工程
(3)清除编译内容,设置断点,记录states数据如下
消耗的States=424446-97027=327419
6.4 总结
使用FPU消耗的States:59161
不使用FPU消耗的States:327419
结论使用FPU比不使用FPU快了约5.5倍(不同的代码及编译器版本及优化级别都可能对结果产生差异)
参考工程如下:
页:
[1]