【N32G455】_对比在 FPU 开启前后浮点运算代码的执行效率

一、前言

国民技术的 N32G455 系列采用 32 bit ARM Cortex-M4 内核,最高工作主频144MHz,支持浮点运算和 DSP 指令,集成高达 512KB 嵌入式 Flash,144KB SRAM,集成丰富的高性能模拟器件,内置 4 个12bit 5Msps ADC,4 路独立轨到轨运算放大器,7  个高速比较器,2  个1Msps 12bit DAC,集成多路U(S)ART、I2C、SPI、QSPI、USB、CAN、SDIO 通信接口, 内置密码算法硬件加速引擎。

M4 内核自带一个 FPU,也有把带 FPU 的 M4 内核和不带 FPU 的 M4 内核区分成 M4F 和 M4,但其实在 ARM 官方的声明中,都是统一为 M4。看下面 ARM 官网的截图。

 

本文将基于国民技术的 N32G455 平台,在 keil 环境下,对比在跑同样的代码的情况下(代码包含浮点运算),开启 FPU 和不开启 FPU 所花费的时间。

 

二、实验结果

先看实验结果,实验代码都一样,如下,将一个包含加减乘除的代码用 for 循环分别跑 10 次和跑 100 次。通过抓取 GPIO 的高电平时间来获取跑这段代码所花费的时间。

先看跑 10 次的。

其中不开 FPU 花费的时间如下:24.85us

开了 FPU 花费的时间如下:2.05us



再看 100 次的。

其中不开 FPU 花费的时间如下:232.35us

开了 FPU 花费的时间如下:17.05us

从上面的两个对比可以看出来,开启 FPU 对于 MCU 跑带浮点运算的代码的效率提升是巨大的,开启与不开启前后约是 10 倍左右的时间关系。在电机控制中,我们要做 Clarke 变换或者 Park 变换,或者通过 SVPWM 计算三相占空比,或者各种各样的观测器算法,滤波算法,补偿算法,三角函数计算,在有 FPU 的情况下,就可以直接使用浮点运算,不用再去刻意转成定点数运算,降低精度。

 

三、开启 FPU 的步骤(以 N32G455 平台在 Keil 中为例)

开启 Keil 的单精度浮点运算



添加预定义宏 __TARGET_FPU_VFP


开启成功后,编译后我们可以在系统的入口函数看到 FPU 部分代码已经高亮



在调试的时候查看汇编也可以看到,汇编操作指令前面都加了一个 V ,代表使用了 FPU 的操作指令去做这个加减乘除的操作。

没有开启 FPU 的时候是汇编指令操作下面这个样子的,设计到运算那里的汇编指令操作前面没有加 V ,可以看到计算的流程也是不一样的。



以上就是在 Keil 编译器中开启 FPU 的步骤。需要注意的是,因为是单精度的浮点运算,所以最好在浮点数值后面都加一个 f,不加有可能就不会调用 FPU 去计算。

四、总结

本文简单获取了 N32G455 在 Keil 编译器中开启 FPU 前后跑同一段代码所花费的时间,介绍了在 Keil 编译器下开启 FPU 的步骤。具体还有其他如包含 ARM 的数学库和 C 的数学库之类的本文并没有介绍。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论