王磊 李鑫
摘要:针对嵌入式系统的特点,介绍了几种在嵌入式系统程序设计中优化C语言代码的方法,从而提高系统的性能。
关键词:C程序设计;程序优化;代码优化
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)01-0192-02
Analysis of the Embedded Program Optimization
WANG Lei, LI Xin
( Xian University of Architecture and Technology, Xian 710055, China)
Abstract: According to the characteristics of embedded system, the paper introduced ways of C language code optimization in embedded system design so as enhance the performance of the system.
Key words: C program design; process optimization; code optimization
随着数字信息技术和网络技术高速发展嵌入式系统已经广泛渗透到科学研究领域、各类产业和商业文化艺术以及人们的日常生活中,嵌入式计算机是完成某些特定功能的计算机系统,并且软硬件可裁剪。具有形态和性能更加小型化,多功能,低功耗等特点,已成为当今计算机技术发展的一个重要标志!
程序优化是指对解决同一问题的几个不同的程序,进行比较、修改、调整或重新编写程序,把一般程序变换为语句最少、占用内存量少、处理速度最快、外部设备分时使用效率最高的最优程序。
1嵌入式程序优化遵循的原则
嵌入式程序优化主要有以下3个原则:
①等效原则:实现的功能需一致。
②有效原则:使得运行速度快或占用存储空间小,或兼得。③经济原则:要付出较小的成本。
2嵌入式程序优化的主要实施方法
分别为:算法优化、编译优化以及代码优化。
2.1算法优化
选择和构造适合于问题的算法;(冒泡排序还是快排的选择问题是这一级早就应该完成的)很多经典算法都对问题作了一些假设(包括我们当前已经完成的算法实现),而在面对实际问题时我们应该重新检视这些假设,并尝试不同的思考问题的角度,寻求适合于问题的新算法;发掘问题的本来意义,从不同的角度思考面对的问题,使用适合于问题的的算法;尝试打破一些规则,发掘和怀疑自己的某些假定,恢复问题的本来面目。
2.2编译优化
目前很多编译器都可实现代码优化功能,且提供的代码也很紧凑。使用编译器,能得到性能不错的代码。然而,机器不能像人类那样有创造性。所以,我们还需要手工来做一些事情。C语言代码的优化是很难,且很需要技巧的工作。大部分编译器可以生成为处理器进行过特殊优化处理的代码,如果进行修改,会造成特殊优化的破坏导致失效。所以,在决定优化代码之前,一定要测试一下,是自己的代码更好还是编译器生成的代码好。
在嵌入式软件开发过程中应挑选优化能力较强的编译器,使其发挥代码优化功能,来生成高效的代码,提高程序的运行效率。
2.3代码优化
1)变量的处理
编程过程中,解决初始化的问题,最好使用英文单词的缩写来代表变量。用缩写的好处可以加快程序的运行速度并减少占用的内存。再一个就是变量类型的选取,选取的范围越小也可以提高运行速度和降低内存的占有,不过算术运算时容易产生溢出。
函数调用越频繁时,为提高代码的效率,可以把声明的局部变量通过编译器放入寄存器中,而不是放入堆栈。
变量值很大,要使用变量作返回值,会很费时间。使用参数作为返回值时间上会快些,因为没有变量返回的复制时间的问题。但安全性上和函数重复使用上差,因为参数返回破坏了参数值。最好在编译时,小的变量用指针返回,小的常量用变量返回,大的常量用参数或静态方法返回。还有就是使用全局变量比函数传参数效率更高,不过要牺牲程序的重入和模块化,它是因为节约了参数入栈和出栈的时间。
2)适当的使用宏
在嵌入式系统中,使用宏代替函数的方法来满足性能要求,是在传递参数较多而函数较短的情况下不错的选择。对宏的使用和定义需要谨慎,它可以实现类似函数的功能,又不像函数需要调用返回的好方法,它实质上并不是函数,需要考虑到展开后难以预料的结果。
如果宏的参数是复合结构,因为它只是简单的替换,这里就要考虑操作符的优先级问题,单个参数内部各部分之间相互作用的操作符优先级低于各个参数之间的操作符优先级,在替换之后,我们需要括号保护宏参数,否则会产生预想不到的情形。如果宏的参数是一个函数,展开时会对其参数多次取值,那么就有可能被调用多次从而达到不一致的结果,并有可能产生严重错误。
3)数组的处理
(1)数组在使用前需要对其先初始化。数组的范围在初始化时空着不添,在执行时将由数组自动加入,可以提高程序的运行速度。由于事先定义的范围可能过大,造成存储的浪费。
(2)大部分情况下,数组索引用指针运算来替换,可以得到既快又短的代码。指针运算一般占用空间少,运行速度更快。尤其是使用多维数组时效果更明显。
一下是两段作用相同,效率不同的代码:
数组索引指针运算
for(;;){p=array
a=array[s++];for(;;){
……a=*(p++);
……
}}
指针方法的优点就是array的地址每次装入地址p后,每次循环中,只需对p增量操作。在数组索引方法中,每次循环中都必须进行基于s值求数组下标的复杂运算。
4)避免使用除法
ARM指令集没有整数除法指令,通常除法指令由C语言库中的函数执行。对于不同的分子和分母,一个32位除法通常需要20至140个时钟周期,执行除法函数的时间由一个固定时间加上每一位相除的时间。
由于除法操作较费时,所以应该避免使用除法。我们知道,除法运算是乘法运算的逆运算,可通过改变表达式,把除法运算改成乘法运算。因为无符号数除法的速度要高于有符号数的除法,如果其中有一个是无符号操作数最好使用无符号除法指令。
5)使用合适的数据类型
采用尽可能小的数据类型:可以用字符型定义的变量,就不要拿整型来定义,能拿整型定义的就不要拿长整型来定义,能不拿浮点型就不要拿浮点型来定义。当然,一定要防止“溢出”现象,若超过变量的取值范围后,系统并不会给出“出错信息”,要靠我们的细心和经验来确保结果的正确。
在确定表达式是float型和浮点型变量需注意:许多C编译器把实型常量视为双精度处理,降低了运算速度换来了更精确的结果,所以我们最好用“.F”、“.f”为后缀及在函数声明时使用float型。使用有符号整型变量时,要考虑是否有必要使用有符号的变量,一些情况下,有符号的运算比较快,但有时却相反。例如:把整型转化为浮点型时,用大于16位的有符号整型比较快。因为x86构架中没有提供从无符号整型转化到浮点型的指令,因为在整数运算中需计算商和余数,所以用无符号类型比较快。
6)使用寄存器变量
当一个变量被频繁读/写时,要花费许多存取时间,反复访问内存。可以使用CPU寄存器变量来提高效率,它可以直接进行读/写,不需要访问内存。循环体内反复使用的变量和循环次数较多的循环控制变量都可定义为寄存器变量。静态存储方式的变量都不能定义为寄存器变量,因为寄存器变量属于动态存储方式,所以只有局部自动变量和形参才可以定义为寄存器变量。寄存器变量的说明符是register。下面是一个采用寄存器变量的例子:
register i,sum=0;
for(i=1;i<=n;i++){
sum= sum+i;
…
}
7)If函数
在条件语句的判别中,先执行前面的判别,如果条件不满足再执行后面的判断。最好将出现可能性最大的条件放在前面。假如x数值为0-99中的任何一个数,并且概率相同。
if(x>10){ int x=11;}
else if(x<10){ int x=9;}
else (x==10){ int x=10;}
以上程序,当产生的x数值在10-99之间时(可能性最大),满足第一个条件后计算机就直接从上述程序中返回而不再执行第二和第三个判别了,节省了运行的时间。
8)Switch语句中根据发生频率来进行case排序
Switch语句是一个普通的编程技术,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,发现匹配时,就跳转到满足条件的语句执行。使用时要留意,每一个测试和跳转只是为了决定下一步要做什么,很浪费处理时间。为提高效率,可以把最可能发生的情况放在第一位,最不可能的情况放在最后。
9)使用布尔表达式
在C语言中,使用布尔表达式可以用来对变量是否在一定范围内进行检查。例如布尔表达式x>=min&&x 3结论 嵌入式程序的性能优化与软件的开发周期、开发成本、软件的可读性之间通常存在矛盾。在编程时,应尽量优化自己的程序,减少不必要的运算,如果有多种编程方式可完成同一功能,应尽量选择一种使程序最简洁,高效的方法。 参考文献: [1]刘锋,张晓林.浅析嵌入式程序设计中的优化问题[J].单片机与嵌入式系统应用,2006(12). [2]王翠娥.浅析嵌入式C程序设计的优化[J].信息与电脑(理论版),2009(12). [3]刘剑鸣.嵌入式程序设计中C/C++代码的优化[J].微计算机信息,2003(12). [4]金丽,包志华,陈海进.基于ARM嵌入式系统的C程序优化设计方法[J].南通大学学报:自然科学版,2006(3). [5]曾振河.在ARM实时系统中提高程序执行的效率[J].漳州职业技术学院学报,2008(1). [6]潭浩强.C程序设计[M].2版.北京:清华大学出版社,1999. [7]陈波,石旭刚,史故臣.嵌入式C语言在系统开发中的代码优化[J].计算机时代,2008(11). [8]王军安.浅析嵌入式系统的软件优化设计[J].计算机工程与应用,2004(3). [9]覃征,王志敏,王向华,等.程序设计方法与优化[M].西安:西安交通大学出版社,2004.