本人最近在对基于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库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!
gaoyang9992006:processors.wiki.ti.com/index.php
有看这个库的使用说明吗?
本人最近在对基于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库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!
mangui zhang:优化做的最好的是TI提供的一些库里面结合汇编等做了各种优化
除了你的代码中做合理的编程优化外设计编译器的优化等级
本人最近在对基于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库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!
Green Deng:你好,代码优化可以参考一下CCS编译器的说明文档第三章内容:www.ti.com/…/spru514p.pdf
本人最近在对基于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库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!
user5280439:
回复 gaoyang9992006:
看了,也确实是按上面优化的,但是只知其然不知其所以然,故来发帖咨询
本人最近在对基于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库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!
user5280439:
回复 mangui zhang:
好的,谢谢
本人最近在对基于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库,哪个执行效率更高,执行时间更短呢?
请问有什么好的代码优化建议或是干货分享吗?如能提供您的看法和见解,小弟不胜感激,临网页而涕零!
user5280439:
回复 Green Deng:
好的,但是上面几个具体问题,请问您有什么好的看法吗