STM32F4xx属于Cortex M4F架构,自带FPU硬件,可以加速float类型数据的加减乘除运算。
观察启动文件,发现,要启用FPU,需要启动满足两个宏:(__FPU_PRESENT == 1) && (__FPU_USED == 1)
在keil的魔术棒中,如上图所示,直接选中单精度浮点运算器,keil就会自动把所需的宏给定义出来。如何验证是否开启成功?
验证方法1:
我们把F407主频设为168M,不选中/选中FPU,分别做10万次乘法:发现耗时分别为32153us、5954us,发现耗时缩短为1/6.性能提升显著,说明开启FPU成功了。
验证方法2:
进入debug模式,或者直接查看汇编文件,发现C语言乘法运算,被编译成了V打头的汇编乘法命令,说明开启成功。
FPU只能加速float的基本运算,还有一些数学函数,不是光靠FPU就能加速的,例如sin、cos、等函数,ST和ARM提供了优化过的三角函数等,使用插值方法加速运算,要想使用这些优化过的函数
-------------后记--------------------
再做几项计算耗时对比
图 A,耗时5952 us
图B 以上耗时7738us。该图比图A多了10万次乘法, 时间多了1786us。
图C 耗时5952
图D 7738 us
图E 11309 us
图F 9524 us
图G 6547 us。和图A比,多了10万次赋值,时间多了595us
图H 15476 us
图I 9524us
图J 7143
图K 7738
图L 7143
总结:
图AG对比:10万次float赋值:595us (float赋值速度)
图AB对比:10万次float乘法、赋值:1786us
10万次float乘法:1786us-595us=1191us (float乘法速度)
图AC对比:10万次float加法和10万次乘法相同:1191us (float加法速度)
图AF对比:10万次float比较大小、赋值:9524-5952=5357us
图AH对比:10万次float除法、赋值:15476-5952=9524us
10万次float除法:=9524us-595=8929 (float除法速度)
图AI对比:10万次整数取模、赋值:9524-5952=3572us
图AJ对比:10万次整数加法、赋值:7143-5952=1191us
图JK对比:10万次整数赋值:7738-7143=595 (int赋值速度)
图AJK对比:10万次整数加法:1191-595=596 (int加法)
图JL对比:10万次整数加法和乘法,耗时相同=595us (int乘法法)
根据以上结果,得到以下重要的几个结论:
(1)float赋值和int32赋值速度相同
(2)float乘法和float加法,速度相同
(3)float乘法耗时是float加法的2倍;int乘法和int加法,速度相同
(4)float除法耗时是乘法的8倍,是加法的16倍
(5)float乘法耗时是int乘法的2倍
注意:以上测试赋值的过程中,使用了volatile,所以赋值时存在写内存的过程,如果没有volatile,赋值会被写入CPU寄存器,会比写内存稍微快一点点。所以以上测试是保守的,实际会更快。