本帖最后由 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[1000]={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 | | | | | 使用FPU比不使用FPU快了约5.5倍 (不同的代码及编译器版本及优化级别都可能对结果产生差异) |
参考工程如下:
|