基于ARM處理器的軟件優(yōu)化設(shè)計
2.4 選擇字節(jié)
對于習(xí)慣使用高級語言編程的開發(fā)者,大都喜歡用if-then-else語句來控制程序流程.但高級語苦編寫的程序最終都要轉(zhuǎn)換為體現(xiàn)機(jī)器指令的匯編程序,往往一條高級語占語句需要轉(zhuǎn)換成很多條匯編指令,除編程方便外,高級語言在執(zhí)行效率和存儲空間上都沒有優(yōu)勢。Thumb-2指令中提供一條類似于if-then-else語句的指令,具體格式如表3所示。
使用SEL指令能夠?qū)崿F(xiàn)程序的流程控制,而且一條匯編指令實現(xiàn)了4條if-then-else語句的功能,只是每條分支只能為字符型數(shù)據(jù)賦值,相當(dāng)于c語言中的4個條件運算符語句。
表3 SEL指令
2.5寄存器倒轉(zhuǎn)
一些強調(diào)算法(如FFT)的程序通常要求把源寄存器的hit[n]賦值到目標(biāo)寄存器的bit[31-n],比特倒轉(zhuǎn)指令RBIT就能夠很好地實現(xiàn)。如果不使用該指令,實現(xiàn)同樣的功能會需要很多條移位指令和邏輯操作指令才能完成,同時還需要一個保存中間變量的寄存器。而使用比特反轉(zhuǎn)指令能明顯降低需要的指令的數(shù)目和節(jié)約寄存器。
Thumb-2指令中的寄存器倒轉(zhuǎn)語句如表4所示,包含比特倒轉(zhuǎn)、字節(jié)倒轉(zhuǎn)及帶符號倒轉(zhuǎn)。
表4倒轉(zhuǎn)指令集
對于一些編碼/解碼或加密/解密程序通常要求對數(shù)據(jù)進(jìn)行高低字節(jié)互換,字節(jié)倒轉(zhuǎn)指令REV
2.6實現(xiàn)跳轉(zhuǎn)表
使用跳轉(zhuǎn)表來控制程序的執(zhí)行方向足高級語言的一個常見特性,使用ARM和Thumb指令集都可以很好的實現(xiàn)這個功能。使用ARM指令集一般是為了生成高性能的代碼,編澤器會以代碼密度為代價對性能進(jìn)行優(yōu)化。而Thumb編譯器則會使用壓縮的數(shù)據(jù)表來盡可能的降低代碼大小。
Thumb-2指令集引入了兩條跳轉(zhuǎn)表指令TBB和TBH,分別對應(yīng)字節(jié)分支跳轉(zhuǎn)和半字分支跳轉(zhuǎn)。它綜合了ARM/Thumb的優(yōu)點,在壓縮的數(shù)據(jù)表上可以使用最少的指令來實現(xiàn)跳轉(zhuǎn)表功能,最終可以以最小的代碼和數(shù)據(jù)實現(xiàn)最優(yōu)的性能。
2.7 改善小額數(shù)值運算速度
對于普通的控制系統(tǒng)或數(shù)據(jù)采集系統(tǒng),精度往往并不要求很高,12位數(shù)據(jù)已經(jīng)足夠,但ARM指令和Thumb指令都不提供12位立即數(shù)的相關(guān)指令(前文已經(jīng)說明,ARM指令中的12位立即數(shù)的有效位數(shù)是8)。ThurIlb-2技術(shù)提供2條12位立即數(shù)參與加法和減法運算的指令,指令格式如表5所示,利用這2條指令能夠改善數(shù)據(jù)處理速度。
表5 12位立即數(shù)的算術(shù)運算
特別是閉環(huán)控制系統(tǒng),需要根據(jù)預(yù)設(shè)值和反饋值計算偏移量,并根據(jù)偏移量來控制被控對象。預(yù)設(shè)值通常是一個常量,在系統(tǒng)運行過程中都不會改變。習(xí)慣于高級語言編程的開發(fā)者喜歡使用宏定義的方式來設(shè)置該常量,但讀取保存在內(nèi)存中的常量會降低數(shù)據(jù)處理速度,如果把常量保存在寄存器當(dāng)中則浪費一個非常宗貴寄存器。針對預(yù)設(shè)值不易改變的情況,直接使用12位立即數(shù)來表示該預(yù)設(shè)常量并直接參與算術(shù)運算的方式既可以節(jié)約存儲空間,還能夠改善數(shù)據(jù)處理速度,而且與12位AD轉(zhuǎn)換器做反饋采樣環(huán)節(jié)剛好對應(yīng)。
2.8最大限度地使用寄存器
像ARM這樣的load-store體系結(jié)構(gòu)的處理器上,訪問寄存器中的數(shù)據(jù)要比訪問存儲器中的數(shù)據(jù)效率高很多,為軟件變量分配寄存器要遠(yuǎn)比分配存儲空間性能優(yōu)越。
ARM Cortex處理器共有14個通用寄存器,實際工程應(yīng)用軟件巾的變量數(shù)大多超出14個,但數(shù)值較小,可以把多個變量存放在一個寄存器當(dāng)中。還可以讓不同函數(shù)的局部變量對寄存器進(jìn)行時分復(fù)用,以充分發(fā)揮寄存器的優(yōu)勢。
2.9其他
Thumb-2技術(shù)提供2條過零檢測并跳轉(zhuǎn)的指令CBZ和CBNZ。分別對應(yīng)檢測到零跳轉(zhuǎn)或檢測到非零跳轉(zhuǎn)。該指令可以被用來替換常用的一個指令序列:與零比較,以及隨后的跳轉(zhuǎn)指令,這樣的指令序列通常被用來檢查指針是否為空。Thumb-2指令集中還增加了訪問協(xié)處理器的指令,這樣Thumb-2代碼就可以直接支持欠量浮點防處理器,以及其他的協(xié)處理器。配合其他訪問系統(tǒng)寄存器的指令。整個應(yīng)用程序就都可以用Thumb-2指令來實現(xiàn),不必再切換的ARM狀態(tài)才能實現(xiàn)一些特殊的功能。
3 結(jié)束語
在一個應(yīng)用程序中,要實現(xiàn)最好的性能.就需要編寫優(yōu)化的匯編程序。只不過是對性能影響最大的關(guān)鍵程序才值得優(yōu)化。可以使用性能分析器或者指令周期計數(shù)工具來找這些敏感的關(guān)鍵程序段。優(yōu)化程序的基本思想就是盡可能地壓縮代碼尺寸以節(jié)省存儲空間,盡可能提高程序的執(zhí)行效率以獲得更高的性能,并降低功耗。
評論