高效率嵌入式程序開發(fā)_第1頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、高效率嵌入式程序開發(fā)在多媒體、通信等計算復(fù)雜度高的應(yīng)用中,為了滿足創(chuàng)造費用、功耗、性能以及實時性等諸多限制條件的要求,系統(tǒng)程序往往需要特別設(shè)計。這使得設(shè)計師在設(shè)計面對特定應(yīng)用的嵌入式軟件時,需要有一套切實可行的編程準則。而在實際程序設(shè)計中,工程師尤其需要考慮對變量的用法和循環(huán)程序的處理。變量用法在舉行實際程序開發(fā)時,變量的用法至關(guān)重要,其中用法全局變量比向函數(shù)傳遞參數(shù)越發(fā)有效,這樣免去了函數(shù)調(diào)用時參數(shù)入棧和出棧的需要。固然,用法全局變量會對程序有一些副作用。變量定義的次序會導(dǎo)致終于映像中數(shù)據(jù)布局的不同,1所示。圖1 變量映像次序混亂情況由此可見,在聲明變量時,需要考慮怎樣最佳地控制存儲器布局。

2、最好的辦法是在編程的時候,把全部相同類型的變量放在一起定義。通常,工程師設(shè)法用法short或char來定義變量以節(jié)約存儲器空間。在函數(shù)的局部變量數(shù)目有限的狀況下,編譯器會把局部變量分配給內(nèi)部寄存器,每個變量占用一個寄存器。在這種狀況下,用法short和char型變量不但不會節(jié)約空間,反而會帶來其它的副作用。2所示:假定a是隨意可能的寄存器,存儲函數(shù)的局部變量。同樣完成加1的操作,32位的int型變量最快,只用一條加法命令。而8位和16位變量,完成加法操作后,還需要在32位的寄存器中舉行符號擴展。其中,帶符號的變量,要用規(guī)律左移和算術(shù)右移兩條命令才干完成符號擴展;無符號的變量,要用法一條規(guī)律與命

3、令對符號位舉行清零。所以,用法32位的int或unsigned int局部變量最有效。某些狀況下,函數(shù)從外部存儲器讀入局部變量舉行計算,這時候,需要把不是32位的變量轉(zhuǎn)換成32位。至于把8位或16位變量擴展成32位后,躲藏了本來可能溢出異樣這個問題,需要進一步認真考慮。圖2 不同類型局部變量的加法程序在程序中,常常會用法switch case語句,每一個由機器語言實現(xiàn)的測試和跳轉(zhuǎn)僅僅是為了打算下一步要做什么,就鋪張了處理器時光。為了提高速度,可以把詳細的狀況根據(jù)它們發(fā)生的相對頻率排序。即把最可能發(fā)生的狀況放在第一,發(fā)生概率小的狀況放在最后,這樣會削減代碼平均執(zhí)行時光。通常,工程師總是竭力避開用

4、法冗余變量,以精簡程序。普通狀況下這樣做是正確的,但是也有例外,如下所示:int f(void);int g(void);file:/f()和g()不拜訪全局變量errsint errs; file:/全局變量void test1(void) errs += f();errs += g();void test2(void) int localerrs = errs;/ 定義冗余的局部變量localerrs += f();localerrs += g();errs = localerrs;在第一種狀況test1()里,每次拜訪全局變量errs時都要先從相應(yīng)的存儲器下載到寄存器里,經(jīng)f()或g()

5、函數(shù)調(diào)用后再存儲回本來的存儲器里面。在該例子中,一共要舉行兩次這樣的下載/存儲操作。而在其次種狀況test2()里,局部變量localerrs被分配以寄存器,這樣一來,囫圇函數(shù)就只需要一次下載/存儲全局變量存儲器了。盡量節(jié)約存儲器拜訪的次數(shù),對于提高系統(tǒng)性能十分實用。循環(huán)程序的處理計數(shù)循環(huán)是程序中常用的流程控制結(jié)構(gòu)。在c中,類似下面的for循環(huán)比比皆是:for(loop=1;loop=limit;loop+)這種累加計數(shù)的辦法符合普通的自然思維習(xí)慣,所以比下面的遞減計數(shù)辦法用法更多:for(loop=limit;loop!=0; loop-)這兩者在規(guī)律上并沒有效率差異,但是映射到詳細的體系結(jié)

6、構(gòu)中,就產(chǎn)生了很大的不同。累加法比遞減法多用了一條命令,當(dāng)循環(huán)次數(shù)比較多的時候,這兩段代碼就會在性能上產(chǎn)生顯然的差異。分析其本質(zhì)緣由,在于當(dāng)舉行一個非零常數(shù)比較時,必需用特地的cmp命令來執(zhí)行;而當(dāng)一個變量與零舉行比較時,命令可以挺直利用條件執(zhí)行的特性(ne)來舉行推斷。無數(shù)時候循環(huán)綻開由編譯器自動完成,不過應(yīng)注重對中間變量或結(jié)果被更改的循環(huán),編譯程序往往否決綻開,這時候就需要工程師自己來做綻開工作了。尤其值得注重的是,在有內(nèi)部命令cache的cpu上(如arm946es芯片),由于循環(huán)綻開的代碼很大,往往會浮現(xiàn)高速緩沖存儲器溢出。這時綻開的代碼會頻繁地在cpu的高速緩沖存儲器和內(nèi)存之間往返調(diào)用,又由于高速緩沖存儲器速度很高,所以此時循環(huán)綻開反而會變慢。同時,循環(huán)綻開會影響矢量運算優(yōu)化。arm處理器核對nz(零比較轉(zhuǎn)移)有特殊的命令處理,速度十分快,假如你的循環(huán)對方向不敏感,可以由大向小循環(huán)。需要注重的是,假如指針操作用法了i值,這種辦法可能引起指針索引超界的嚴峻錯誤(i = max+1)。固然你可以通過對i做加減運算來訂正,但是假如這樣就沒有提高

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論