一般原则:
1.避免用编译器开关-r选项来清除寄存器。因为这样是很耗费资源的而且会使代码
质量降低。应该让编译器来分配寄存器变量。清除寄存器值只用于对那些时间要
求严格的中断模块(这样能够加速优化性能)
2.有选择的将需优化函数放到单独的文件中去,这样允许你单独编译文件
3.尽可能少用volatile 变量。编译器默认他们对数据的唯一读写单元。为了避免代码
清除,需要声明volatile变量,然而要记住volatile 声明会降低高效率代码的产生
4.为了最好的优化效能,用-pm 和-oe选项共同编译。
5.注意数据类型和顺序地优化代码
6.对那些经常使用的结构元素,分配到第一个元素,最低有效位或者是最低的地址空间
7.在加载程序时就初始化全局变量 -cr选想来避免多余的周期
8.用memcopy来拷贝一个数足到另外一个数组。不过对于结构则还是用=赋值效率高一些。
9。存储器对器要求和堆栈管理:将所有的数据声明放在一起,以16为数据为首开始。这
样就避免浪费不必要的存储器空间。编译器一般是32为对齐的,因此也会把任何含有32位
数据的结构用偶地址来对齐。同样的原则也用来对结构中的元素进行声明以避免存储空间
浪费。
10.C54x用-align链接选项保证堆栈对齐到偶地址上。例如:
SECTIONS
{
。stack : {align(2)}
}
编译器用下面原则来对特定的函数来建立局部帧的大小:
1.所有需要的局部符号的声明的字长个数
2.不能被存到寄存器中的中间变量的所需字长个数
3.被调用函数传递参数列表所用的字长个数
4.如果局部变量空间超过了127个字长时用来存数据的帧指针的空间
5.填充保证在进入函数以及其子函数时堆栈总是以偶地址方式对齐地址边界
访问内存映射的寄存器:
对C2x、C5x最好的方法是用asm声明,其次是用宏定义指针,最差的方法是用
volatile 指针;推荐用前两种声明方法来访问。因为用宏定义节省了一个周期和两个字的
存储空间(一个是数据空间中存储地址的。另外一个是程序空间的NOP指令)
extern volatile unsigned SPC0; asm("_SPC0 .set 0x22");
SPC0= 0x000;
#define SPC0 (volatile unsinged *) 0x22;*SPC0=0x000;
对C3x来说C指针就是一种很有效的方法,因为编译器对ARn间接寻址模式的良好支持
循环:
用--o3选项来产生高效代码。如果代码太大,用-ms和-o3来禁止循环和延迟指令
但是仍提供-o3的优化
避免在时间苛刻的循环中使用函数调用和控制流
for(i=constant;i<=constant;i+=constant)
C3x中RC是符号寄存器。如果用无符号变量的for循环,编译器不会产生RPTB因为无符号的
动态范围16位超过了符号的动态范围15位,编译器无法知道是否超出范围。
用static inline 或者是-pm -oe来优化程序编译
乘加和MAC的优化
for (i=0;i