嵌入式系統軟體最佳化方法

來源:互聯網
上載者:User

嵌入式系統由於受功耗、成本和體積等因素的制約,嵌入式微處理器的處理能力與案頭系統處理器相比也存在較大差距,故嵌入式系統對程式啟動並執行空間和時間要求更為苛刻。通常,需要對嵌入式應用程式進行效能最佳化,以滿足嵌入式應用的效能需求。
1 嵌入式程式最佳化的類型
嵌入式應用程式最佳化,指在不改變程式功能的情況下,通過修改原來程式的演算法、結構,並利用軟體開發工具對程式進行改進,使修改後的程式運行速度更高或代碼尺寸更小。

按照最佳化的側重點不同,程式最佳化可分為運行速度最佳化和代碼尺寸最佳化。運行速度最佳化是指在充分掌握軟硬體特性的基礎上,通過應用程式結構調整等手段來縮短完 成指定任務所需的已耗用時間;代碼尺寸最佳化則是指應用程式在能夠正確實現所需功能的前提下,儘可能減小程式的代碼量。實際應用中,這兩者往往是相互矛盾的, 為了提高程式運行速度,就要以增加代碼量為代價;而為了減小程式代碼尺寸,可能又要以降低程式運行速度為代價。因此,在對程式進行最佳化之前,應根據實際需 要來制定具體的最佳化策略。隨著電腦和微電子技術的不斷髮展,儲存空間已不再是制約嵌入式系統的主要因素,因此本文主要討論運行速度最佳化。
2 嵌入式程式最佳化遵循的原則
嵌入式程式最佳化主要遵循以下3個原則。
①等效原則:最佳化前後程式實現的功能一致。
②有效原則:最佳化後要比最佳化前運行速度快或佔用儲存空間小,或二者兼有。
③經濟原則:最佳化程式要付出較小的代價,取得較好的結果。

3 嵌入式程式最佳化的主要方面
嵌入式程式的最佳化分為3個方面:演算法和資料結構最佳化、編譯最佳化以及代碼最佳化。

3.1 演算法和資料結構最佳化
演算法和資料結構是程式設計的核心所在,演算法的好壞在很大程度上決定了程式的優劣。為了實現某種功能,通常可以採用多種演算法,不同演算法的複雜度和效率差別很 大。選擇一種高效的演算法或對演算法進行最佳化,可以使應用程式獲得更高的最佳化效能。例如:在資料搜尋時,二分尋找法要比順序尋找法快。遞迴程式需要大量的過程 調用,並在堆棧中儲存所有返回過程的局部變數,時間效率和空間效率都非常低;若根據實際情況對遞迴程式採用迭代、堆棧等方法進行非遞迴轉換,則可大幅度提 高程式的效能。

資料結構在程式的設計中也佔有重要的地位。例如:如果在一些無序的資料中多次進行插入、刪除資料項目操作,那麼採用鏈表結構就會比較快。

演算法和資料結構最佳化是首選的最佳化技術。

3.2 編譯最佳化
現 在,很多的編譯器都具有一定的代碼最佳化功能。在編譯時間,借用並行程式設計技術,進行相關性分析;獲得來源程式的語義資訊,採用軟體流水線、資料規劃、迴圈重 構等技術,自動進行一些與處理器體系無關的最佳化,產生高品質的代碼。許多編譯器有不同層級的最佳化選項,可以選用一種合適的最佳化方式。通常情況下,如果選用 了最進階別的最佳化方式,那麼編譯器將片面追求代碼的最佳化,有時會導致錯誤。

另外,還有一些專用的編譯器針對某些體繫結構進行了最佳化設計,可以充分利用硬體資源來產生高品質的代碼。例如:Microsoft eMbedded Visual C++版的Intel編譯器完全針對Intel XScale體系,經過高度最佳化,能建立運行速度更快的代碼。此編譯器採用了多種最佳化技術,包括最佳化指令管道操作的調度技術、雙重載入與儲存Intel XScale技術功能支援以及過程間最佳化(將函數使用的變數存放到寄存器,以便快速存取)等。

在嵌入式軟體開發過程中應選擇一種最佳化能力強的編譯器,充分利用其代碼最佳化功能,產生高效的代碼,提高程式的運行效率。

3.3 代碼最佳化
代碼最佳化,就是採用組合語言或更精簡的程式碼來代替原有的代碼,使編譯後的程式運行效率更高。編譯器可以自動完成程式段和代碼區塊範圍內的最佳化,但很難擷取程式語義資訊、演算法流程和程式運行狀態資訊,因而需要編程人員進行手工最佳化。以下是一些常用的最佳化技術和技巧。

(1)代碼替換
使用周期短的指令代替周期長的指令,以降低運算的強度。
①減少除法運算。用關係運算子兩邊乘除數避免除法操作,還有一些除法和模數的運算可以用位操作來代替。因為位操作指令只需一個指令周期,而“/”運算則需要調用子程式,代碼長,執行慢。例如:
最佳化前if((a/b)>c)和a=a/4
最佳化後if(a>(b*c))和a=a>>2
②減少乘方運算。例如:
最佳化前a=pow(a,3.0)
最佳化後a=a*a*a
③使用白加、自減指令。例如:
最佳化前a=a+1、a=a-l
最佳化後a++、a--或inc、dec
④盡量使用小的資料類型。在所定義的變數滿足使用要求的條件下,優先使用順序為:字元型(char)>整型(im)>長整型(long int)>浮點型(float)。
對除法來說,使用無符號數比有符號數會有更高的效率。在實際調用中,盡量減少資料類型的強制轉換;少用浮點運算,如果運算的結果能夠控制在誤差之內,則可用長整型代替浮點型。

(2)全域變數與局部變數
少用全域變數,多用局部變數。全域變數是放在資料存放區器中的,定義了全域變數,MCU就少了一個可以利用的資料存放區器空間,太多的全域變數,會導致編譯器 無足夠的記憶體配置;而局部變數則大多定位於MCU內部的寄存器中。在絕大多數的MCU中,使用寄存器的操作速度比資料存放區器快,指令也更靈活,有利於產生 品質更高的代碼,而且局部變數所佔用的寄存器和資料存放區器在不同的模組中可以重複利用。

(3)使用寄存器變數
當一個變數被頻繁讀/寫時,需要反覆訪問記憶體,花費大量的存取時間。為了提高訪問效率,可以使用CPU寄存器變數,不需要訪問記憶體,直接進行讀/寫。迴圈 次數較多的迴圈控制變數及迴圈體內反覆使用的變數均可定義為寄存器變數,而迴圈計數是應用寄存器變數的最佳選擇。只有局部自動變數和形參才可以定義為寄存 器變數。因為寄存器變數屬於動態儲存裝置方式,因此凡需要採用靜態儲存方式的變數都不能定義為寄存器變數。寄存器變數的說明符是register。下面是一個 採用寄存器變數的例子:

(4)減少或避免執行耗時的操作
應用程式的大量運行時問通常花費在關鍵程式模組,關鍵模組往往包含迴圈或嵌套迴圈。減少迴圈中耗時的操作,可以提高程式的執行速度。常見的耗時操作有:輸 入/輸出操作、檔案訪問、圖形介面操作和系統調用等。其中,如果無法避免檔案的讀/寫,那麼對檔案的訪問將是影響程式運行速度的一大因素。提高檔案訪問速 度的方法有兩種:一種是採用記憶體對應檔;另一種是使用記憶體緩衝。

(5)switch語句用法的最佳化
編程時,對case值按照可能性排序,將最可能發生的情況放在第一個,最不可能的情況放在最後一個,可以提高switch語句塊的執行速度。

(6)迴圈體的最佳化
迴圈體是程式設計和最佳化的重點,對於一些不需要迴圈變數參加運算的模組,可以把它放到迴圈的外面。對於次數固定的迴圈體,for迴圈比while迴圈效率更高,減計數迴圈比增計數迴圈速度快。例如:

實際運行時,每次迴圈需要在迴圈體外加兩條指令:一條減法指令(減少迴圈計數值)和一條條件分支指令。這些指令稱為“迴圈開銷”。在ARM處理器上,減法 指令需要1個周期,條件分支指令需要3個周期,這樣每個迴圈另加了4個周期的開銷。可以採用迴圈展開的方法來提高迴圈啟動並執行速度,即:重複迴圈主題多次, 並按同樣的比例減少迴圈次數來減小迴圈的開銷,以增加代碼尺寸。來換取程式的運行速度。。

(7)函數調用
高效的調用函數,盡量限制使用函數的參數個數,不要超過4個。ARM調用時,4個以下的形參通過寄存器傳遞,第5個以上的形參通過儲存空間棧傳遞。如果有更多的參數調用,則可將相關的參數組織在一個結構體內,用傳遞結構體指標來代替參數。

(8)內嵌函式和內嵌彙編
對效能影響大的重要函數可以使用關鍵字_inline內聯,會省去調用函數的開銷,負面影響是增加了代碼尺寸。程式中對時間要求苛刻的部分可以用內嵌彙編來編寫,通常可以帶來速度上的顯著提高。

(9)查表代替計算
在程式中盡量不進行非常複雜的運算,如浮點數的開方。對於這些消耗時間和資源的運算,可以採用空間換取時間的方法。預先將函數值計算出來,置於程式儲存區中,以後程式運行時直接查表即可,減小了程式執行過程中重複計算的工作量。

(10)使用針對硬體最佳化的函數庫
Intel公司為XScale處理器設計的GPP(Graphics Performance Primitives library)/IPP(Integrated Perform-ance Primitives library)庫,針對多媒體處理、圖形處理和數值運算的一些典型操作和演算法進行了手工最佳化,可以很好地發揮XScale硬體的計算潛能,達到很高的執 行效率。

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

CPU對各種儲存空間的訪問速度排序依次為:CPU內部RAM>外部同步RAM>外部非同步RAM>Flash/ROM。對於已經燒錄在 Flash或ROM中的程式碼,如果讓CPU直接從中讀取代碼執行,運行速度較慢,則可在系統啟動後將Flash或ROM中的目標代碼拷貝至RAM中後 執行,以提高程式的運行速度。
4 結論
嵌入式程式的效能最佳化與軟體的開發週期、開發成本、軟體的可讀性之聞通常存 在矛盾。要權衡利弊,作出折中的選擇。將演算法和資料結構最佳化作為首選最佳化技術;然後根據功能、效能差異和投資預算等因素選擇高效的編譯器、系統運行庫和圖 形庫;使用效能監測工具偵測佔主要已耗用時間的程式熱點,採用代碼最佳化手段對其進行最佳化;最後使用高效的編譯器進行編譯最佳化,從而得到高品質的代碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.