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

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后我们的运算速度大大提升,而且在运算的式子复杂度越高的情况下,速度提升越是明显。。
---------------------
作者:kai迪皮
链接:https://bbs.21ic.com/icview-3338854-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值