针对ARM处理器的C语言优化

这是一篇读书笔记:《ARM嵌入式系统开发——软件设计与优化》

稍后记得将前边贴出的代码照此规则处理一遍!

数据类型优化:
1.局部变量类型尽量申明为32位甚至是64位,来避免寄存器(32位)装载数据时进行位扩展,并减少编译器可能增加的边界检查代码;
2.访问数组的时候,尽量使用指针增量而不是数组下标(避免产生额外的指令);
3.函数的参数和返回值使用int类型(而不是8位或者16位)更有效,避免编译器对数值范围的转换;
4.尽量使用显式的类型转换,使编译器可以快速明确的进行处理;
5.涉及到存储器,尽可能使用小尺寸数据类型;但在局部变量中,应优先使用int类型,涉及到除法运算,优先使用 uint;

循环结构优化:
1.for(unsigned int i=0;i<64;i++)  ==> for(i=64;i!=0;1--)       //这里如果结合上边不使用数组下标,使用减数计数就没有问题
2.如果循环至少会执行一次,do-while 循环比for循环稍微减少了一些代码运行周期;

寄存器分配:
1.编译器会为每一个局部变量分配寄存器,如果多个局部变量不会交叉使用,可能会被分配到同一个寄存器;当局部变量多于可用的寄存器时,
编译器会把多于的变量存储到堆栈,这些变量被写入到了存储器中。
2.r0~r12,r14可以用来存放变量,但r12被作为临时过渡寄存器使用,因此局部变量最多不宜超过12个。
3.r0~r4四个寄存器用来传递参数,超过4个参数就必须访问堆栈,如果参数超过4个,可以使用结构体,执行效率会更高。
4.较小的被调用的函数和调用函数放在同一个源文件中(先定义后调用),重要的函数使用关键字 _inline内联;
5.避免做个指针可能指向同一个变量的情况,可以建立一个新的变量来保存表达式的值;
6.避免使用局部变量的地址,否则对于这个变量的访问效率会降低;

结构体:
1.结构体元素按照元素大小从小到大放置避免编译器对齐填充从而节省空间,若有需要可以人工填充;
2.Thumb指令只允许较小的元素偏移量:所有8位大小的元素安排在最前边,依次安排16位、32位、64位的元素,所有的数组和比较大的元素安排在最后,如果结构体太大,可以将元素组织到子结构体中;
3.结构体中谨慎使用枚举类型(与编译器类型有关);


除法
1.ARM硬件不支持除法,需要调用C库函数来实现, / 和 %效率极低,应尽最大可能避免使用;
 

你可能感兴趣的:(物联网)