TI中文支持网
TI专业的中文技术问题搜集分享网站

关于使用C200内核芯片TMS320F28069的代码优化问题

本人最近在对基于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:

好的,但是上面几个具体问题,请问您有什么好的看法吗

赞(0)
未经允许不得转载:TI中文支持网 » 关于使用C200内核芯片TMS320F28069的代码优化问题
分享到: 更多 (0)