这几天用TI DSP5402做项目,之前都用5409,程序空间少了一半,程序写完后在ccs上跑的时候老报空间不足,因此用了很多的精力和时间对程序进行优化,特征是不能减的了,能优化的就是代码空间,以下是一些小结:
1.添加string.h、math.h等外接库会增加很多代码,所以对于memset,sqrt等考虑自己写。
今天找到的一个挺好用的sqrt实现算法,据说比一般编译器默认的要优化好几倍:
float sqrt(float number) {
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return (number * y);
}
还一个fabs:
float fabs( float f ) {
int tmp = * ( int * ) &f;
tmp &= 0x7FFFFFFF;
return * ( float * ) &tmp;
}
在pc上做仿真,运行效果与库函数无异,但是到了DSP则出现计算结果不一致的情况,追踪的结果是上面这个fabs出了问题,
然后换成 float fabs( float f ) return ((f)>0?(f):-(f));
这样的效果就一样了,原因不详……不过后面的函数的汇编
代码比前面的多,原因可能是判断比上面移位和指针操作更占汇编代码。还有#define和inline,根据其特性,程序空间的
累加很明显。
2.DSP上的程序,时间与空间一般都是对立的两面,因此有时候需要以时间换空间,有时候则以空间换时间上的优化,具体
问题就看实际项目需要了。
3.考虑用x&1替换x%2;以移位来替代乘除法,这样效率更好而且汇编代码更少。
4.根据第2点以及DSP指令的流水线特性,在循环的时候考虑用空间增加步长,换取降低循环量。
5.通过cmd文件的配置来控制代码区和数据区的大小,不过假如程序空间本来就不足,再怎么配置都徒劳。
6.程序的build configuration要配置好,比如正确的程序运行出错,那么就要考虑这方面的原因了。
……
懂的不多,就先写这么些吧,今后得多总结多研究。