崔晓康+高润秋+王芮+袁明芊+仵松颀 【摘 要】随着人们对嵌入式应用性能需求的提高,嵌入式程序的运行效率逐渐得到关注。本文根据嵌入式系统的特点与应用环境,从四个方面提出了基于C语言的嵌入式程序设计优化方法,提高了嵌入式程序的性能,对嵌入式程序设计开发人员具有借鉴价值。 【关键词】嵌入式系统;程序设计优化;性能 随着经济和技术的发展,嵌入式系统得到了快速的发展,低功耗、低成本、低体积,而且高性价比。这些优点使得其得到了广泛应用,大到航天领域,小到智能终端领域。尽管嵌入式系统发展迅速,但嵌入式微处理器相对于桌面级的处理器而言存在一定的差距。这就使得嵌入式系统对运行在嵌入式微处理器上的程序有相对苛刻的要求,特别是运行时间和空间方面的要求。因此,对运行在嵌入式系统中的程序进行优化,可大大降低嵌入式系统的功耗,从而提高运行时间,而且可以提高程序的运行效率,满足嵌入式程序对性能方面的需求。本文将就如何对嵌入式程序进行优化展开讨论。 一、嵌入式系统 嵌入式系统即控制、监视或者辅助装置、机器和设备运行的装置。根据该定义可知,嵌入式系统是硬件和软件的综合体,而且包含机械等装置。 嵌入式系统以微处理器及软件为核心部件,具有方便、灵活地嵌入到其他应用系统的特征,本身也是可执行的独立系统。 以微处理器类型划分的化,嵌入式系统可以分为以单片机为核心的嵌入式单片机系统、以工业计算机板为核心的嵌入式计算机系统、以DSP为核心的嵌入式数字信号处理器系统和以FPGA及软CPU为核心的嵌入式SOPC系统等。 嵌入式程序是嵌入式系统软件的组成,包括系统程序和应用程序。系统程序运行在操作系统核心态,应用程序运行在用户态。近年来,为了更加高效地开发嵌入式程序,广泛采用C语言来进行开发。本文将就C语言设计的程序如何进行优化进行论述。 二、嵌入式程序设计优化 程序优化是指在不改变程序功能的情况下,对程序的结构、代码、算法等进行裁剪、变换、替代等,使得修改后的程序拥有比源程序更优的性能。更优的性能包括两方面的涵义,一是代码量更少、更精简;二是程序运行速度更快,性能开销更低。 运行速度优化是通过对程序的结构、算法等进行修改,采用更加高效的结构和算法来实现同一功能,从而使得程序的运行时间得到所短。代码优化指的是在对应用程序功能不影响的情况下,对冗余代码进行删除、部门程序语句进行替换等实现代码量的减少。 事实上,这两者是一对矛盾体,为了使得程序运行速度更快,往往需要添加额外的优化代码。但随着存储技术的发展,RAM、ROM等不在称为限制程序大小的因素。所以,本文只讨论嵌入式程序运行速度优化问题。 1.嵌入式程序设计优化原则 嵌入式程序设计优化主要遵循的原则包括: (1)等价性原则,优化前后程序的功能是等价的,不能因为代码的变化改变程序的功能; (2)有效性原则,即优化后的程序需要达到预期目的,要么使得程序的运行速度更快,要么使得程序的代码量更少; (3)经济性原则,即对程序优化投入的人力物力要满足以尽量小的代码获得尽量高的收益,即更佳的优化效果。[1] 2.通用优化方法 通用的优化方法主要从语言角度出发对程序进行优化,即对C程序在嵌入式系统上的优化。 (1)循环优化 循环是C语言中常用的一种结构。合理的使用循环能够使得程序功能很强大,但是循环带来的开销是很高的。本文对循环的优化主要采用三种策略。一是使用递减循环。变循环变量递加为递减,可以减少循环终止条件测试的开销,特别是在嵌套循环的情况下,可以取得更好的效果。二是优化循环退出条件。如果循环不能够及时退出,将有可能使得程序多执行多次循环甚至造成死循环。三是对相关循环进行合并,减少循环的个数。将相邻的循环进行合并,合并原则是不会出现变量相关。 (2)函数优化 函数是C程序中最主要的组成,一个程序中包含若干个函数。函数优化从三个方面考虑。一是使用内联函数,减少递归函数的使用。递归虽然使得程序更加简洁,但是递归需要花费更多的时间进行函数调用,而且函数调用时使用堆栈而不是寄存器也使得程序开销更大。二是函数参数的优化设计。这一点是与硬件体系相关的。以ARM为例,函数参数传递先通过寄存器实现,然后再通过堆栈。但是寄存器资源有限,一般为4个。所以在进行函数设计时应尽量讓函数参数小于等于4。三是使用函数值表。通过函数值表,可以减少某些耗时的数学函数带来的时间开销。 (3)变量优化 变量优化主要考虑到全局变量和局部变量[2]。一般减少全局变量的使用,多使用局部变量。除了性能上的考虑,全局变量对程序自身的安全也存在威胁。过多的全局变量还会带来过度的存储空间开销。 (4)内联汇编的使用 内联汇编是指在C/C++代码中嵌入的汇编代码,与全部是汇编的汇编源文件不同,它们被嵌入到C/C++的大环境中。由于内联汇编以汇编代码实现,比C代码效率高。因此,适当的使用内联汇编,对程序的运行速度提高具有一定的促进作用。 3.基于硬件的优化方法 该方法主要使用硬件资源来对程序进行优化。一是使用寄存器变量[3]。寄存器的存取速度远高于内存的存取速度。对一些经常使用的变量,可以通过分配指定寄存器作为其存储单元的方法,在一定程度上提高程序运行效率。另外,对程序优化时候可以考虑CPU的流水线处理,两者相互结合效果更好。 4.基于指令集的优化方法 指令集优化指的是从嵌入式系统支持的指令集角度入手,根据指令集的优缺点进行优化。一是对不包含的指令进行优化。比如除法指令,ARM结构下的指令集并没有。进行除法运算时通过调用库函数来实现,而库函数实现的除法效率低下。因此,对除法进行优化,改成使用乘法指令来实现。二是条件发的合理使用。ARM指令包含有一个条件码,在条件码满足一定条件下执行某种功能。如果要实现的功能与条件码相关,那么利用该条件码可以使得判断更迅速。 5.基于编译器的优化方法 编译器优化主要用来对代码进行语法检查、语句优化以及安全性方面的检查。但高级的编译器可以对程序的运行效率进行优化。比如程序中有一个常量乘法运算,那么在编译之后程序运行之前该乘法运算的结果已经得出。另外,编译器会对循环做优化,通过循环展开,减少比不要的循环;还可以将一些尾递归转换为循环实现,提高效率。 三、结束语 嵌入式系统的广泛使用使得运行之上的程序性能要求更高。本文讨论了嵌入式程序设计优化问题。从通用方法、硬件优化、编译器优化、指令集优化等方法进行了探讨,提出了一些相关优化策略,对提高程序的运行效率具有促进作用。 【参考文献】 [1] 王磊, 李鑫. 浅析嵌入式程序的优化[J]. 电脑知识与技术: 学术交流, 2012, 8(1): 192-193. [2] 刘锋, 张晓林. 浅析嵌入式程序设计中的优化问题[J]. 单片机与嵌入式系统应用, 2006 (12): 66-68. [3] 刘侃, 张永泰, 刘洛琨. ARM 程序设计优化策略与技术[J]. 单片机与嵌入式系统应用, 2004 (4): 70-72.