嵌入式程序優(yōu)化方法_第1頁(yè)
嵌入式程序優(yōu)化方法_第2頁(yè)
嵌入式程序優(yōu)化方法_第3頁(yè)
嵌入式程序優(yōu)化方法_第4頁(yè)
嵌入式程序優(yōu)化方法_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1嵌入式計(jì)算原理嵌入式計(jì)算原理程序的優(yōu)化方法程序的優(yōu)化方法2嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應(yīng)用系統(tǒng),對(duì)功能、可靠性、成本、體積、功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。隨著數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展,嵌入式系統(tǒng)已經(jīng)廣泛滲透到科學(xué)研究、工程設(shè)計(jì)、軍事技術(shù)、各類產(chǎn)業(yè)和商業(yè)文化藝術(shù)以及人們的日常生活等方方面面中。嵌入式系統(tǒng)由于受功耗、成本和體積等因素的制約,嵌入式微處理器的處理能力與桌面系統(tǒng)處理器相比也存在較大差距,故嵌入式系統(tǒng)對(duì)程序運(yùn)行的空間和時(shí)間要求極為苛刻。背景背景3 嵌入式應(yīng)用程序優(yōu)化,指在不改變程序功能的情況下,通過(guò)修改原來(lái)程序的算法、結(jié)構(gòu),并利用軟件開(kāi)

2、發(fā)工具對(duì)程序進(jìn)行改進(jìn),使修改后的程序運(yùn)行速度更高或代碼尺寸更小。 按照優(yōu)化的側(cè)重點(diǎn)不同,程序優(yōu)化可分為運(yùn)行速度優(yōu)化和代碼尺寸優(yōu)化。運(yùn)行速度優(yōu)化是指在充分掌握軟硬件特性的基礎(chǔ)上,通過(guò)應(yīng)用程序結(jié)構(gòu)調(diào)整等手段來(lái)縮短完成指定任務(wù)所需的運(yùn)行時(shí)間;代碼尺寸優(yōu)化則是指應(yīng)用程序在能夠正確實(shí)現(xiàn)所需功能的前提下,盡可能減小程序的代碼量。實(shí)際應(yīng)用中,這兩者往往是相互矛盾的,為了提高程序運(yùn)行速度,就要以增加代碼量為代價(jià);而為了減小程序代碼尺寸,可能又要以降低程序運(yùn)行速度為代價(jià)。因此,在對(duì)程序進(jìn)行優(yōu)化之前,應(yīng)根據(jù)實(shí)際需要來(lái)制定具體的優(yōu)化策略。嵌入式程序優(yōu)化定義嵌入式程序優(yōu)化定義4l嵌入式程序優(yōu)化原則嵌入式程序優(yōu)化原則等

3、效原則。所謂等效原則就是優(yōu)化前后,程序?qū)崿F(xiàn)的功能要一致。有效原則。所謂有效原則。優(yōu)化后要比優(yōu)化前運(yùn)行速度快或占用的儲(chǔ)存空間要小,或兩者兼而有之。經(jīng)濟(jì)原則。所謂經(jīng)濟(jì)原則就是程序有較小的代價(jià),取得較理想的效果。l嵌入式程序優(yōu)化主要方面嵌入式程序優(yōu)化主要方面 嵌入式程序的優(yōu)化分為3個(gè)方面:算法和數(shù)據(jù)結(jié)構(gòu)算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化、編譯編譯優(yōu)化以及代碼代碼優(yōu)化。5 算法和數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計(jì)的核心所在,算法的好壞在很大程度上決定了程序的優(yōu)劣。為了實(shí)現(xiàn)某種功能,通??梢圆捎枚喾N算法,不同算法的復(fù)雜度和效率差別很大。選擇一種高效的算法或?qū)λ惴ㄟM(jìn)行優(yōu)化,可以使應(yīng)用程序獲得更高的優(yōu)化性能。例如:在數(shù)據(jù)搜索時(shí),二分查找法

4、要比順序查找法快。遞歸程序需要大量的過(guò)程調(diào)用,并在堆棧中保存所有返回過(guò)程的局部變量,時(shí)間效率和空間效率都非常低;若根據(jù)實(shí)際情況對(duì)遞歸程序采用迭代、堆棧等方法進(jìn)行非遞歸轉(zhuǎn)換,則可大幅度提高程序的性能。 數(shù)據(jù)結(jié)構(gòu)在程序的設(shè)計(jì)中也占有重要的地位。例如:如果在一些無(wú)序的數(shù)據(jù)中多次進(jìn)行插入、刪除數(shù)據(jù)項(xiàng)操作,那么采用鏈表結(jié)構(gòu)就會(huì)比較快。算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化是首選的優(yōu)化技術(shù)。算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化6 現(xiàn)在,很多的編譯器都具有一定的代碼優(yōu)化功能。在編譯時(shí),借用并行程序設(shè)計(jì)技術(shù),進(jìn)行相關(guān)性分析;獲得源程序的語(yǔ)義信息,采用軟件流水線、數(shù)據(jù)規(guī)劃、循環(huán)重構(gòu)等技術(shù),自動(dòng)進(jìn)行一些與處理器體系無(wú)關(guān)的優(yōu)化,生成高

5、質(zhì)量的代碼。許多編譯器有不同級(jí)別的優(yōu)化選項(xiàng),可以選用一種合適的優(yōu)化方式。通常情況下,如果選用了最高級(jí)別的優(yōu)化方式,那么編譯器將片面追求代碼的優(yōu)化,有時(shí)會(huì)導(dǎo)致錯(cuò)誤。 另外,還有一些專用的編譯器針對(duì)某些體系結(jié)構(gòu)進(jìn)行了優(yōu)化設(shè)計(jì),可以充分利用硬件資源來(lái)生成高質(zhì)量的代碼。在嵌入式軟件開(kāi)發(fā)過(guò)程中應(yīng)選擇一種優(yōu)化能力強(qiáng)的編譯器,充分利用其代碼優(yōu)化功能,生成高效的代碼,提高程序的運(yùn)行效率。編譯優(yōu)化編譯優(yōu)化7代碼優(yōu)化,就是采用匯編語(yǔ)言或更精簡(jiǎn)的程序代碼來(lái)代代碼優(yōu)化,就是采用匯編語(yǔ)言或更精簡(jiǎn)的程序代碼來(lái)代替原有的代碼,使編譯后的程序運(yùn)行效率更高。編譯器可以自替原有的代碼,使編譯后的程序運(yùn)行效率更高。編譯器可以自動(dòng)完

6、成程序段和代碼塊范圍內(nèi)的優(yōu)化,但很難獲取程序語(yǔ)義信動(dòng)完成程序段和代碼塊范圍內(nèi)的優(yōu)化,但很難獲取程序語(yǔ)義信息、算法流程和程序運(yùn)行狀態(tài)信息,因而需要編程人員進(jìn)行手息、算法流程和程序運(yùn)行狀態(tài)信息,因而需要編程人員進(jìn)行手工優(yōu)化。以下是一些常用的優(yōu)化技術(shù)和技巧。工優(yōu)化。以下是一些常用的優(yōu)化技術(shù)和技巧。代碼優(yōu)化代碼優(yōu)化8l代碼替換代碼替換使用周期短的指令代替周期長(zhǎng)的指令,以降低運(yùn)算的強(qiáng)度。 減少除法運(yùn)算。用關(guān)系運(yùn)算符兩邊乘除數(shù)避免除法操作,還有一些除法和取模的運(yùn)算可以用位操作來(lái)代替。因?yàn)槲徊僮髦噶钪恍枰粋€(gè)指令周期,而“”運(yùn)算則需要調(diào)用子程序,代碼長(zhǎng),執(zhí)行慢。例如:優(yōu)化前if(ab)c)和a=a4優(yōu)化后if

7、(a(b*c)和a=a2 減少乘方運(yùn)算。例如:優(yōu)化前a=pow(a,30)優(yōu)化后a=a*a*a代碼優(yōu)化代碼優(yōu)化9使用白加、自減指令。例如:優(yōu)化前a=a+1、a=a-1優(yōu)化后a+、a-或inc、dec盡量使用小的數(shù)據(jù)類型。在所定義的變量滿足使用要求的條件下,優(yōu)先使用順序?yàn)椋鹤址?char)整型(im)長(zhǎng)整型(long int)浮點(diǎn)型(float)。對(duì)除法來(lái)說(shuō),使用無(wú)符號(hào)數(shù)比有符號(hào)數(shù)會(huì)有更高的效率。在實(shí)際調(diào)用中,盡量減少數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換;少用浮點(diǎn)運(yùn)算,如果運(yùn)算的結(jié)果能夠控制在誤差之內(nèi),則可用長(zhǎng)整型代替浮點(diǎn)型。代碼優(yōu)化代碼優(yōu)化10l全局變量與局部變量全局變量與局部變量 少用全局變量,多用局部變量

8、。全局變量是放在數(shù)據(jù)存儲(chǔ)器中的,定義了全局變量,MCU(Microcontroller Unit)就少了一個(gè)可以利用的數(shù)據(jù)存儲(chǔ)器空間,太多的全局變量,會(huì)導(dǎo)致編譯器無(wú)足夠的內(nèi)存分配;而局部變量則大多定位于MCU內(nèi)部的寄存器中。在絕大多數(shù)的MCU中,使用寄存器的操作速度比數(shù)據(jù)存儲(chǔ)器快,指令也更靈活,有利于生成質(zhì)量更高的代碼,而且局部變量所占用的寄存器和數(shù)據(jù)存儲(chǔ)器在不同的模塊中可以重復(fù)利用。代碼優(yōu)化代碼優(yōu)化11l使用寄存器變量使用寄存器變量 當(dāng)一個(gè)變量被頻繁讀寫(xiě)時(shí),需要反復(fù)訪問(wèn)內(nèi)存,花費(fèi)大量的存取時(shí)間。為了提高訪問(wèn)效率,可以使用CPU寄存器變量,不需要訪問(wèn)內(nèi)存,直接進(jìn)行讀寫(xiě)。循環(huán)次數(shù)較多的循環(huán)控制變

9、量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計(jì)數(shù)是應(yīng)用寄存器變量的最佳選擇。只有局部自動(dòng)變量和形參才可以定義為寄存器變量。因?yàn)榧拇嫫髯兞繉儆趧?dòng)態(tài)存儲(chǔ)方式,因此凡需要采用靜態(tài)存儲(chǔ)方式的變量都不能定義為寄存器變量。寄存器變量的說(shuō)明符是register。 用register storage specifier聲明函數(shù)形參將會(huì)建議編譯器把實(shí)參存入寄存器中而不是堆棧中。例如:void function(register int i, register long j)。代碼優(yōu)化代碼優(yōu)化12l減少或避免執(zhí)行耗時(shí)的操作減少或避免執(zhí)行耗時(shí)的操作 應(yīng)用程序的大量運(yùn)行時(shí)問(wèn)通?;ㄙM(fèi)在關(guān)鍵程序模塊,關(guān)鍵模塊往

10、往包含循環(huán)或嵌套循環(huán)。減少循環(huán)中耗時(shí)的操作,可以提高程序的執(zhí)行速度。常見(jiàn)的耗時(shí)操作有:輸入/輸出操作、文件訪問(wèn)、圖形界面操作和系統(tǒng)調(diào)用等。其中,如果無(wú)法避免文件的讀寫(xiě),那么對(duì)文件的訪問(wèn)將是影響程序運(yùn)行速度的一大因素。提高文件訪問(wèn)速度的方法有兩種:一種是采用內(nèi)存映射文件;另一種是使用內(nèi)存緩存。代碼優(yōu)化代碼優(yōu)化13l提高提高switch語(yǔ)句的效率語(yǔ)句的效率 當(dāng) switch 語(yǔ)句中的 case 標(biāo)號(hào)很多時(shí),為了減少比較的次數(shù),可以把發(fā)生頻率相對(duì)高的條件放到第一位或者把整個(gè) switch 語(yǔ)句轉(zhuǎn)化嵌套 switch 語(yǔ)句。把發(fā)生頻率高的 case 標(biāo)號(hào)放在最外層的 switch 語(yǔ)句中,發(fā)生相對(duì)頻率

11、相對(duì)低的 case 標(biāo)號(hào)放在另外的 switch 語(yǔ)句中。如例 3 中,把發(fā)生率高的case 標(biāo)號(hào)放在外層的 switch 語(yǔ)句中,把發(fā)生頻率低的放在缺省的(default)內(nèi)層 switch 語(yǔ)句中。代碼優(yōu)化代碼優(yōu)化14l提高循環(huán)語(yǔ)句的效率提高循環(huán)語(yǔ)句的效率 循環(huán)體是程序設(shè)計(jì)和優(yōu)化的重點(diǎn),對(duì)于一些不需要循環(huán)變量參加運(yùn)算的模塊,可以把它放到循環(huán)的外面。對(duì)于次數(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)開(kāi)銷”。在ARM處理器上,減法指令需要1個(gè)

12、周期,條件分支指令需要3個(gè)周期,這樣每個(gè)循環(huán)另加了4個(gè)周期的開(kāi)銷??梢圆捎醚h(huán)展開(kāi)的方法來(lái)提高循環(huán)運(yùn)行的速度,即:重復(fù)循環(huán)主題多次,并按同樣的比例減少循環(huán)次數(shù)來(lái)減小循環(huán)的開(kāi)銷,以增加代碼尺寸。來(lái)?yè)Q取程序的運(yùn)行速度。代碼優(yōu)化代碼優(yōu)化15在多重循環(huán)中,應(yīng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層。這樣可以減少 CPU跨切循環(huán)的次數(shù)。如例 1-1 的效率比 1-2 的效率要低:代碼優(yōu)化代碼優(yōu)化16如果循環(huán)體內(nèi)有邏輯判斷,并且循環(huán)次數(shù)大,應(yīng)把循環(huán)判斷移到循環(huán)體外。如例 2-1比例 2-2 多執(zhí)行了 K-1 次判斷,而且由于前者頻繁進(jìn)行判斷,打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對(duì)循環(huán)進(jìn)行優(yōu)化處理,

13、降低了效率。代碼優(yōu)化代碼優(yōu)化17l函數(shù)調(diào)用函數(shù)調(diào)用 高效的調(diào)用函數(shù),盡量限制使用函數(shù)的參數(shù)個(gè)數(shù),不要超過(guò)4個(gè)。ARM調(diào)用時(shí),4個(gè)以下的形參通過(guò)寄存器傳遞,第5個(gè)以上的形參通過(guò)存儲(chǔ)器棧傳遞。如果有更多的參數(shù)調(diào)用,則可將相關(guān)的參數(shù)組織在一個(gè)結(jié)構(gòu)體內(nèi),用傳遞結(jié)構(gòu)體指針來(lái)代替參數(shù)。代碼優(yōu)化代碼優(yōu)化18l內(nèi)聯(lián)函數(shù)和內(nèi)嵌匯編內(nèi)聯(lián)函數(shù)和內(nèi)嵌匯編 對(duì)性能影響大的重要函數(shù)可以使用關(guān)鍵字inline內(nèi)聯(lián),那么在調(diào)用它的地方將會(huì)用函數(shù)體來(lái)替代函數(shù)調(diào)用語(yǔ)句,第一,省去了調(diào)用指令需要的執(zhí)行時(shí)間;第二,省去了傳遞變?cè)蛡鬟f過(guò)程需要的時(shí)間。但是使用這種方法在優(yōu)化程序速度的同時(shí),增加了代碼尺寸,因此需要更多的 ROM。使用這

14、種優(yōu)化在inline函數(shù)頻繁調(diào)用并且只包含幾行代碼的時(shí)候是最有效的。程序中對(duì)時(shí)間要求苛刻的部分可以內(nèi)嵌匯編來(lái)編寫(xiě),適當(dāng)?shù)氖褂脙?nèi)嵌匯編指令可以有效的提高整個(gè)系統(tǒng)運(yùn)行的效率。代碼優(yōu)化代碼優(yōu)化19l利用硬件特性利用硬件特性 為了提高程序的運(yùn)行效率,要充分利用硬件特性來(lái)減小其運(yùn)行開(kāi)銷,例如減少中斷次數(shù)、利用DMA(Direct Memory Access)傳輸方式等。 CPU對(duì)各種存儲(chǔ)器的訪問(wèn)速度排序依次為:CPU內(nèi)部RAM外部同步RAM外部異步RAMFlashROM。對(duì)于已經(jīng)燒錄在Flash或ROM中的程序代碼,如果讓CPU直接從中讀取代碼執(zhí)行,運(yùn)行速度較慢,則可在系統(tǒng)啟動(dòng)后將Flash或ROM中的目標(biāo)代碼拷貝至RAM中后執(zhí)行,以提高程序的運(yùn)行速度。代碼優(yōu)化代碼優(yōu)化20 嵌入式程序的性能優(yōu)化與軟件的開(kāi)發(fā)周期、開(kāi)發(fā)成本、軟嵌入式程序的性能優(yōu)化與軟件的開(kāi)發(fā)周期、開(kāi)發(fā)成本、軟件的可讀性之聞通常存在矛盾。要權(quán)衡利弊,作出折中的選擇件的可讀性之聞通常存在矛盾。要權(quán)衡利弊,作出折中的選擇。將算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化作為首選優(yōu)化技術(shù);然后根據(jù)功

溫馨提示

  • 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)論