高效率嵌入式程式開發

2021-04-12 14:59:59 字數 1984 閱讀 9171

[日期:2006-12-13]

[字型:大 中 小]

引言

在多**、通訊等計算複雜度高的應用中,為了滿足製造費用、功耗、效能以及實時性等諸多限制條件的要求,嵌入式系統程式往往需要特殊設計。這使得設計師在設計面向特定應用的嵌入式軟體時,需要有一套切實可行的程式設計準則。而在實際程式設計中,工程師尤其需要考慮對變數的使用和迴圈程式的處理。

變數使用

在進行實際程式開發時,變數的使用至關重要,其中使用全域性變數比向函式傳遞引數更加有效,這樣免去了函式呼叫時引數入棧和出棧的需要。當然,使用全域性變數會對程式有一些***。變數定義的次序會導致最終映像中資料布局的不同,如圖1所示。

740)this.width=740" border=undefined>

圖1 變數映像次序混亂狀況

由此可見,在宣告變數時,需要考慮怎樣最佳地控制儲存器布局。最好的方法是在程式設計的時候,把所有相同型別的變數放在一起定義。

通常,工程師設法使用short或char來定義變數以節省儲存器空間。在函式的區域性變數數目有限的情況下,編譯器會把區域性變數分配給內部暫存器,每個變數占用乙個暫存器。在這種情況下,使用short和char型變數不但不會節省空間,反而會帶來其它的***。如圖2所示:假定a是任意可能的暫存器,儲存函式的區域性變數。同樣完成加1的操作,32位的int型變數最快,只用一條加法指令。而8位和16位變數,完成加法操作後,還需要在32位的暫存器中進行符號擴充套件。其中,帶符號的變數,要用邏輯左移和算術右移兩條指令才能完成符號擴充套件;無符號的變數,要使用一條邏輯與指令對符號位進行清零。所以,使用32位的int或unsigned int區域性變數最有效。某些情況下,函式從外部儲存器讀入區域性變數進行計算,這時候,需要把不是32位的變數轉換成32位。至於把8位或16位變數擴充套件成32位後,隱藏了原來可能溢位異常這個問題,需要進一步仔細考慮。

迴圈程式的處理

計數迴圈是程式中常用的流程控制結構。在c中,類似下面的for迴圈比比皆是:

for(loop=1;loop<=limit;loop++)

這種累加計數的方法符合一般的自然思維習慣,所以比下面的遞減計數方法使用更多:

for(loop<=limit;loop!=0; loop--)

這兩者在邏輯上並沒有效率差異,但是對映到具體的體系結構中,就產生了很大的不同。

累加法比遞減法多用了一條指令,當迴圈次數比較多的時候,這兩段**就會在效能上產生明顯的差異。分析其本質原因,在於當進行乙個非零常數比較時,必須用專門的cmp指令來執行;而當乙個變數與零進行比較時,arm指令可以直接利用條件執行的特性(ne)來進行判斷。很多時候迴圈展開由編譯器自動完成,不過應注意對中間變數或結果被更改的迴圈,編譯程式往往拒絕展開,這時候就需要工程師自己來做展開工作了。

尤其值得注意的是,在有內部指令cache的cpu上(如arm946es晶元),因為迴圈展開的**很大,往往會出現高速緩衝儲存器溢位。這時展開的**會頻繁地在cpu的高速緩衝儲存器和記憶體之間來**用,又因為高速緩衝儲存器速度很高,所以此時迴圈展開反而會變慢。同時,迴圈展開會影響向量運算優化。

arm處理器核對nz(零比較轉移)有特別的指令處理,速度非常快,如果你的迴圈對方向不敏感,可以由大向小迴圈。需要注意的是,如果指標操作使用了i值,這種方法可能引起指標索引超界的嚴重錯誤(i = max+1)。當然你可以通過對i做加減運算來糾正,但是如果這樣就沒有提高效率的作用了。

結語

本文對高效率嵌入式arm程式開發總結了一些程式設計技巧。在實際的嵌入式系統開發中,可以大大的提高系統的效能,特別是在多**和通訊等複雜度高的應用中,對程式設計具有指導意義。

參考文獻:

1 marshall p. cline and greg a. lomow. c++ faqs, addison-wesley, 1995

2 bruce eckel. thinking in c++(c++ 程式設計思想,劉宗田 等譯),機械工業出版社,2000

嵌入式開發

經常會有人說嵌入式開發,嵌入式開發千差萬別,我總體上分為4個等級 微電子開發 rtos開發 指令碼開發 富應用開發 這一類產品行為比較固定,比如說電視遙控器,遙控汽車,電飯煲,恆溫燒水壺,溫濕度感測器,智慧型門鎖等。這些裝置行為都比較簡單,通過按鈕可以設定系統功能和行為。量不大,經常會選用flash...

初識嵌入式 嵌入式開發概述

1 什麼是嵌入式技術 1 嵌入式軟體與非嵌入式軟體的區別?答 嵌入式軟體是結合作業系統之上做的開發 非嵌入式軟體是做的裸機開發。裸機 沒有作業系統 2 嵌入式開發與微控制器開發的區別?答 區別 是否有作業系統。拓展 答 優點 解決了軟體的移植性 解決了開發人員的能力的劃分問題。提供了豐富的網路協議 ...

嵌入式應用程式開發

嵌入式應用程式開發 實驗目的 1.編寫程式,用交叉工具鏈編譯連線 實驗原理 1.嵌入式應用程式的開發一般都在宿主機平台上進行,利用交叉編譯器編譯,生成可以在目標平台上執行的可執行 本實驗使用的交叉編譯器是arm linux gcc 實驗內容 l include include int main l2...