This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
本人最近在对基于TMS320F28069的电机控制算法代码进行执行时间优化,整个工程文件使IQmath库的定点运算,通过CCS 6.20断点功能自带的CountEvent功能查看代码的运行周期进而继续优化,在优化过程中总结发现了一些小细节,不是很理解,希望能够得到论坛的大佬替小可答疑解惑,以下是具体列出的问题。
(1)IQmath库中的除法运算函数_IQdiv()是一个优化后的除法函数吗?为何将除法取倒数化为_IQmpy乘法运算后要明显提高运算速率?为何乘法执行效率要比除法高很多?
具体实例如下:
Utemp = _IQ15div(Utemp,_IQ15(BASE_CURRENT)); //CountEvent中大概占63 duty cycles
替换为Utemp = _IQ15mpy(Utemp,_IQ15(INV_BASE_CURRENT)); //CountEvent中大概占7 duty cycles,INV_BASE_CURRENT是BASE_CURRENT的倒数
(2)IQmath.h头文件最终的IQ定标格式转换函数IQn(_iq a)效率奇低,其定义的是(long) ((a) * 2^n L);使用乘法将实际数字换算成对应的定标格式,发现使用移位运算可以大大提高语句执行速率,针对该现象进行以下实验:
_iq temp_cal = 10;
temp_cal =_IQ18(temp_cal ); //CountEvent中大概占297 duty cycles
_iq temp_cal = 10;
temp_cal=(long) ((temp_cal) * 262144.0L); //CountEvent中大概占289 duty cycles,262144.0=2^18
_iq temp_cal = 10;
temp_cal=(temp_cal<<18); //CountEvent中大概占7 duty cycles
为何使用变量进行数字较大乘法运算会花费这么多的时间,效率要低很多?
(3)调试时step into 进入函数,单步执行函数体内的每一条语句,观察函数中的每一条执行的Count Event,发现总和要远小于直接在函数体外step over执行函数的时间,请问多余的duty cycles是用来寻址和程序执行入口地址跳转用了吗,还是其他的原因?
(4)对于TMSF28335之类的DSP,对于使用浮点编写的程序,引用rts2800_fpu32_fast_supplement.lib库,和使用定点编写的程序,引用IQmath_fpu32.lib库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!