问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

APM32F411硬件FPU使用方法及注意点

创作时间:
作者:
@小白创作中心

APM32F411硬件FPU使用方法及注意点

引用
CSDN
1.
https://m.blog.csdn.net/ic2121/article/details/139815480

APM32F411是一款基于32位Arm Cortex-M4F内核的微控制器,其内置的硬件FPU(浮点运算单元)能够显著提升浮点运算的效率。本文将详细介绍如何开启硬件FPU,并通过实际测试案例展示其性能优势。

1. 如何开启硬件FPU

system_apm32f4xx.c文件的SystemInit()函数中,需要确保__FPU_PRESENT(是否带有FPU)和__FPU_USED(是否开启FPU)都设置为1。从M4权威指南手册可以查到,SCB->CPACR寄存器的配置如下:

实际应用中,CP10和CP11一般都设置为11。

KEIL软件提供了一个非常方便的开启硬件FPU功能选项。在KEIL的“Target”界面中,将“Floating Point Hardware”选项选择为“Single Precision”,即可完成硬件FPU的开启。

2. 测试案例

为了直观感受硬件FPU的运算速度,我们基于极海官网APM32F4xx_SDK_V1.4的GPIO_Toggle例程进行测试,将APM32F411系统时钟设置为100MHz。

2.1 开启和不开启FPU的测试

测试代码如下:

void test_function(void) {
    float data_a = 1.0;
    float data_b;
    for (int i = 0; i < 200; i++) {
        data_b = data_a * 3.14159;
    }
}

通过逻辑分析仪抓取PE6引脚的高低电平,评估代码执行时间。

  • 不开启硬件FPU的IO翻转时间约207.56us:

  • 开启硬件FPU的IO翻转时间约218.64us:

令人意外的是,开启硬件FPU的运算时间反而更慢。这是因为参与运算的浮点型常量3.14159默认是double类型,而M4/M4F的硬件FPU只对单精度浮点数(float)加速。

从汇编代码可以看出,不开启硬件FPU计算需要189个机器周期,开启硬件FPU计算需要191个机器周期,差了2个机器周期。

2.2 浮点型常量加f后缀后的测试

将浮点型常量加上f后缀,测试代码变为:

void test_function(void) {
    float data_a = 1.0f;
    float data_b;
    for (int i = 0; i < 200; i++) {
        data_b = data_a * 3.14159f;
    }
}

测试结果如下:

  • 不开启硬件FPU的IO翻转时间约73.48us
  • 开启硬件FPU的IO翻转时间约16.4us

从汇编代码对比可以看出,不开启硬件FPU计算需要60个机器周期,开启硬件FPU计算需要11个机器周期,差了49个机器周期。

3. 测试总结

硬件FPU
浮点型常量
运行时间
data_b = data_a * 3.14159运算时间
不开启
不带f后缀
207.56us
189个机器周期
不开启
带f后缀
73.48us
60个机器周期
开启
不带f后缀
218.64us
191个机器周期
开启
带f后缀
16.4us
11个机器周期

结论:

  • 在计算没有超出float类型数值取值范围的情况下,建议浮点型常量都加上后缀f,可以缩短运算时间。
  • 如果没有float类型数值运算,可以不开启硬件FPU。
  • 对于float类型数值运算,建议开启硬件FPU,可以大大缩短运算时间。比如,该例程的语句乘法运算,开启硬件FPU的运算比未开启硬件FPU的运算少了49个机器周期数,运算时间提升约81.67%。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号