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