📄 嵌入式实时程序设计中c-c++代码的优化.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0050)http://www.bol-system.com/APPLICATION/optimize.htm -->
<HTML><HEAD><TITLE>嵌入式实时程序设计中C/C++代码的优化</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JavaScript type=text/JavaScript>
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</SCRIPT>
<META content="MSHTML 6.00.2900.2668" name=GENERATOR></HEAD>
<BODY background=嵌入式实时程序设计中C-C++代码的优化.files/bg.gif>
<DIV id=Layer1
style="Z-INDEX: 1; LEFT: 8px; WIDTH: 772px; POSITION: absolute; TOP: 130px; HEIGHT: 1665px">
<TABLE height=1645 width=764 border=0>
<TBODY>
<TR>
<TD vAlign=top borderColor=#ffffff align=left width=70 bgColor=#99ccff
height=1664> </TD>
<TD vAlign=top align=left width=684 height=1664>
<TABLE height=1596 width=668 border=0>
<TBODY>
<TR>
<TD height=27>
<DIV align=right><FONT color=#ff0000 size=2>...::<A
href="http://www.bol-system.com/Application.HTM"><FONT
color=#666699><B>进入更多文章</B></FONT></A>:..</FONT></DIV></TD></TR>
<TR>
<TD height=22>
<DIV align=center><B><FONT color=#0000ff
size=4>嵌入式实时程序设计中C/C++代码的优化</FONT></B></DIV></TD></TR>
<TR>
<TD height=16>
<DIV align=center></DIV></TD></TR>
<TR>
<TD vAlign=top height=1522><FONT color=#0000ff size=2> </FONT>
<P><FONT color=#0000ff size=3>1 引言</FONT><FONT color=#0000ff size=2>
</FONT></P><FONT color=#0000ff size=2>
计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用。
</FONT><FONT color=#0000ff
size=2>嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体。具有软件代码小、高度自动化、响应速度快等特点。
</FONT><FONT color=#0000ff
size=2>特别适合于要求实时和多任务的应用体系。嵌入式实时系统是目前蓬勃发展的行业之一。 </FONT><FONT
color=#0000ff size=2>
但是,实时嵌入式系统的特点使得其软件受时间和空间的严格限制,加上运行环境复杂,使得嵌入式系统软件的开发变得异常困难。
</FONT><FONT color=#0000ff
size=2>为了设计一个满足功能、性能和死线要求的系统,为了开发出安全可靠的高性能嵌入式系统,开发语言的选择十分重要。</FONT>
<P><FONT color=#0000ff size=3>2 嵌入式实时程序设计中语言的选择</FONT>
</P>
<P><FONT color=#0000ff size=2>随着嵌入式系统应用范围的不断扩大和嵌入式实时操作系统RTOS(Real
Time Operating System)的广泛使用,高级语言编程已是嵌入</FONT><FONT color=#0000ff
size=2>式系统设计的必然趋势。因为汇编语言和具体的微处理器的硬件结构密切相关,移植性较差,既不宜在复杂系统中使用,又不便于实现软</FONT><FONT
color=#0000ff
size=2>件重用;而高级语言具有良好的通用性和丰富的软件支持,便于推广、易于维护,因此高级语言编程具有许多优势。目前,在嵌入式系统</FONT><FONT
color=#0000ff
size=2>开发过程中使用的语言种类很多,但仅有少数几种语言得到了比较广泛的应用。其中C和C++是应用最广泛的。C++在支持现代软件工程、
</FONT><FONT color=#0000ff size=2>OOP(Object Oriented
Programming,面向对象的程序设计)、结构化等方面对C进行了卓有成效的改进,但在程序代码容量、执行速度、
</FONT><FONT color=#0000ff
size=2>程序复杂程度等方面比C语言程序性能差一些。由于C语言既有低级语言的直接控制硬件的能力,又有高级语言的灵活性,是目前在嵌入式</FONT><FONT
color=#0000ff
size=2>系统中应用最广泛的编程语言。随着网络技术和嵌入式技术的不断发展,Java的应用也得到广泛应用。</FONT></P>
<P><FONT color=#0000ff size=3>3 C/C++代码在实时程序设计中的优化</FONT>
</P>
<P><FONT color=#0000ff
size=2>虽然使软件正确是一个工程合乎逻辑的最后一个步骤,但是在嵌入式的系统开发中,情况并不总是这样的。出于对低价产品的需求,
硬件的设计者需要提供刚好足够的存储器和完成工作的处理能力。所以在嵌入式软件设计的最后一个阶段则变成了对代码的优化。</FONT>
</P>
<P><FONT color=#0000ff
size=2>现代的C和C++编译器都提供了一定程度上的代码优化。然而,大部分由编译器执行的优化仅涉及执行速度和代码大小的一个平衡。你的程序能够变得更快或者更小,但是不可能又变快又变小。经过本人在嵌入式系统设计和实现过程中实践,下面介绍几种简单且行之有效的C/C++代码的优化方法。</FONT>
</P>
<P> (<FONT color=#0000ff size=2>1) Inline函数
</FONT></P><FONT color=#0000ff size=2>
在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。
</FONT><FONT color=#0000ff
size=2>这样做在两个方面快于函数调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传</FONT><FONT
color=#0000ff
size=2>递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调</FONT><FONT
color=#0000ff size=2>用并且只包含几行代码的时候是最有效的。</FONT>
<P> <FONT color=#0000ff size=2>(2)用指针代替数组
</FONT></P><FONT color=#0000ff size=2>
在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,</FONT><FONT
color=#0000ff size=2>占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。
</FONT>
<P><FONT color=#0000ff size=2>
数组索引
指针运算 <BR>
For(;;){
p=array <BR>
A=array[t++];
for(;;){
<BR>
a=*(p++); <BR>
......
...... <BR>
}
} </FONT></P><FONT color=#0000ff size=2>
指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须进行基于</FONT><FONT
color=#0000ff size=2>t值求数组下标的复杂运算。</FONT>
<P> <FONT color=#0000ff size=2>(3)不定义不使用的返回值
</FONT>
<P><FONT color=#0000ff size=2>
function函数定义并不知道函数返回值是否被使用,假如返回值从来不会被用到,应该使用void来明确声明函数不返回任何值。
</FONT>
<P><FONT color=#0000ff size=2> (4)手动编写汇编
</FONT></P><FONT color=#0000ff size=2>
在嵌入式软件开发中,一些软件模块最好用汇编语言来写,这可以使程序更加有效。虽然C/C++编译器对代码进行了优化,但是适当的</FONT><FONT
color=#0000ff size=2>使用内联汇编指令可以有效的提高整个系统运行的效率。 </FONT>
<P><FONT color=#0000ff size=2> (5)使用寄存器变量
</FONT></P><FONT color=#0000ff size=2>
在声明局部变量的时候可以使用register关键字。这就使得编译器把变量放入一个多用途的寄存器中,而不是在堆栈中,合理使用这</FONT><FONT
color=#0000ff size=2>种方法可以提高执行速度。函数调用越是频繁,越是可能提高代码的速度。 </FONT>
<P><FONT color=#0000ff size=2> (6)使用增量和减量操作符
</FONT></P><FONT color=#0000ff size=2>
在使用到加一和减一操作时尽量使用增量和减量操作符,因为增量符语句比赋值语句更快,原因在于对大多数CPU来说,对内存字的增、
</FONT><FONT color=#0000ff size=2>减量操作不必明显地使用取内存和写内存的指令,比如下面这条语句:
</FONT>
<P><FONT color=#0000ff size=2> x=x+1;
<BR> 模仿大多数微机汇编语言为例,产生的代码类似于:
<BR> move A,x
;把x从内存取出存入累加器A <BR> add
A,1 ;累加器A加1
<BR> store x
;把新值存回x </FONT>
<P><FONT color=#0000ff size=2> 如果使用增量操作符,生成的代码如下:
<BR> incr
x ;x加1
<BR> 显然,不用取指令和存指令,增、减量操作执行的速度加快,同时长度也缩短了。</FONT>
<P> <FONT color=#0000ff size=2>(7)减少函数调用参数
</FONT></P><FONT color=#0000ff size=2>
使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。然而决定使用全局</FONT><FONT
color=#0000ff size=2>变量会影响程序的模块化和重入,故要慎重使用。 </FONT>
<P><FONT color=#0000ff size=2>
(8)Switch语句中根据发生频率来进行case排序 </FONT></P><FONT color=#0000ff
size=2>
switch语句是一个普通的编程技术,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,发现匹配时,就跳转到满足条件的</FONT><FONT
color=#0000ff
size=2>语句执行。使用时需要注意。每一个由机器语言实现的测试和跳转仅仅是为了决定下一步要做什么,就把宝贵的处理器时间耗尽。为了提</FONT><FONT
color=#0000ff
size=2>高速度,没法把具体的情况按照它们发生的相对频率排序。换句话说,把最可能发生的情况放在第一位,最不可能的情况放在最后。
</FONT>
<P><FONT color=#0000ff size=2>
(9)将大的switch语句转为嵌套switch语句 </FONT></P><FONT color=#0000ff
size=2>
当switch语句中的case标号很多时,为了减少比较的次数,明智的做法是把大switch语句转为嵌套switch语句。把发生频率高的case
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -