本帖最后由 kai迪皮 于 2023-11-7 15:46 编辑
#申请原创# @21小跑堂
1 背景
APM32F411是基于Arm® Cortex®-M4F内核的MCU,这个内核自带FPU。我们的程序中有大量的浮点运算的时候FPU会给我们带来相对比较快的运算速度。
本帖子就APM32F411如何在Eclipse环境下开启FPU,进行一个简单的梳理及分享。因为之前有朋友问我在Eclipse环境下如何开启FPU,便想着最近有时间整理一下思路给到需要的小伙伴。
2 ARM Cortex - M4 FPU
首先先简单介绍一下,啥是FPU。简单来说它是ARM Cortex - M4内核MCU的一个可选的协处理的存在(由于是可选的,一些ARM Cortex - M4是没有FPU的),它可以在我们进行单精度浮点运算时加速我们的运算。
需要注意的是:浮点数可以是单精度(C 中的“float”)或双精度(C 中的“double”)。ARM Cortex - M4 处理器中的 FPU 支持单精度运算,但不支持双精度运算。如果存在双精度计算,则 C 编译器将使用运行时库函数在软件中处理计算(大多数编译器将使用整数运算(而不是单精度 FP)模拟双精度)。为了能最大化利用ARM Cortex - M4的FPU,我们最好以单精度进行数据的处理。
2.1 FPU的汇编指令
我们一般会使用到的FPU的汇编指令有:
1. 无符号转浮点型的:vcvt.f32.u32,用于将无符号整数(unsigned int)转换为单精度浮点数(float)。
2. 乘法的:vmul.f32,用于执行单精度浮点数的乘法运算。
3. 除法的:vdiv.f32,用于执行单精度浮点数的除法运算。
2.2 如何开启FPU
在APM32F4的SDK中SystemInit()函数里,有这样一段代码负责开启其FPU:
/* FPU settings */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); //!< set CP10 and CP11 Full Access
#endif
其中__FPU_PRESENT 在apm32f4xx.h中被设置成了1;
而__FPU_USED需要我们在编译器上进行设置。
在Eclipse+GCC的环境下,我们开启FPU的方法是(即设置__FPU_USED=1),选择工程右键打开配置“Properties->C/C++ Build->Settings->Tool Setttttings”把相关设置:
1. Float ABI 设置为 FP instruction(hard);
2. FPU Type 设置为 fpv4-sp-d16。
(PS:我这里使用的是硬件FPU,在某些场合我们需要的是软件+FPU的方式。)
3 验证FPU是否开启成功
在未开启FPU前,我们可以看到代码编译出来的汇编指令(图右侧)是不包含FPU的相关的汇编指令的。
开启FPU后,我们可以看到代码编译出来的汇编指令(图右侧)找到了FPU的相关的汇编指令。如:
1. 无符号转浮点型的:vcvt.f32.u32
2. 乘法的:vmul.f32
3. 除法的:vdiv.f32
4 FPU开启前后速度对比
我这里使用例子自带的滴答定时器进行一个简单的计时,以测试我们完成一个运算的前后时间速度关系。测速流程如下:
1. 设置滴答定时器,每1ms进入一次滴答中断。进入一次中断对计时变量:TimingDelay进行自加一次。
2. 在运算前将TimingDelay初始化为0;
3. 输出运算后此时的TimingDelay的值内容。
或许这个时间不太精准,但是由于我们的测试过程中只有“是否开启FPU”这一个变量,在一定意义上我们可以看到当前芯片的FPU开启前后的运算速度对比。
我这里的运算非常简单,就是在两个循环中进行不断执行运算(PS:这种运算要求我们的编译器优化等级设置为0,不然的话编译器可能一步到位给我们算出最终结果而不进行for循环中的运算):
for(uint32_t i = 0;i < 1000; i++)
{
for(uint32_t j = 0;j < 10000; j++)
{
fdata = multi*j;
}
}
4.1 只有乘法
未开启FPU:
开启FPU:
提速:(7704-2201)/2201*100%=71.43%
4.2 乘法和除法
未开启FPU:
开启FPU:
提速:(25957-4102)/25957*100%=84.19%
5 总结
根据测试的数据情况,我们可以看到在开启FPU后我们的运算速度大大提升,而且在运算的式子复杂度越高的情况下,速度提升越是明显。
以上便是APM32F411 如何在Eclipse环境下开启FPU的一些步骤分享,欢迎各位一起探讨,这个是代码及工程
APM32F4xx_SDK_V1.4_Eclipse_FPU.zip
(786.12 KB)
|
@21小跑堂 :感谢支持,Thanks♪(・ω・)ノ
Arm® Cortex®-M4F内核的MCU及以上带FPU,但是需要配合编译器开启,否则可能不会生效,作者在eclipse环境配合APM32F411开启FPU进行测试,可以大大减少浮点运算的速度,提升软件运行效率,具有一定借鉴意义。(蓝V用户,打赏已提升)