评价程序优劣的因素1)正确性,容错性。程序设计过程与基本设计方法1)模块化;结构化;自顶而下与自底而上。4)从原理到程序实现:原理→模型→算法→流程→程序设计→调试→优化→验证→建档。常用的程序调试方法1)原则:先硬后软;先局部,后整体。程序的优化与文件编制1)参照评价因素,修改程序结构、数据结构、算法及程序等。5)使用说明功能、操作方法、出错信息与排除方法、注意事项等。......
2023-10-28
在Keil软件中输入如下C代码:
这是控制P2.0发光二极管闪烁的C源码,这个源码在KeiluVision4生成的程序代码是67个字节,如图6-1所示,图中code=67说明上述C代码编译后为67个字节。而这67个字节是编译后按照汇编语言的字节数进行计算的,如图6-2所示。下面就采用几种方法来提高这个程序的效率。
图6-1 编译结果1
图6-2 反汇编结果
(1)尽量定义局部变量
单片机程序的全局变量一般是放在通用数据存储器(RAM)中,而局部变量一般是放在特殊功能寄存器中。上述C程序的执行状态如图6-3所示。图中的箭头指向下一条将要执行的指令。在Delayms(500)中i、j都为局部变量,因此放在寄存器中;Delayms(500)执行后j=120,由图6-3左边部分可知r3=Ox78=120,因此i保存在r3中;r4r5=OxOlf4=500,因此i保存在r4r5中。
图6-3 程序执行状态
处理寄存器数据的速度比处理RAM数据要快,如果在一个局部函数里调用一个全局变量将会多生成代码。所以,少定义全局变量,多定义局部变量。如上述C代码中,如果把延时函数里的i和j定义为全局变量,编译后程序代码会增加到79个字节,多了12个字节,如图6-4所示。
(2)省略函数定义
在一个单片机程序里我们习惯在main函数的前面先定义被调用函数,然后在main函数的下面再实现被调用函数。这样的写法固然是一个好习惯,但每定义一个函数会增加代码,而且函数形参数据类型越大,形参越多,增加的代码就越多。如果不定义,编译器又报错。由于C编译器的编译顺序是从上往下编译,只要被调用的函数在主调函数调用之前实现就没有问题了。所以,优化的写法是不用定义函数,但要按先后顺序(被调用函数一定要在主调函数之前写好)来写函数实现,最后再写main函数。这样做编译器不但不会报错,而且代码得到精简。如上述C代码中,把延时函数的定义删除了,然后把延时函数的实现搬到main函数的上面,编译后程序代码减少到63个字节,减少了4个字节,如图6-5所示。
图6-4 编译结果2
图6-5 编译结果3
(3)省略函数形参
函数带形参,是为了在函数调用时传递实参,不但可以避免重复代码出现,还可以通过传递不同的实参值多次调用函数且实现不同的函数功能,总体代码也会得到精简。在实际编程时,我们只要稍加注意,还可以进一步精简代码。对于不是多次调用或者多次调用但实参值不变的函数,可以省略函数形参。如上述C代码中的延时函数,把它改写成不带形参的函数:
编译后,程序代码变成56个字节,精简了11个字节,如图6-6所示。
(4)改换运算符(www.chuimin.cn)
在第(2)步的基础上进行修改。
C运算符的运用也会影响程序代码的数量。如上述C代码中,把延时函数里的自加运算符改成自减运算符后,即
编译后,程序代码变成65个字节,精简了2个字节,如图6-7所示。
图6-6 编译结果4
图6-7 编译结果5
(5)选择合适的数据类型
在第(2)步的基础上进行修改。
C语言里选择变量的数据类型很讲究,变量的数据类型过小满足不了程序的要求,过大则会占用太多的RAM资源。数据类型定义也影响程序代码的大小,而且这个影响还比较大。如上述C代码中,延时函数里的局部变量j定义的数据类型明显偏大,如果把它由unsigned int改成unsigned char,编译后,程序代码变成55个字节,精简了12个字节,如图6-8所示。
(6)直接嵌入代码
在程序里如果某个函数只调用一次,而又要求代码提高执行速度,建议不要采用调用函数的形式,而应该将该函数里的代码直接嵌入主调函数里,代码执行效率会大大提高。
(7)使用效率高的C语句
C语言里有一个三目运算符“?”,俗称“问号表达式”。很多程序员都很喜欢使用,因为它逻辑清晰、表达简洁。例如,c=(a>b)?a+1:b+1;实际上等效于以下的if...else结构:
图6-8 编译结果6
可以看到,使用问号表达式,语句相当简洁,但执行效率很低,远没有if...else语句效率高。所以,当程序要求提高执行速度时,建议不要使用问号表达式。
另外,do-while语句也比while语句的效率高。
代码的效率问题,不是编程中的主要问题,除了程序要求较高的执行速度或者单片机的ROM和RAM不够用时才会考虑。一般情况下,还要兼顾其他问题。如果仅追求高效率的代码,可能会影响代码的可读性和可维护性。
有关51单片机案例笔记的文章
评价程序优劣的因素1)正确性,容错性。程序设计过程与基本设计方法1)模块化;结构化;自顶而下与自底而上。4)从原理到程序实现:原理→模型→算法→流程→程序设计→调试→优化→验证→建档。常用的程序调试方法1)原则:先硬后软;先局部,后整体。程序的优化与文件编制1)参照评价因素,修改程序结构、数据结构、算法及程序等。5)使用说明功能、操作方法、出错信息与排除方法、注意事项等。......
2023-10-28
汇编程序如下:第2条指令执行后,如图4-5所示,内部RAM中15H单元的内容已送入R6中;继续执行第3条指令,结果显示与图4-4相同。图4-13 任务2存储器窗口显示5上述程序需要说明的是:1)由于PUSH指令不能寄存器寻址,即R2不能压栈弹栈,因此压栈弹栈操作需对直接地址02H操作。图4-14 任务3存储器窗口显示12)解法2。分析:64H的无符号数和有符号数表示见表4-4。表4-5 64H+64H的CY和OV结果按照PSW定义,由图4-16可知运算后PSW为00000101B。......
2023-10-28
2)控制端低电平时,接地端MOS管截止,使非接地端MOS管漏极开路,输出“1”时须外接上拉电阻,最小系统作准双向I/O口用。P2口特点1)控制端高电平时,作为高8位地址输出口。表7-1 P3口第2功能3)对应特殊功能寄存器地址B0H。......
2023-10-28
AT89S51是单片机的一种型号,这种型号下有DIP、PLCC、TQFP等封装。DIP封装的芯片从芯片插座上插拔时应特别小心,以免损坏引脚。51单片机的DIP封装如图2-8所示。图2-8 51单片机的DIP封装a)器件外观 b)器件外观及尺寸图2-8 51单片机的DIP封装(续)c)电路符号 d)焊接剖面51单片机的PLCC封装如图2-9所示。4)芯片面积与封装面积之间的比值较小。......
2023-10-28
硬件设计一个嵌入式系统的硬件电路设计包括三部分内容:单片机芯片的选择、单片机系统扩展、系统配置。2)系统的扩展与外设配置的水平应充分满足应用系统当前的功能要求,并留有适当余地,便于以后进行功能的扩充。4)整个系统中相关的元器件要尽可能做到性能匹配。2)各功能程序实现模块化、系统化。4)运行状态实现标志化管理。软件抗干扰是计算机应用系统提高可靠性的有力措施。......
2023-10-28
AT89S51是一款低功耗、高性能CMOS 8位单片机,可反复擦写1000次的Flash只读程序存储器。中断控制系统 89S51单片机具有5个中断源,两个中断优先级的中断控制系统,以满足控制应用的需要。时钟电路为单片机产生时钟脉冲序列。本设计中单片机的最小系统设计如图17-2所示。当其输出为1时,光耦合器6N137的OUTPUT脚输出为高电平。当其输出为1时,报警系统关闭。......
2023-11-04
图3-4 焊接的操作姿势a)握笔法 b)正握法 c)反握法焊接步骤1)准备焊接。如焊丝中已加了焊剂,则不需要在焊接时另加焊剂。注意加热时烙铁和焊件采用面接触,不要用烙铁对焊件施加压力。2)查看是否有连焊、焊点是否拉尖的现象。6)焊接部位有无热损伤和机械损伤现象。在外观检查中发现有可疑现象时,采用手触检查。......
2023-10-28
◎内容提要本章讲述MCS-51单片机的C51程序的基础知识,主要包括C51数据类型及存储类型、C51运算符及其表达式、C51流程控制语句、C51构造数据类型、C51指针的定义及使用、C51函数的定义及使用和预编译的用法。◇C51函数的定义、调用及使用时应注意的事项。※重点及难点◇C51存储类型和存储模式的区别。◇C51函数中参数的传递问题。教学目标:掌握MCS-51单片机的C51程序设计的基础知识。通过编程实例,快速掌握C51程序设计的思路和方法。......
2023-11-17
相关推荐