欢迎来到天天文库
浏览记录
ID:20519108
大小:28.00 KB
页数:7页
时间:2018-10-12
《如何编写高效率稳定的单片机代码》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、由于单片机的性能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法与之比较的。PC机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。对于单片机来说就截然不同了,一般的单片机的Flash和Ram的资源是以KB来衡量的,可想而知,单片机的资源是少得可怜,为此我们必须想法设法榨尽其所有资源,将它的性能发挥到最佳,程序设计时必须遵循以下几点进行优化:1.使用尽量小的数据类型能用unsiged就不用signed;能用char就不用int;能不用floating就不用。能用位操作不用算数。2.使用自加、自减指令通常使用自加、自减指令和复合赋值表达式(如
2、a-=1及a+=1等)都能够生成高质量的程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令。3.减少运算的强度可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。(1)求余运算N=N%8可以改为N=N&7说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n方的余数,均可使用位操作的方法来代替。(2)平方运算N=Pow(3,2)可以改为N=3*3说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多,因为
3、浮点数的求平方是通过调用子程序来实现的,乘法运算的子程序比平方运算的子程序代码短,执行速度快。(3)用位移代替乘法除法N=M*8可以改为N=M<<3N=M/8可以改为N=M>>3说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。如果乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果。如N=M*9可以改为N=(M<<3)+M;(4)自加自减的区别例如我们平时使用的延时函数都是通过采用自加的方式来实现。voidDelayNms(UINT16t
4、){UINT16i,j;for(i=0;idefineMAX(A,B){(A)>(B)?(A):(B)}说明:函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,cpu也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些cpu时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。1.适当地使用算法假如有一道算术
5、题,求1~100的和。作为程序员的我们会毫不犹豫地点击键盘写出以下的计算方法:UINT16Sum(void){UINT8i,s;for(i=1;i<=100;i++){s+=i;}returns;}很明显大家都会想到这种方法,但是效率方面并不如意,我们需要动脑筋,就是采用数学算法解决问题,使计算效率提升一个级别。UINT16Sum(void){UINT16s;s=(100*(100+1))>>1;returns;}结果很明显,同样的结果不同的计算方法,运行效率会有大大不同,所以我们需要最大限度地通过数学的方法提高程序的执行效率。2.用指针代替数组在许多种情况下,可以用指针运算代替数组索引,这
6、样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。UINT8szArrayA[64];UINT8szArrayB[64];UINT8i;UINT8*p=szArray;for(i=0;i<64;i++)szArrayB[i]=szArrayA[i];for(i=0;i<64;i++)szArrayB[i]=*p++;指针方法的优点是,szArrayA的地址装入指针p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须进行基于i值求数组下标的复杂运算。3.强制转换C语言精髓第一
7、精髓就是指针的使用,第二精髓就是强制转换的使用,恰当地利用指针和强制转换不但可以提供程序效率,而且使程序更加之简洁,由于强制转换在C语言编程中占有重要的地位,下面将已五个比较典型的例子作为讲解。例子1:将带符号字节整型转换为无符号字节整型UINT8a=0;INT8b=-3;a=(UINT8)b;例子2:在大端模式下(8051系列单片机是大端模式),将数组a[2]转化为无符号16位整型值。方法1:采用位移方法。
此文档下载收益归作者所有