亚洲色影视在线播放_国产一区+欧美+综合_久久精品少妇视频_制服丝袜国产网站

計(jì)算機(jī)畢業(yè)論文

嵌入式程序的優(yōu)化

時(shí)間:2022-10-07 19:26:09 計(jì)算機(jī)畢業(yè)論文 我要投稿
  • 相關(guān)推薦

嵌入式程序的優(yōu)化

  嵌入式程序的優(yōu)化【1】

  摘要:針對嵌入式系統(tǒng)的特點(diǎn),介紹了幾種在嵌入式系統(tǒng)程序設(shè)計(jì)中優(yōu)化C語言代碼的方法,從而提高系統(tǒng)的性能。

  關(guān)鍵詞:C程序設(shè)計(jì);程序優(yōu)化;代碼優(yōu)化

  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

  隨著數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展嵌入式系統(tǒng)已經(jīng)廣泛滲透到科學(xué)研究領(lǐng)域、各類產(chǎn)業(yè)和商業(yè)文化藝術(shù)以及人們的日常生活中,嵌入式計(jì)算機(jī)是完成某些特定功能的計(jì)算機(jī)系統(tǒng),并且軟硬件可裁剪。

  具有形態(tài)和性能更加小型化,多功能,低功耗等特點(diǎn),已成為當(dāng)今計(jì)算機(jī)技術(shù)發(fā)展的一個(gè)重要標(biāo)志!

  程序優(yōu)化是指對解決同一問題的幾個(gè)不同的程序,進(jìn)行比較、修改、調(diào)整或重新編寫程序,把一般程序變換為語句最少、占用內(nèi)存量少、處理速度最快、外部設(shè)備分時(shí)使用效率最高的最優(yōu)程序。

  1嵌入式程序優(yōu)化遵循的原則

  嵌入式程序優(yōu)化主要有以下3個(gè)原則:

 、俚刃г瓌t:實(shí)現(xiàn)的功能需一致。

 、谟行г瓌t:使得運(yùn)行速度快或占用存儲空間小,或兼得。

 、劢(jīng)濟(jì)原則:要付出較小的成本。

  2嵌入式程序優(yōu)化的主要實(shí)施方法

  分別為:算法優(yōu)化、編譯優(yōu)化以及代碼優(yōu)化。

  2.1算法優(yōu)化

  選擇和構(gòu)造適合于問題的算法;(冒泡排序還是快排的選擇問題是這一級早就應(yīng)該完成的)很多經(jīng)典算法都對問題作了一些假設(shè)(包括我們當(dāng)前已經(jīng)完成的算法實(shí)現(xiàn)),而在面對實(shí)際問題時(shí)我們應(yīng)該重新檢視這些假設(shè),并嘗試不同的思考問題的角度,尋求適合于問題的新算法;發(fā)掘問題的本來意義,從不同的角度思考面對的問題,使用適合于問題的的算法;嘗試打破一些規(guī)則,發(fā)掘和懷疑自己的某些假定,恢復(fù)問題的本來面目。

  2.2編譯優(yōu)化

  目前很多編譯器都可實(shí)現(xiàn)代碼優(yōu)化功能,且提供的代碼也很緊湊。

  使用編譯器,能得到性能不錯(cuò)的代碼。

  然而,機(jī)器不能像人類那樣有創(chuàng)造性。

  所以,我們還需要手工來做一些事情。

  C語言代碼的優(yōu)化是很難,且很需要技巧的工作。

  大部分編譯器可以生成為處理器進(jìn)行過特殊優(yōu)化處理的代碼,如果進(jìn)行修改,會(huì)造成特殊優(yōu)化的破壞導(dǎo)致失效。

  所以,在決定優(yōu)化代碼之前,一定要測試一下,是自己的代碼更好還是編譯器生成的代碼好。

  在嵌入式軟件開發(fā)過程中應(yīng)挑選優(yōu)化能力較強(qiáng)的編譯器,使其發(fā)揮代碼優(yōu)化功能,來生成高效的代碼,提高程序的運(yùn)行效率。

  2.3代碼優(yōu)化

  1)變量的處理

  編程過程中,解決初始化的問題,最好使用英文單詞的縮寫來代表變量。

  用縮寫的好處可以加快程序的運(yùn)行速度并減少占用的內(nèi)存。

  再一個(gè)就是變量類型的選取,選取的范圍越小也可以提高運(yùn)行速度和降低內(nèi)存的占有,不過算術(shù)運(yùn)算時(shí)容易產(chǎn)生溢出。

  函數(shù)調(diào)用越頻繁時(shí),為提高代碼的效率,可以把聲明的局部變量通過編譯器放入寄存器中,而不是放入堆棧。

  變量值很大,要使用變量作返回值,會(huì)很費(fèi)時(shí)間。

  使用參數(shù)作為返回值時(shí)間上會(huì)快些,因?yàn)闆]有變量返回的復(fù)制時(shí)間的問題。

  但安全性上和函數(shù)重復(fù)使用上差,因?yàn)閰?shù)返回破壞了參數(shù)值。

  最好在編譯時(shí),小的變量用指針返回,小的常量用變量返回,大的常量用參數(shù)或靜態(tài)方法返回。

  還有就是使用全局變量比函數(shù)傳參數(shù)效率更高,不過要犧牲程序的重入和模塊化,它是因?yàn)楣?jié)約了參數(shù)入棧和出棧的時(shí)間。

  2)適當(dāng)?shù)氖褂煤?/p>

  在嵌入式系統(tǒng)中,使用宏代替函數(shù)的方法來滿足性能要求,是在傳遞參數(shù)較多而函數(shù)較短的情況下不錯(cuò)的選擇。

  對宏的使用和定義需要謹(jǐn)慎,它可以實(shí)現(xiàn)類似函數(shù)的功能,又不像函數(shù)需要調(diào)用返回的好方法,它實(shí)質(zhì)上并不是函數(shù),需要考慮到展開后難以預(yù)料的結(jié)果。

  如果宏的參數(shù)是復(fù)合結(jié)構(gòu),因?yàn)樗皇呛唵蔚奶鎿Q,這里就要考慮操作符的優(yōu)先級問題,單個(gè)參數(shù)內(nèi)部各部分之間相互作用的操作符優(yōu)先級低于各個(gè)參數(shù)之間的操作符優(yōu)先級,在替換之后,我們需要括號保護(hù)宏參數(shù),否則會(huì)產(chǎn)生預(yù)想不到的情形。

  如果宏的參數(shù)是一個(gè)函數(shù),展開時(shí)會(huì)對其參數(shù)多次取值,那么就有可能被調(diào)用多次從而達(dá)到不一致的結(jié)果,并有可能產(chǎn)生嚴(yán)重錯(cuò)誤。

  3)數(shù)組的處理

  (1)數(shù)組在使用前需要對其先初始化。

  數(shù)組的范圍在初始化時(shí)空著不添,在執(zhí)行時(shí)將由數(shù)組自動(dòng)加入,可以提高程序的運(yùn)行速度。

  由于事先定義的范圍可能過大,造成存儲的浪費(fèi)。

  (2)大部分情況下,數(shù)組索引用指針運(yùn)算來替換,可以得到既快又短的代碼。

  指針運(yùn)算一般占用空間少,運(yùn)行速度更快。

  尤其是使用多維數(shù)組時(shí)效果更明顯。

  一下是兩段作用相同,效率不同的代碼:

  數(shù)組索引指針運(yùn)算

  for(;;){p=array

  a=array[s++];for(;;){

  ……a=*(p++);

  ……

  }}

  指針方法的優(yōu)點(diǎn)就是array的地址每次裝入地址p后,每次循環(huán)中,只需對p增量操作。

  在數(shù)組索引方法中,每次循環(huán)中都必須進(jìn)行基于s值求數(shù)組下標(biāo)的復(fù)雜運(yùn)算。

  4)避免使用除法

  ARM指令集沒有整數(shù)除法指令,通常除法指令由C語言庫中的函數(shù)執(zhí)行。

  對于不同的分子和分母,一個(gè)32位除法通常需要20至140個(gè)時(shí)鐘周期,執(zhí)行除法函數(shù)的時(shí)間由一個(gè)固定時(shí)間加上每一位相除的時(shí)間。

  由于除法操作較費(fèi)時(shí),所以應(yīng)該避免使用除法。

  我們知道,除法運(yùn)算是乘法運(yùn)算的逆運(yùn)算,可通過改變表達(dá)式,把除法運(yùn)算改成乘法運(yùn)算。

  因?yàn)闊o符號數(shù)除法的速度要高于有符號數(shù)的除法,如果其中有一個(gè)是無符號操作數(shù)最好使用無符號除法指令。

  5)使用合適的數(shù)據(jù)類型

  采用盡可能小的數(shù)據(jù)類型:可以用字符型定義的變量,就不要拿整型來定義,能拿整型定義的就不要拿長整型來定義,能不拿浮點(diǎn)型就不要拿浮點(diǎn)型來定義。

  當(dāng)然,一定要防止“溢出”現(xiàn)象,若超過變量的取值范圍后,系統(tǒng)并不會(huì)給出“出錯(cuò)信息”,要靠我們的細(xì)心和經(jīng)驗(yàn)來確保結(jié)果的正確。

  在確定表達(dá)式是float型和浮點(diǎn)型變量需注意:許多C編譯器把實(shí)型常量視為雙精度處理,降低了運(yùn)算速度換來了更精確的結(jié)果,所以我們最好用“.F”、“.f”為后綴及在函數(shù)聲明時(shí)使用float型。

  使用有符號整型變量時(shí),要考慮是否有必要使用有符號的變量,一些情況下,有符號的運(yùn)算比較快,但有時(shí)卻相反。

  例如:把整型轉(zhuǎn)化為浮點(diǎn)型時(shí),用大于16位的有符號整型比較快。

  因?yàn)閤86構(gòu)架中沒有提供從無符號整型轉(zhuǎn)化到浮點(diǎn)型的指令,因?yàn)樵谡麛?shù)運(yùn)算中需計(jì)算商和余數(shù),所以用無符號類型比較快。

  6)使用寄存器變量

  當(dāng)一個(gè)變量被頻繁讀/寫時(shí),要花費(fèi)許多存取時(shí)間,反復(fù)訪問內(nèi)存。

  可以使用CPU寄存器變量來提高效率,它可以直接進(jìn)行讀/寫,不需要訪問內(nèi)存。

  循環(huán)體內(nèi)反復(fù)使用的變量和循環(huán)次數(shù)較多的循環(huán)控制變量都可定義為寄存器變量。

  靜態(tài)存儲方式的變量都不能定義為寄存器變量,因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲方式,所以只有局部自動(dòng)變量和形參才可以定義為寄存器變量。

  寄存器變量的說明符是register。

  下面是一個(gè)采用寄存器變量的例子:

  register i,sum=0;

  for(i=1;i<=n;i++){

  sum= sum+i;

  …

  }

  7)If函數(shù)

  在條件語句的判別中,先執(zhí)行前面的判別,如果條件不滿足再執(zhí)行后面的判斷。

  最好將出現(xiàn)可能性最大的條件放在前面。

  假如x數(shù)值為0-99中的任何一個(gè)數(shù),并且概率相同。

  if(x>10){ int x=11;}

  else if(x<10){ int x=9;}

  else (x==10){ int x=10;}

  以上程序,當(dāng)產(chǎn)生的x數(shù)值在10-99之間時(shí)(可能性最大),滿足第一個(gè)條件后計(jì)算機(jī)就直接從上述程序中返回而不再執(zhí)行第二和第三個(gè)判別了,節(jié)省了運(yùn)行的時(shí)間。

  8)Switch語句中根據(jù)發(fā)生頻率來進(jìn)行case排序

  Switch語句是一個(gè)普通的編程技術(shù),編譯器會(huì)產(chǎn)生if-else-if的嵌套代碼,并按照順序進(jìn)行比較,發(fā)現(xiàn)匹配時(shí),就跳轉(zhuǎn)到滿足條件的語句執(zhí)行。

  使用時(shí)要留意,每一個(gè)測試和跳轉(zhuǎn)只是為了決定下一步要做什么,很浪費(fèi)處理時(shí)間。

  為提高效率,可以把最可能發(fā)生的情況放在第一位,最不可能的情況放在最后。

  9)使用布爾表達(dá)式

  在C語言中,使用布爾表達(dá)式可以用來對變量是否在一定范圍內(nèi)進(jìn)行檢查。

  例如布爾表達(dá)式x>=min&&x  3結(jié)論

  嵌入式程序的性能優(yōu)化與軟件的開發(fā)周期、開發(fā)成本、軟件的可讀性之間通常存在矛盾。

  在編程時(shí),應(yīng)盡量優(yōu)化自己的程序,減少不必要的運(yùn)算,如果有多種編程方式可完成同一功能,應(yīng)盡量選擇一種使程序最簡潔,高效的方法。

  參考文獻(xiàn):

  [1]劉鋒,張曉林.淺析嵌入式程序設(shè)計(jì)中的優(yōu)化問題[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2006(12).

  [2]王翠娥.淺析嵌入式C程序設(shè)計(jì)的優(yōu)化[J].信息與電腦(理論版),2009(12).

  [3]劉劍鳴.嵌入式程序設(shè)計(jì)中C/C++代碼的優(yōu)化[J].微計(jì)算機(jī)信息,2003(12).

  [4]金麗,包志華,陳海進(jìn).基于ARM嵌入式系統(tǒng)的C程序優(yōu)化設(shè)計(jì)方法[J].南通大學(xué)學(xué)報(bào):自然科學(xué)版,2006(3).

  [5]曾振河.在ARM實(shí)時(shí)系統(tǒng)中提高程序執(zhí)行的效率[J].漳州職業(yè)技術(shù)學(xué)院學(xué)報(bào),2008(1).

  [6]潭浩強(qiáng).C程序設(shè)計(jì)[M].2版.北京:清華大學(xué)出版社,1999.

  [7]陳波,石旭剛,史故臣.嵌入式C語言在系統(tǒng)開發(fā)中的代碼優(yōu)化[J].計(jì)算機(jī)時(shí)代,2008(11).

  [8]王軍安.淺析嵌入式系統(tǒng)的軟件優(yōu)化設(shè)計(jì)[J].計(jì)算機(jī)工程與應(yīng)用,2004(3).

  [9]覃征,王志敏,王向華,等.程序設(shè)計(jì)方法與優(yōu)化[M].西安:西安交通大學(xué)出版社,2004.

  嵌入式程序設(shè)計(jì)中的優(yōu)化問題【2】

  嵌入式系統(tǒng)由于受功耗、成本和體積等因素的制約,嵌入式微處理器的處理能力與桌面系統(tǒng)處理器相比也存在較大差距,故嵌入式系統(tǒng)對程序運(yùn)行的空間和時(shí)間要求更為苛刻。

  通常,需要對嵌入式應(yīng)用程序進(jìn)行性能優(yōu)化,以滿足嵌入式應(yīng)用的性能需求。

  1 嵌入式程序優(yōu)化的類型

  嵌入式應(yīng)用程序優(yōu)化,指在不改變程序功能的情況下,通過修改原來程序的算法、結(jié)構(gòu),并利用軟件開發(fā)工具對程序進(jìn)行改進(jìn),使修改后的程序運(yùn)行速度更高或代碼尺寸更小。

  按照優(yōu)化的側(cè)重點(diǎn)不同,程序優(yōu)化可分為運(yùn)行速度優(yōu)化和代碼尺寸優(yōu)化。

  運(yùn)行速度優(yōu)化是指在充分掌握軟硬件特性的基礎(chǔ)上,通過應(yīng)用程序結(jié)構(gòu)調(diào)整等手段來縮短完成指定任務(wù)所需的運(yùn)行時(shí)間;代碼尺寸優(yōu)化則是指應(yīng)用程序在能夠正確實(shí)現(xiàn)所需功能的前提下,盡可能減小程序的代碼量。

  實(shí)際應(yīng)用中,這兩者往往是相互矛盾的,為了提高程序運(yùn)行速度,就要以增加代碼量為代價(jià);而為了減小程序代碼尺寸,可能又要以降低程序運(yùn)行速度為代價(jià)。

  因此,在對程序進(jìn)行優(yōu)化之前,應(yīng)根據(jù)實(shí)際需要來制定具體的優(yōu)化策略。

  隨著計(jì)算機(jī)和微電子技術(shù)的不斷發(fā)展,存儲空間已不再是制約嵌入式系統(tǒng)的主要因素,因此本文主要討論運(yùn)行速度優(yōu)化。

  2 嵌入式程序優(yōu)化遵循的原則

  嵌入式程序優(yōu)化主要遵循以下3個(gè)原則。

  ①等效原則:優(yōu)化前后程序?qū)崿F(xiàn)的功能一致。

  ②有效原則:優(yōu)化后要比優(yōu)化前運(yùn)行速度快或占用存儲空間小,或二者兼有。

 、劢(jīng)濟(jì)原則:優(yōu)化程序要付出較小的代價(jià),取得較好的結(jié)果。

  3 嵌入式程序優(yōu)化的主要方面

  嵌入式程序的優(yōu)化分為3個(gè)方面:算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化、編譯優(yōu)化以及代碼優(yōu)化。

  3.1 算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化

  算法和數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計(jì)的核心所在,算法的好壞在很大程度上決定了程序的優(yōu)劣。

  為了實(shí)現(xiàn)某種功能,通常可以采用多種算法,不同算法的復(fù)雜度和效率差別很大。

  選擇一種高效的算法或?qū)λ惴ㄟM(jìn)行優(yōu)化,可以使應(yīng)用程序獲得更高的優(yōu)化性能。

  例如:在數(shù)據(jù)搜索時(shí),二分查找法要比順序查找法快。

  遞歸程序需要大量的過程調(diào)用,并在堆棧中保存所有返回過程的局部變量,時(shí)間效率和空間效率都非常低;若根據(jù)實(shí)際情況對遞歸程序采用迭代、堆棧等方法進(jìn)行非遞歸轉(zhuǎn)換,則可大幅度提高程序的性能。

  數(shù)據(jù)結(jié)構(gòu)在程序的設(shè)計(jì)中也占有重要的地位。

  例如:如果在一些無序的數(shù)據(jù)中多次進(jìn)行插入、刪除數(shù)據(jù)項(xiàng)操作,那么采用鏈表結(jié)構(gòu)就會(huì)比較快。

  算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化是首選的優(yōu)化技術(shù)。

  3.2 編譯優(yōu)化

  現(xiàn)在,很多的編譯器都具有一定的代碼優(yōu)化功能。

  在編譯時(shí),借用并行程序設(shè)計(jì)技術(shù),進(jìn)行相關(guān)性分析;獲得源程序的語義信息,采用軟件流水線、數(shù)據(jù)規(guī)劃、循環(huán)重構(gòu)等技術(shù),自動(dòng)進(jìn)行一些與處理器體系無關(guān)的優(yōu)化,生成高質(zhì)量的代碼。

  許多編譯器有不同級別的優(yōu)化選項(xiàng),可以選用一種合適的優(yōu)化方式。

  通常情況下,如果選用了最高級別的優(yōu)化方式,那么編譯器將片面追求代碼的優(yōu)化,有時(shí)會(huì)導(dǎo)致錯(cuò)誤。

  另外,還有一些專用的編譯器針對某些體系結(jié)構(gòu)進(jìn)行了優(yōu)化設(shè)計(jì),可以充分利用硬件資源來生成高質(zhì)量的代碼。

  例如:Microsoft eMbedded Visual C++版的Intel編譯器完全針對Intel XScale體系,經(jīng)過高度優(yōu)化,能創(chuàng)建運(yùn)行速度更快的代碼。

  此編譯器采用了多種優(yōu)化技術(shù),包括優(yōu)化指令管道操作的調(diào)度技術(shù)、雙重加載與存儲Intel XScale技術(shù)功能支持以及過程間優(yōu)化(將函數(shù)使用的變量存放到寄存器,以便快速訪問)等。

  在嵌入式軟件開發(fā)過程中應(yīng)選擇一種優(yōu)化能力強(qiáng)的編譯器,充分利用其代碼優(yōu)化功能,生成高效的代碼,提高程序的運(yùn)行效率。

  3.3 代碼優(yōu)化

  代碼優(yōu)化,就是采用匯編語言或更精簡的程序代碼來代替原有的代碼,使編譯后的程序運(yùn)行效率更高。

  編譯器可以自動(dòng)完成程序段和代碼塊范圍內(nèi)的優(yōu)化,但很難獲取程序語義信息、算法流程和程序運(yùn)行狀態(tài)信息,因而需要編程人員進(jìn)行手工優(yōu)化。

  以下是一些常用的優(yōu)化技術(shù)和技巧。

  (1)代碼替換

  使用周期短的指令代替周期長的指令,以降低運(yùn)算的強(qiáng)度。

 、贉p少除法運(yùn)算。

  用關(guān)系運(yùn)算符兩邊乘除數(shù)避免除法操作,還有一些除法和取模的運(yùn)算可以用位操作來代替。

  因?yàn)槲徊僮髦噶钪恍枰粋(gè)指令周期,而“/”運(yùn)算則需要調(diào)用子程序,代碼長,執(zhí)行慢。

  例如:

  優(yōu)化前if((a/b)>c)和a=a/4

  優(yōu)化后if(a>(b*c))和a=a>>2

 、跍p少乘方運(yùn)算。

  例如:

  優(yōu)化前a=pow(a,3.0)

  優(yōu)化后a=a*a*a

 、凼褂冒准、自減指令。

  例如:

  優(yōu)化前a=a+1、a=a-l

  優(yōu)化后a++、a--或inc、dec

 、鼙M量使用小的數(shù)據(jù)類型。

  在所定義的變量滿足使用要求的條件下,優(yōu)先使用順序?yàn)椋鹤址?char)>整型(im)>長整型(long int)>浮點(diǎn)型(float)。

  對除法來說,使用無符號數(shù)比有符號數(shù)會(huì)有更高的效率。

  在實(shí)際調(diào)用中,盡量減少數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換;少用浮點(diǎn)運(yùn)算,如果運(yùn)算的結(jié)果能夠控制在誤差之內(nèi),則可用長整型代替浮點(diǎn)型。

  (2)全局變量與局部變量

  少用全局變量,多用局部變量。

  全局變量是放在數(shù)據(jù)存儲器中的,定義了全局變量,MCU就少了一個(gè)可以利用的數(shù)據(jù)存儲器空間,太多的全局變量,會(huì)導(dǎo)致編譯器無足夠的內(nèi)存分配;而局部變量則大多定位于MCU內(nèi)部的寄存器中。

  在絕大多數(shù)的MCU中,使用寄存器的操作速度比數(shù)據(jù)存儲器快,指令也更靈活,有利于生成質(zhì)量更高的代碼,而且局部變量所占用的寄存器和數(shù)據(jù)存儲器在不同的模塊中可以重復(fù)利用。

  (3)使用寄存器變量

  當(dāng)一個(gè)變量被頻繁讀/寫時(shí),需要反復(fù)訪問內(nèi)存,花費(fèi)大量的存取時(shí)間。

  為了提高訪問效率,可以使用CPU寄存器變量,不需要訪問內(nèi)存,直接進(jìn)行讀/寫。

  循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計(jì)數(shù)是應(yīng)用寄存器變量的最佳選擇。

  只有局部自動(dòng)變量和形參才可以定義為寄存器變量。

  因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲方式,因此凡需要采用靜態(tài)存儲方式的變量都不能定義為寄存器變量。

  寄存器變量的說明符是register。

  下面是一個(gè)采用寄存器變量的例子:

  (4)減少或避免執(zhí)行耗時(shí)的操作

  應(yīng)用程序的大量運(yùn)行時(shí)問通;ㄙM(fèi)在關(guān)鍵程序模塊,關(guān)鍵模塊往往包含循環(huán)或嵌套循環(huán)。

  減少循環(huán)中耗時(shí)的操作,可以提高程序的執(zhí)行速度。

  常見的耗時(shí)操作有:輸入/輸出操作、文件訪問、圖形界面操作和系統(tǒng)調(diào)用等。

  其中,如果無法避免文件的讀/寫,那么對文件的訪問將是影響程序運(yùn)行速度的一大因素。

  提高文件訪問速度的方法有兩種:一種是采用內(nèi)存映射文件;另一種是使用內(nèi)存緩存。

  (5)switch語句用法的優(yōu)化

  編程時(shí),對case值按照可能性排序,將最可能發(fā)生的情況放在第一個(gè),最不可能的情況放在最后一個(gè),可以提高switch語句塊的執(zhí)行速度。

  (6)循環(huán)體的優(yōu)化

  循環(huán)體是程序設(shè)計(jì)和優(yōu)化的重點(diǎn),對于一些不需要循環(huán)變量參加運(yùn)算的模塊,可以把它放到循環(huán)的外面。

  對于次數(shù)固定的循環(huán)體,for循環(huán)比while循環(huán)效率更高,減計(jì)數(shù)循環(huán)比增計(jì)數(shù)循環(huán)速度快。

  例如:

  實(shí)際運(yùn)行時(shí),每次循環(huán)需要在循環(huán)體外加兩條指令:一條減法指令(減少循環(huán)計(jì)數(shù)值)和一條條件分支指令。

  這些指令稱為“循環(huán)開銷”。

  在ARM處理器上,減法指令需要1個(gè)周期,條件分支指令需要3個(gè)周期,這樣每個(gè)循環(huán)另加了4個(gè)周期的開銷。

  可以采用循環(huán)展開的方法來提高循環(huán)運(yùn)行的速度,即:重復(fù)循環(huán)主題多次,并按同樣的比例減少循環(huán)次數(shù)來減小循環(huán)的開銷,以增加代碼尺寸。

  來換取程序的運(yùn)行速度。

  (7)函數(shù)調(diào)用

  高效的調(diào)用函數(shù),盡量限制使用函數(shù)的參數(shù)個(gè)數(shù),不要超過4個(gè)。

  ARM調(diào)用時(shí),4個(gè)以下的形參通過寄存器傳遞,第5個(gè)以上的形參通過存儲器棧傳遞。

  如果有更多的參數(shù)調(diào)用,則可將相關(guān)的參數(shù)組織在一個(gè)結(jié)構(gòu)體內(nèi),用傳遞結(jié)構(gòu)體指針來代替參數(shù)。

  (8)內(nèi)聯(lián)函數(shù)和內(nèi)嵌匯編

  對性能影響大的重要函數(shù)可以使用關(guān)鍵字_inline內(nèi)聯(lián),會(huì)省去調(diào)用函數(shù)的開銷,負(fù)面影響是增加了代碼尺寸。

  程序中對時(shí)間要求苛刻的部分可以用內(nèi)嵌匯編來編寫,通?梢詭硭俣壬系娘@著提高。

  (9)查表代替計(jì)算

  在程序中盡量不進(jìn)行非常復(fù)雜的運(yùn)算,如浮點(diǎn)數(shù)的開方。

  對于這些消耗時(shí)間和資源的運(yùn)算,可以采用空間換取時(shí)間的方法。

  預(yù)先將函數(shù)值計(jì)算出來,置于程序存儲區(qū)中,以后程序運(yùn)行時(shí)直接查表即可,減小了程序執(zhí)行過程中重復(fù)計(jì)算的工作量。

  (10)使用針對硬件優(yōu)化的函數(shù)庫

  Intel公司為XScale處理器設(shè)計(jì)的GPP(Graphics Performance Primitives library)/IPP(Integrated Perform-ance Primitives library)庫,針對多媒體處理、圖形處理和數(shù)值運(yùn)算的一些典型操作和算法進(jìn)行了手工優(yōu)化,可以很好地發(fā)揮XScale硬件的計(jì)算潛能,達(dá)到很高的執(zhí)行效率。

  (11)利用硬件特性

  為了提高程序的運(yùn)行效率,要充分利用硬件特性來減小其運(yùn)行開銷,例如減少中斷次數(shù)、利用DMA傳輸方式等。

  CPU對各種存儲器的訪問速度排序依次為:CPU內(nèi)部RAM>外部同步RAM>外部異步RAM>Flash/ROM。

  對于已經(jīng)燒錄在Flash或ROM中的程序代碼,如果讓CPU直接從中讀取代碼執(zhí)行,運(yùn)行速度較慢,則可在系統(tǒng)啟動(dòng)后將Flash或ROM中的目標(biāo)代碼拷貝至RAM中后執(zhí)行,以提高程序的運(yùn)行速度。

  4 結(jié)論

  嵌入式程序的性能優(yōu)化與軟件的開發(fā)周期、開發(fā)成本、軟件的可讀性之聞通常存在矛盾。

  要權(quán)衡利弊,作出折中的選擇。

  將算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化作為首選優(yōu)化技術(shù);然后根據(jù)功能、性能差異和投資預(yù)算等因素選擇高效的編譯器、系統(tǒng)運(yùn)行庫和圖形庫;使用性能監(jiān)測工具偵測占主要運(yùn)行時(shí)間的程序熱點(diǎn),采用代碼優(yōu)化手段對其進(jìn)行優(yōu)化;最后使用高效的編譯器進(jìn)行編譯優(yōu)化,從而得到高質(zhì)量的代碼。

【嵌入式程序的優(yōu)化】相關(guān)文章:

優(yōu)化排名原理,seo優(yōu)化排名10-09

seo優(yōu)化排名,seo優(yōu)化教程10-09

嵌入式的實(shí)驗(yàn)心得09-29

嵌入式系統(tǒng)設(shè)計(jì)10-07

嵌入式簡歷模板10-02

優(yōu)化的方案04-09

優(yōu)化方案02-07

優(yōu)化關(guān)鍵詞-seo優(yōu)化排名10-09

seo優(yōu)化排名與關(guān)鍵詞優(yōu)化10-09