高效率嵌入式程序開(kāi)發(fā)_第1頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余3頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、法冗余變量,以精簡(jiǎn)程序。普通狀況下這樣做是正確的,但是也有例外,如下所示: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時(shí)都要先從相應(yīng)的存儲(chǔ)器下載到寄存器里,經(jīng)f()或g()

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論