论文部分内容阅读
摘 要:C语言是嵌入式系统开发中常用的一种程序设计语言.本文结合嵌入式系统的特点,从编程规范、存储器分配和算法优化三个方面,阐述了C语言在嵌入式软件开发中的代码优化方法。
关键词:嵌入式系统;C语言;代码优化
中图分类号:TP202+.7文献标识码:A
The Code Optimization in Embedded Systems Programing with C Language
CHEN Lei,CHEN Zhao-hui
(LuoYang institute of Science and Technology,Henan Luoyang471023)
Key words: embedded system;C language;code optimization
1 嵌入式C语言的特点
尽管嵌人式C语言是一种强大而方便的开发工具,但开发人员如果要达到用C语言快速编出高效而易于维护的嵌人式系统程序,首先必须对C语言编程有较透彻的掌握,其次,还应该对实际电子硬件系统有深人的理解,当然在学习嵌人式C之前,较为熟练地掌握用汇编语言编程是十分必要的。
2 C代码在程序设计中的优化
笔者根据实际开发经验,对如何提高嵌入式C语言在系统开发中的效率浅谈几点体会。
(1)养成良好的、规范化的编程风格,使之符合软件工程的开发要求。使用正规、一致的编程风格十分重要,在变量名的命名规则中,建议使用Hungarian命名法则,再加上模块化的编程方式,详尽的程序说明文档,久而久之,能够大幅度提高编程效率,方便多人分工协作,也适合项目的后期维护,以及重新利用。
(2)适当的使用宏。在C程序中使用宏代码可以提高程序的执行效率。宏代码本身不是函数,但使用起来像函数。函数调用要使用系统的栈来保存数据,同时CPU在函数调用时需要保存和恢复当前的现场,进行进栈和出栈操作,所以函数调用也需要CPU时间。而宏定义就没有这个问题:宏定义仅仅作为预先写好的代码嵌入到当前程序中,不产生函数调用,所占用的仅仅是一些空间,省去了参数压栈、生成汇编语言的call调用、返回参数、执行return等过程,从而提高了程序的执行速度。虽然宏破坏了程序的可读性,使排错更加麻烦,但对于嵌入式系统,为了达到要求的性能,嵌入代码常常是必须的做法。
(3)高效分配存储器。由于成本限制,嵌入式系统存储器容量有限。程序中所有的变量、包含的库函数以及堆栈等都使用有限的内存:全局变量在整个程序范围内都有效,程序执行完后才会释放;静态变量的作用范围也是整个程序,只有局部变量中的动态变量在函数执行完后会释放。因此,在程序中应尽量使用局部变量,提高内存使用效率。程序中堆的大小受限于所有全局数据和栈空间都分配后的剩余量,如果堆太小,程序不能够在需要的时候分配内存。因此在使用malloc函数申请内存之后一定要用free函数进行释放,防止内存泄露。为了提高执行效率,对存储器类型的设定,应该根据以下原则:只要条件满足,尽量先使用内部直接寻址存储器(data),其次设定变量为间接寻址存储器(idata),在内部存储器数量不够的情况下,才使用外部存储器,而且在外部存储器中,优先选择(pdata),最后才是(xdata),而且,在内部和外部存储器共同使用的情况下,要合理分配存储器,对经常使用和计算频繁的数据,应该使用内部存储器,其它的则使用外部存储器。要根据它们的数量进行分配,在例程中,因为内部数据存储器的数量足够,我们在例程中将所有变量都申明为直接数据存储器,这样能使程序访问数据存储器的时间最少,从而提高程序运行效率。
(4)合理设置变量类型以及设置运算模式可以大大减小代码量,提高程序执行效率。
我们以51系列单片机为例。由于51系列是8位机,它只能直接处理8位无符号数的运算,而对其它类型的数据则需通过额外的算法来实现,因此,在对变量进行类型设置时,要尽可能选用无符号的字符类型,尽量少使用有符号以及多字节类型,因此,在程序设计中,都尽量采用无符号数以提高运算速度,以此避免进行多余运算。
在运算时,可以进行定点运算的尽量进行定点运算,避免进行浮点运算。如*2或/2,就可以使用移位操作来代替除法运算。这样不仅可以减少代码量,同时,还能大大提高程序执行效率,例如,对直流信号通常采用一滞后滤波法。它的表达式为:Y。二(1-K)Xo+K*Yo,在这个运算式中,如果将K值取为0. 75,则可以通过移位运算代替浮点运算或多字节的算术运算,从而简小编译后的程序模块,提高程序执行效率。而将K值取为0. 75并不会影响数据滤波的效果。
(5)将汇编程序嵌人嵌人式C程序中,完成实时响应或精确控制任务。
在一些实时性要求很高,如中断程序处理、数据采集程序、实时控制程序以及一些实时的带符号或多位运算中,建议将汇编语言嵌人C程序中进行处理。在KEILC51的C编译系统中,C程序能够与汇编程序实现方便灵活的接口,在C程序中调用汇编十分方便灵活,对二者调用的主要难度在于:实现数据的准确传输,汇编与C中实现数据传输可通过两种方式,一是利用工作寄存器进行数据传送,这种方式安全,但根据传送数据类型的不同,只能传送1个一3个参数,另外一种方案是指定特定的数据区,二者在特定的工作区内进行数据传输,这种方式,其传递数据量可自行控制,但不安全,需要开发人员仔细控制。
参考文献:
[1]马忠梅.单片机的C语言应用程序设计[M].北京:北京航天航空大学出版社,1999.
[2]王东征.嵌入式C语言位操作的移植与优化[J].单片机与嵌入式系统,2007,(2):72-74
关键词:嵌入式系统;C语言;代码优化
中图分类号:TP202+.7文献标识码:A
The Code Optimization in Embedded Systems Programing with C Language
CHEN Lei,CHEN Zhao-hui
(LuoYang institute of Science and Technology,Henan Luoyang471023)
Key words: embedded system;C language;code optimization
1 嵌入式C语言的特点
尽管嵌人式C语言是一种强大而方便的开发工具,但开发人员如果要达到用C语言快速编出高效而易于维护的嵌人式系统程序,首先必须对C语言编程有较透彻的掌握,其次,还应该对实际电子硬件系统有深人的理解,当然在学习嵌人式C之前,较为熟练地掌握用汇编语言编程是十分必要的。
2 C代码在程序设计中的优化
笔者根据实际开发经验,对如何提高嵌入式C语言在系统开发中的效率浅谈几点体会。
(1)养成良好的、规范化的编程风格,使之符合软件工程的开发要求。使用正规、一致的编程风格十分重要,在变量名的命名规则中,建议使用Hungarian命名法则,再加上模块化的编程方式,详尽的程序说明文档,久而久之,能够大幅度提高编程效率,方便多人分工协作,也适合项目的后期维护,以及重新利用。
(2)适当的使用宏。在C程序中使用宏代码可以提高程序的执行效率。宏代码本身不是函数,但使用起来像函数。函数调用要使用系统的栈来保存数据,同时CPU在函数调用时需要保存和恢复当前的现场,进行进栈和出栈操作,所以函数调用也需要CPU时间。而宏定义就没有这个问题:宏定义仅仅作为预先写好的代码嵌入到当前程序中,不产生函数调用,所占用的仅仅是一些空间,省去了参数压栈、生成汇编语言的call调用、返回参数、执行return等过程,从而提高了程序的执行速度。虽然宏破坏了程序的可读性,使排错更加麻烦,但对于嵌入式系统,为了达到要求的性能,嵌入代码常常是必须的做法。
(3)高效分配存储器。由于成本限制,嵌入式系统存储器容量有限。程序中所有的变量、包含的库函数以及堆栈等都使用有限的内存:全局变量在整个程序范围内都有效,程序执行完后才会释放;静态变量的作用范围也是整个程序,只有局部变量中的动态变量在函数执行完后会释放。因此,在程序中应尽量使用局部变量,提高内存使用效率。程序中堆的大小受限于所有全局数据和栈空间都分配后的剩余量,如果堆太小,程序不能够在需要的时候分配内存。因此在使用malloc函数申请内存之后一定要用free函数进行释放,防止内存泄露。为了提高执行效率,对存储器类型的设定,应该根据以下原则:只要条件满足,尽量先使用内部直接寻址存储器(data),其次设定变量为间接寻址存储器(idata),在内部存储器数量不够的情况下,才使用外部存储器,而且在外部存储器中,优先选择(pdata),最后才是(xdata),而且,在内部和外部存储器共同使用的情况下,要合理分配存储器,对经常使用和计算频繁的数据,应该使用内部存储器,其它的则使用外部存储器。要根据它们的数量进行分配,在例程中,因为内部数据存储器的数量足够,我们在例程中将所有变量都申明为直接数据存储器,这样能使程序访问数据存储器的时间最少,从而提高程序运行效率。
(4)合理设置变量类型以及设置运算模式可以大大减小代码量,提高程序执行效率。
我们以51系列单片机为例。由于51系列是8位机,它只能直接处理8位无符号数的运算,而对其它类型的数据则需通过额外的算法来实现,因此,在对变量进行类型设置时,要尽可能选用无符号的字符类型,尽量少使用有符号以及多字节类型,因此,在程序设计中,都尽量采用无符号数以提高运算速度,以此避免进行多余运算。
在运算时,可以进行定点运算的尽量进行定点运算,避免进行浮点运算。如*2或/2,就可以使用移位操作来代替除法运算。这样不仅可以减少代码量,同时,还能大大提高程序执行效率,例如,对直流信号通常采用一滞后滤波法。它的表达式为:Y。二(1-K)Xo+K*Yo,在这个运算式中,如果将K值取为0. 75,则可以通过移位运算代替浮点运算或多字节的算术运算,从而简小编译后的程序模块,提高程序执行效率。而将K值取为0. 75并不会影响数据滤波的效果。
(5)将汇编程序嵌人嵌人式C程序中,完成实时响应或精确控制任务。
在一些实时性要求很高,如中断程序处理、数据采集程序、实时控制程序以及一些实时的带符号或多位运算中,建议将汇编语言嵌人C程序中进行处理。在KEILC51的C编译系统中,C程序能够与汇编程序实现方便灵活的接口,在C程序中调用汇编十分方便灵活,对二者调用的主要难度在于:实现数据的准确传输,汇编与C中实现数据传输可通过两种方式,一是利用工作寄存器进行数据传送,这种方式安全,但根据传送数据类型的不同,只能传送1个一3个参数,另外一种方案是指定特定的数据区,二者在特定的工作区内进行数据传输,这种方式,其传递数据量可自行控制,但不安全,需要开发人员仔细控制。
参考文献:
[1]马忠梅.单片机的C语言应用程序设计[M].北京:北京航天航空大学出版社,1999.
[2]王东征.嵌入式C语言位操作的移植与优化[J].单片机与嵌入式系统,2007,(2):72-74