STM32L476 FPU 执行效率之比较浅析-Arduino中文社区 - Powered by Discuz! Archiver

Jessie唐 发表于 2016-8-9 13:12

STM32L476 FPU 执行效率之比较浅析

1.前言
本应用笔记基于STM32L476平台,通过实际测量来评定使能FPU时浮点运算效率的情况。
2.测试工具
STM32L476 Nucleo,示波器
3.测试方法MCU 运行频率设置为16MHz,根据下面公式1 做N 次浮点运算,分使能FPU和禁止FPU两种情况,测试完成相同运算所需要的时间。在例程中通过翻转IO PB13 来标定完成运算所需要的时间。http://mmbiz.qpic.cn/mmbiz/oKx9wruLfevNB79MWicOHpckayFXxUtHia9Sia5XyMiak6sqBnabmGEOYTYnlKIRbQo7GRQf2nymZ5YwFiaAKaIak3w/640?wx_fmt=png3.1 测试代码根据公式1,分别定义A、B、C 三个常量,如下:/* Private constants---------------------------------------------------------*/#define A_CONSTANT(0.285f)#define B_CONSTANT(0.443f)#define C_CONSTANT(0.698f)根据公式做对应的运算并通过GPIOC Pin0 输出,测定对应消耗时间:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13, GPIO_PIN_SET);temp = A_CONSTANT*x*x +B_CONSTANT*x + C_CONSTANT;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13, GPIO_PIN_RESET);
3.2 代码分析根据测试用的一元二次方程,经过IAR 编译后,汇编结果如下:
3.2.1 FPU 使能从汇编代码可以看出,使能FPU 的情况下,完成一元二次方程的运算只需要7 条单周期指令,总共耗时为7 个Clock 周期。通过IAR 的方针模式运行,需要的CPU cycles 为7.http://mmbiz.qpic.cn/mmbiz/oKx9wruLfevNB79MWicOHpckayFXxUtHiakqzTBBv2d6WIjOutOtEc7s0XyuPgUHibSRRDDpA2XicosJCbrl86XUrQ/640?wx_fmt=png
3.2.2 FPU 禁止从汇编代码可以看出,未使能FPU 的情况下,完成该一元二次方程的运算需要执行14 条指令,其中包括3 条两周期指令,6 条单周期指令,5 条程序跳转指令。通过IAR 的方针模式运行,需要的CPU cycles 为207.http://mmbiz.qpic.cn/mmbiz/oKx9wruLfevNB79MWicOHpckayFXxUtHiamuibiaDwASSTRTUrBzQGpQKQWJHgxAM7zdTlEeD8aLialRRicbFbSJvAtw/640?wx_fmt=png
4.测试数据及结论IO完成两次翻转耗时6.48 uS;使能FPU 时,除去IO 翻转耗时,完成一次运算时间为6.52 uS(13 uS -6.48 uS),如下图示:http://mmbiz.qpic.cn/mmbiz/oKx9wruLfevNB79MWicOHpckayFXxUtHiahceGL2objxr2NIjWibu6CHkPjclofRFq3SicCsQ6cgyQw530KjPpUDUw/640?wx_fmt=png

禁止FPU 时,除去IO 翻转耗时,完成一次运算时间为87.4 uS(93.88 uS -6.48 uS),如下图示:http://mmbiz.qpic.cn/mmbiz/oKx9wruLfevNB79MWicOHpckayFXxUtHiatSHtGzbicyzr64010Oz2Trnibce0kibOQVBEK6pU1x7gMFeiaA3VmYpOiag/640?wx_fmt=png
小结下,根据上面相关测试数据大致可得出如下结论:
• 完成同样的一元二次方程运算,禁止FPU时所消耗的时间约为使能FPU时消耗时间的13.4 倍左右。

**********The End **********


Jessie唐 发表于 2016-8-9 13:13

如图所示:

Charlie_Yang 发表于 2016-8-9 14:04

支持楼主!感谢楼主的帖子!
页: [1]
查看完整版本: STM32L476 FPU 执行效率之比较浅析