C51编译器能从C程序源代码产生高度优化的代码,而通过一些编程上的技巧又可以帮助编译器产生更好的代码。如何编写高效的C语言程序,通常应按下面技巧来编程:
(1)尽可能定位变量在内部存储区。经常访问的数据对象放入在片内数据RAM中,这可在任一种模式(COMPACT/SMALL)下用输入存储器类型的方法实现。访问片内RAM要比访问片外RAM快得多。片内RAM由寄存器组、位数据区、栈和其他由用户用“data”类型定义的变量共享。由于片内RAM容量的限制(128~256字节,由使用的处理器决定),必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。
(2)尽可能使用“char”数据类型。MCS-51系列单片机是8位机,因此对具有“char”类型的对象的操作比“int”或“long”类型的对象方便得多。建议编程者只要能满足要求,应尽量使用“char”这种最小数据类型。C51编译器直接支持所有的字节操作,因而如果不是运算符要求,就不作“int”类型的转换,这可用一个乘积运算来说明,两“char”类型对象的乘积与MCS-51的操作码“MUL AB”刚好相符。如果用整型完成同样的运算,则需调用库函数。
(3)尽可能使用“unsigned”数据类型。MCS-51单片机的CPU不直接支持有符号数的运算,因而C51编译必须产生与之相关的更多的代码以解决这个问题。如果程序中不需要负数而采用无符号“unsigned”类型,则产生的代码要少得多。
(4)尽可能使用局部函数变量。由于编译器在内部存储区中为局部变量分配存储空间,而在外部存储区中为全局变量分配存储空间访问全局变量的速度要慢,因此应该尽可能使用局部变量。如将索引变量(如FOR和WHILE循环中计数变量)声明为局部变量是最好的。
(5)避免使用浮点指针。在8位的51单片机上使用32位浮点数会浪费大量的时间,所以在程序中声明浮点数时,要慎重是否确实需要这种数据类型。可以通过提高数值数量级和使用整型运算来消除浮点指针。当不得不在程序中加入浮点指针时,代码长度会增加,程序执行速度也会比较慢。(www.xing528.com)
(6)使用位变量。对于某些标志位,应使用位变量而不是unsigned char型变量,这将节省7位存储区,节省内存,而且在RAM中访问位变量只需一个周期,但应用变量时,应注意,位变量不能定义成一个指针,不存在位数组。
(7)使用特定指针。在程序中使用指针时,应指定指针的类型,确定它们指向哪个区域(如XDATA或CODE区),这样编译器就不必费时确定指针所指向的存储区,所以代码也会更加紧凑。
(8)使用宏替代函数。对于小段代码,如使用某些电路或从锁存器中读取数据,可通过宏来替代函数,以使程序有更好的可读性,也可以把代码声明在宏中,这样看上去更像函数。
(9)避免复杂的运算。在C51中乘、除、求模、浮点运算都是通过调用库函数来实现,调用库函数可以使编程比较方便,但也会带来一些问题,如可能在对时间要求比较严格时它们用的时间太长;或者在对代码长度要求严格时,它们编译生成的代码太长。因此,应尽量使用左移和右移完成乘除法运算,用逻辑运算符代替求模运算符完成取模运算,从而节省时间和缩短代码长度。
(10)其他。认真考虑编程的细节和操作的次序,尽量采用子程序的办法提高效率,用switch case语句产生的代码要比if语句多,因此当规模很大时候尽量避免用switch case语句。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。