2007-1-25 19:07:00 ARM的C语言程序优化
- 数据类型
- 存放在寄存器中的局部变量(尤其是循环变量)应尽可能使用32位数据类型int(=long),8位变量不节省任何空间和时间;
- 即使传输一个8位数据,函数参数和返回值使用32位类令会更有效;
- 能用指针递增寻址就不用数组下表递增寻址a=data[i++]不如a=*(data++);
- 除法运算使用无符号数更快;
- 存放在存储器中的数组和全局变量,尽可能使用小尺寸数据类型;
- short型数组尽量避免使用数组基地址的偏移量,因为LDRH指令不支持偏移寻址;
- 存储器变量和寄存器变量相互赋值时使用显式类型转换,其他情况下避免不必要的类型转换;
- 循环结构
- 采用减计数循环比增计数循环更好,终止条件尽量写 i != 0 ;循环变量起始值是变量且不等于0的情况下用do-while循环更优(终止条件在后);
- 若循环体过于简单,比如少于4个周期,可展开循环体(重复写几遍循环体代码),以免循环体代码还不如循环本身执行周期长;
- 尽量限制函数内部循环所用局部变量的数据,最多不要超过12个,这样编译器就可以把他们都分配给ARM寄存器;
- 函数调用
- 尽量限制函数的参数,不要超过4个。可以将几个相关参数组织在一个结构体中;
- 把较小的被调函数和调用函数放在一个文件中,并先定义再调用;
- 对性能影响较大的重要函数可使用_inline进行内联;
- 指针别名
- 建立一个新的局部变量来保存包含存储器访问的表达式,这样可以保证只对这个表达式求一次值,例如int a=data[n];b+=a;c+=a; 比b+=data[n];c+=data[n];好
- 避免使用局部变量的地址,否则对这个变量的访问效率会比较低;
- 结构体安排
- 结构体元素要按照元素从小到大排序;
- 避免使用很大的结构体,可以用层次化的小结构体来代替;
推荐阅读
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- 嵌入式-外设|DDR3基础详解
- ffmpeg|从零开始仿写一个抖音App——基于FFmpeg的极简视频播放器
- #|Multimedia
- USB转串口|USB转四串口芯片CH9344
- python|Python的DEBUG LOG
- linux|【原创】ARM LINUX 外部RTC实时时钟驱动移植(RX8025)
- linux进程通信(一)--共享内存+信号量,代码示例
- C|堆和栈