如何提高单片机C语言代码效率
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} 编译后,程序代码变成了 65 个字节,精简了 2 个字节。 通过改换运算符能达到精简代码的例子还有: 1.把求余运算表达式改为位与运算表达式。如:b=a%8 可以改为:b=a&7。 2.把乘法运算表达式改为左移运算表达式。如:b=a*8 可以改为:b=a<<3。 3.把除法运算表达式改为右移运算表达式。如:b=a/8 可以改为:b=a>>3。 五.选择合适的数据类型 C 语言里选择变量的数据类型很讲究,变量的数据类型过小满足不了程序的 要求,变量的数据类型过大会占用太多的 RAM 资源。您可能还没有注意到 数据类型定义也影响程序代码的大小,而且这个影响还不小。如上例中, 延时函数里的局部变量 j 定义的数据类型明显偏大,如果把它由 unsigned i nt 改成 unsigned char 。编译后,程序代码变成了 59 个字节,精简了 8 个 字节。 六.直接嵌入代码 在您的程序里如果某个函数只调用一次,而您又要求代码提高执行速度, 建议您不要采用调用函数的形式,而应该将该函数里的代码直接嵌入主调 函数里,代码执行效率会大大提高。 七.使用效率高的 C 语句
摘要: 代码效率包括两个方面内容:代码的大小和代码执行速度。如果代码精简
和执行速度快,我们就说这个代码效率高。一般情况下,代码精简了速度也相应
提上来了。单片机的 ROM 和 RAM 的空间都很有限,当您编程时遇到单片机的
RO ...
代码效率包括两个方面内容:代码的大小和代码执行速度。如果代码精简 和执行速度快,我们就说这个代码效率高。一般情况下,代码精简了速度 也相应提上来了。单片机的 ROM 和 RAM 的空间都很有限,当您编程时遇 到单片机的 ROM 和 RAM 的不够用的时候,或者您的程序要求较高的执行 速度时,我们就得面对解决代码效率问题了。如何提高代码效率?现笔者 以一个 LED 闪烁的程序为例与您探讨。 #i nclude<reg52.h>//包含头文件 sbit led=P2^0;//定义位变量 led,使其关联单片机管脚 P2.0 void Delayms(unsigned int t);//定义延时函数 int main(void)//主函数(C 语言程序入口函数) { while(1) { led=0;//P2.0 拉低,点亮 LED Delayms(500);//调用延时函数,延时 500 毫秒 led=1;//P2.0 拉高,熄灭 LED Delayms(500);//调用延时函数,延时 500 毫秒 } return 0; } void Delayms(unsigned int t)//延时函数 { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<120;j++);//大约延时 1 毫秒 } 这是指示灯 LED 闪烁的 C 源码,这个源码在 Keil uVision4 生成的程序代 码是 67 个字节。下面我们就采用几个方法来提高这个程序的效率。 一.尽量定义局部变量 单片机程序的全局变量一般是放在通用数据存储器(RAM)中,而局部变 量一般是放在特殊功能寄存器当中。处理寄存器数据的速度比处理 RAM 数
据要快,如果在一个局部函数里调用一个全局变量将会多生成好几个代码 出来。所以,少定义全局变量,多定义局部变量。如上例中,如果把延时 函数里的 i 和 j 定义为全局变量,编译后程序代码会增加到 79 个字节,多 了 12 个字节。 二.省略函数定义 在一个单片机程序里我们习惯在 main 函数的前面先定义被调用函数,然后 在 mian 函数的下面再实现被调用函数。这样的写法固然是一个好习惯,但 每定义一个函数会增加几个代码,而且函数形参数据类型越大、形参越多 增加的代码就越多,显然这不是什么好事。如果不定义编译器又报错,怎 么办?C 编译器的编译顺序是从上往下编译,只要被调用的函数在主调函数 调用之前实现就没有问题了。所以,笔者的习惯写法是不用定义函数,但 要按先后顺序(被调用函数一定要在主调函数之前写好)来写函数实现, 到最后再写 main 函数。这样做编译器不但不会报错,而且代码得到精简了。 如上例中,把延时函数的定义删除了,然后把延时函数的实现搬到 main 函 数的上面,编译后程序代码减少到 63 个字节,减少了 4 个字节。 三.省略函数形参 函数带形参,是为了在函数调用时传递实参,不但可以避免重复代码出现, 还可以通过传递不同的实参值多次调用函数且实现不同的函数功能,总体 代码也会得到精简。在实际编程的时候,我们只要注意,还可以进一步精 简代码。对于不是多次调用或者多次调用但实参值不变的函数我们可以省 略函数形参。如上例中的延时函数,我们把它改成不带形参的函数: void Delayms()//延时函数 { unsigned int i,j; for(i=0;i<500;i++) for(j=0;j<120;j++);//大约延时 1 毫秒 } 编译后,程序代码变成了 56 个字节,精简了 11 个字节。 四.改换运算符 也许您可能没有注意到 C 运算符的运用也会影响程序代码的数量。如上例 中,把延时函数里的自加运算符改成自减运算符后,如: void Delayms(unsigned int t)//延时函数 { unsigned int i,j; for(i=t;i>0;i--) for(j=120;j>0;j--);//#p#分页标题#e#大约延时 1 毫秒
C 语言Fra Baidu bibliotek有一个三目运算符“?”,俗称“问号表达式”。很多程序员都很喜
欢使用,因为它逻辑清晰表达简洁。 看这个问号表达式:c=(a>b) ? a+1 : b+1;实际上等效于以下的 if…else 结 构: if (a>b) c=a+1; else c=b+1; 可以看到,使用问号表达式,语句相当简洁,但它的执行效率却很低,远 没有 if…else 语句效率高。所以,当您的程序要求提高执行速度的话,建议 您不要使用问号表达式了。 另外,do…while 语句也比 while 语句的效率高。 代码的效率问题,不是我们编程中的主要问题,除了程序要求较高的执行 速度或者单片机的 ROM 和 RAM 不够用的时候才会考虑。一般情况下,我 们不用在乎。如果您一味追求高效率的代码,可能会影响代码的可读性和 可维护性。