嵌入式系统编程怎么实现性能优化?
内容提要
在C语言中,宏是生成内嵌代码的唯一方式,但要注意可能产生副作用。寄存器变量和内嵌汇编可以提高程序效率。利用硬件特性和位操作也是提高程序效率的方法。除了编程技巧外,还可以利用硬件设备自身的特点来减小运转开销。
延伸解读
宏定义:效率与风险的权衡
宏在嵌入式C中能避免函数调用开销,但本质是文本替换,容易因参数副作用或缺少括号导致意外结果。例如MIN(*p++, b)展开后可能多次递增指针。因此,使用宏时必须将参数和整体表达式用括号括起,并避免传递带副作用的参数。在追求性能的同时,需谨慎权衡宏带来的可读性和安全性问题。
寄存器变量:建议而非保证
register关键字只是向编译器建议将变量放入寄存器,以加快频繁读写的速度。它仅适用于局部自动变量和形参,不能用于全局或静态变量。实际是否生效取决于编译器及寄存器资源,未生效时也不会报错。因此,寄存器变量可作为优化手段,但不应依赖其必然提升性能。
内嵌汇编:针对热点代码的利器
内嵌汇编能显著提升时间关键代码的速度,但开发和测试成本高,可移植性差。根据80-20原则,应只对消耗80%运行时间的那20%代码进行汇编优化。在C中可通过_asm{}插入汇编语句,但需注意与C变量的交互及编译器差异。滥用汇编可能得不偿失。
硬件特性与位操作:系统级优化
利用硬件特性可减少运转开销:将代码从FLASH/ROM拷贝到RAM执行以提高取指速度;对UART等设备,待其缓冲区满再中断,避免频繁中断;大数据量传输采用DMA,减少CPU干预。位操作则能替代乘除和取模运算,并广泛用于硬件寄存器的位设置与判断,是嵌入式编程的常用技巧。
Q&A
在嵌入式C编程中,使用宏定义有哪些需要注意的地方?
宏定义类似于函数,但不是函数,因此需要将所有参数括起来,并且可能会产生副作用。不要将具有副作用的参数传递给宏定义,否则展开后可能导致不可预料的结果。
寄存器变量在什么情况下能提高程序效率?
当变量被频繁读写时,使用寄存器变量可以避免反复访问内存,直接从CPU寄存器读写,从而提高效率。只有局部自动变量和形参可以定义为寄存器变量,循环控制变量和循环体内反复使用的变量是很好的候选。
内嵌汇编在嵌入式性能优化中有什么优缺点?
内嵌汇编可以显著提高程序速度,尤其对时间要求苛刻的部分。但开发和测试汇编代码比较辛苦,花费时间更长,因此要慎重选择使用汇编的部分。
如何利用硬件特性来优化嵌入式系统性能?
可以了解CPU对存储器的访问速度(内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM),将代码从FLASH/ROM拷贝到RAM中执行以提高取指令速度;对于UART等设备,尽量在BUFFER满后再中断;对能采用DMA方式的设备使用DMA读取,减少CPU干预,提高并行操作程度。
位操作在嵌入式编程中有哪些应用?
位操作可以减少除法和取模运算,例如将以2的指数次方为因子的乘除取模转化为移位运算,提高效率。此外,位操作广泛用于硬件寄存器的位设置和判断,如通过与、或、非操作来设置或检查寄存器的特定位。
嵌入式性能优化中的80-20原则是什么?
80-20原则指20%的程序消耗了80%的运行时间,因此优化时应重点关注那20%的代码,不要浪费时间优化开销不大的80%部分。