发新帖本帖赏金 60.00元(功能说明)我要提问
返回列表
打印
[APM32F4]

【技术分享】APM32F411 如何在Eclipse环境下开启FPU

[复制链接]
1816|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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小跑堂 打赏了 60.00 元 2023-11-20
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
kai迪皮 2023-11-20 16:52 回复TA
@21小跑堂 :感谢支持,Thanks♪(・ω・)ノ 
21小跑堂 2023-11-20 11:03 回复TA
Arm® Cortex®-M4F内核的MCU及以上带FPU,但是需要配合编译器开启,否则可能不会生效,作者在eclipse环境配合APM32F411开启FPU进行测试,可以大大减少浮点运算的速度,提升软件运行效率,具有一定借鉴意义。(蓝V用户,打赏已提升) 
沙发
zwsam| | 2023-11-7 20:32 | 只看该作者

使用特权

评论回复
板凳
zwsam| | 2023-11-7 20:32 | 只看该作者

使用特权

评论回复
评论
kai迪皮 2023-11-8 10:14 回复TA
感谢支持 
地板
chenjun89| | 2023-11-9 11:30 | 只看该作者
开启FPU在做浮点运算时能节省不少时间

使用特权

评论回复
评论
kai迪皮 2023-11-10 21:16 回复TA
是的 
5
woai32lala| | 2023-11-21 08:49 | 只看该作者
学习

使用特权

评论回复
6
elephant00| | 2024-1-10 15:31 | 只看该作者
优质文章值得学习

使用特权

评论回复
发新帖 本帖赏金 60.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

212

帖子

11

粉丝