引言 隨著(zhù)嵌入式系統在工業(yè)控制、汽車(chē)系統、家庭網(wǎng)絡(luò )、醫療衛生、無(wú)線(xiàn)技術(shù)等領(lǐng)域內的大量應用,嵌入式系統開(kāi)發(fā)者必須面對務(wù)種復雜的挑戰,其中就包括如何在代碼性能和系統成本之間進(jìn)行平衡。在這方面,ARM處理器可以提供給開(kāi)發(fā)者業(yè)界領(lǐng)先的技術(shù)方案ARM Cortex系列提供了一個(gè)標準的體系結構來(lái)滿(mǎn)足各種技術(shù)的不同性能要求,是專(zhuān)門(mén)針對功耗和成本敏感的嵌入式應用領(lǐng)域實(shí)現高性能而設計的,它大大簡(jiǎn)化了編程的復雜性,其成熟的技術(shù)使ARM架構成為各種應用的上佳選擇。 ARM Cortex處理器的統一技術(shù)是Thumb-2技術(shù),它以現有的ARM技術(shù)為基礎,綜合了ARM指令和Thumb指令的優(yōu)勢,對優(yōu)化嵌人式軟件設計具有獨到的優(yōu)勢,提供了最佳的代碼密度,能更合理地使用存儲器,對于靠近處理器內核的高速存儲器至關(guān)重要,即使只節省小部分內存,也將大大提高系統的性能,大幅降低功耗。 1 Thumb-2 指令簡(jiǎn)介 并非所有的運算都能夠映射到Thumb指令集,有時(shí)需要多條Thumb指令來(lái)模擬一條32位指令的任務(wù)。而且Thumb指令不能訪(fǎng)問(wèn)協(xié)處理器,不能使用異常中斷指令,不支持媒體功能,當應用中有這些需求而且對存儲器窄問(wèn)要求較高時(shí),必須混合使用ARM指令和Thumb指令,處理器內核根據需要切換到Thumb狀態(tài)以獲取高代碼密度或切換到ARM狀態(tài)以獲取出色的性能。在開(kāi)發(fā)階段,為r充分利用存儲器,需要反復調整哪些代碼使用ARM指令、哪些代碼使用Thumb指令。往往只有等到軟件和硬件完成后,才能最終決定ARM/Thumb指令的使用方式,這些因素會(huì )使開(kāi)發(fā)流程變得非常復雜。 Thumb-2技術(shù)足對ARM架構的非常重要的擴展,它可以改善Thumb指令集的性能。Thumb-2指令集在現有的Thumb指令的基礎上做了如下的擴充: · 增加了一些新的16位Thumb指令來(lái)改進(jìn)程序的執行流程 · 增加了一些新的32位Thumb指令以實(shí)現一些ARM指令的專(zhuān)有功能。 · 擴充原有的ARM指令,增加了一些新的指令來(lái)改善代碼性能和數據處理的效率。 使用Thumb-2指令就不需要在A(yíng)RM/Thumb狀態(tài)之間反復切換了,代碼密度和性能得到的顯著(zhù)的提高。 2 使用Thumb-2指令優(yōu)化設計 對于已經(jīng)有ARM處理器開(kāi)發(fā)經(jīng)驗的嵌入式開(kāi)發(fā)工程師析言,使用Thumb-2技術(shù)是非常簡(jiǎn)單的,因為T(mén)humb-2技術(shù)是在A(yíng)RM和Thumb基礎上經(jīng)過(guò)創(chuàng )新后發(fā)展起來(lái)的,它繼承了原有的基本編程方法,同時(shí)具備ARM/Thumb不可比擬的優(yōu)越性。開(kāi)發(fā)人員在設計嵌入式軟件時(shí),只需要重點(diǎn)關(guān)注對整體性能影響最大的那部分代碼設計,就能夠平衡好性能、代碼密度和功耗之間的關(guān)系。 2.1 減小漢名(Hamming)距離 表1漢名距離變化對比 ![]() 如表1所示,兩組代碼都是用于計算表達式(x1+x2)x(x3-x4)的值,分別使用3條指令束實(shí)現。每條指令先成的功能、字書(shū)數、寄存器的使用數目、操作碼都完全一樣,不同之處就是各寄存器操作數的二進(jìn)制編碼不同。 Rd代表目標寄存器,Rn和Rm代表源操作數寄存器。執行原代碼時(shí),Rd的比特位變化4次,Rn和Rm分別變化3次和5次,操作數總的比特位變化12次。執行優(yōu)化后的代碼時(shí),操作數總的比特位變化為6次,僅為原代碼的一半,能有效地降低指令執行時(shí)的功耗。 2.2擅用16位常數指令 Thumb-2指令集中增加了2條關(guān)于16位常數的新指令。MOVW可以把一個(gè)16位常數加載到寄存器中,并用0填充寄存器的高16位;另一條指令MOVT可以把一個(gè)16位常數加載到寄存器的高16位中。這兩條指令組合使用就可以把一個(gè)32位常數加載到寄存器中。 操作32位立即數或是訪(fǎng)問(wèn)外設,都需要把32位常數加載到寄存器中。對于原來(lái)的ARM/Thumb指令系統,因指令編碼位數限制.最多只能使用12位常數,且其有效位數只有8位,另外4位用于移位。對任意一個(gè)32位的立即數或者一個(gè)地址值讀取到寄存器需要使用到LDR偽指令,編澤器把該32位數據放在數據緩沖區中,同時(shí)用基于PC的LDR指令讀取該數據,程序執行時(shí),會(huì )在處理器中引起額外的開(kāi)銷(xiāo),這些開(kāi)銷(xiāo)來(lái)自于需要額外的時(shí)鐘周期使數據端口能夠對指令流進(jìn)行訪(fǎng)問(wèn)。 用兩條指令把32位常數分成兩個(gè)16位常數分兩次加載到寄存器中,意味著(zhù)數據直接在指令流內部,不再需要通過(guò)數據端口來(lái)訪(fǎng)問(wèn)。相對于LDR偽指令方式,這種解決辦法可以消除通過(guò)數據端口訪(fǎng)問(wèn)指令流的額外開(kāi)銷(xiāo),進(jìn)而提高性能,降低功耗。 2.3靈活應用位操作指令 嵌入式軟件開(kāi)發(fā)者經(jīng)常會(huì )碰到位操作方面的問(wèn)題,如需要對某個(gè)變量中的某幾位賦值或復位。提取寄存器的部分數據位信息,寄存器中插入固定比特信息等,開(kāi)發(fā)人員往往采用邏輯運算指令和移位操作指令的組合來(lái)實(shí)現。如表2所爾,兩組代碼完成的功能一樣,把寄存器R1和寄存器R2的有用信息集中壓縮到寄存器R0中,以節省寄存器。R1的有用信息為R1[15:0],R2的有用信息為R2[24:8]。對于原代碼,因為需要屏蔽寄存器R1和R2的16位數據,需要16位常數參與,所以使用MOVW指令把16位常數引入,完成程序功能共用了4條指令,還額外使用寄存器R3來(lái)存放中間變量。優(yōu)化后的代碼只需要一條指令即可實(shí)現,而且不需要額外的寄存器參與計算。 表2位操作指令對比 ![]() 除PKHBT指令外。Thumb-2技術(shù)還提供PKHTB、BFC、BFI、SBFX、UBFX等位操作指令。這樣,開(kāi)發(fā)者進(jìn)行比特位的插入和抽取所需的指令數目就可以明顯減少,使用壓縮的數據結構也會(huì )更加方便。而代碼對寄存器的需求也會(huì )降低。 2.4 選擇字節 對于習慣使用高級語(yǔ)言編程的開(kāi)發(fā)者,大都喜歡用if-then-else語(yǔ)句來(lái)控制程序流程.但高級語(yǔ)苦編寫(xiě)的程序最終都要轉換為體現機器指令的匯編程序,往往一條高級語(yǔ)占語(yǔ)句需要轉換成很多條匯編指令,除編程方便外,高級語(yǔ)言在執行效率和存儲空間上都沒(méi)有優(yōu)勢。Thumb-2指令中提供一條類(lèi)似于if-then-else語(yǔ)句的指令,具體格式如表3所示。 使用SEL指令能夠實(shí)現程序的流程控制,而且一條匯編指令實(shí)現了4條if-then-else語(yǔ)句的功能,只是每條分支只能為字符型數據賦值,相當于c語(yǔ)言中的4個(gè)條件運算符語(yǔ)句。 表3 SEL指令 ![]() 2.5寄存器倒轉 一些強調算法(如FFT)的程序通常要求把源寄存器的hit[n]賦值到目標寄存器的bit[31-n],比特倒轉指令RBIT就能夠很好地實(shí)現。如果不使用該指令,實(shí)現同樣的功能會(huì )需要很多條移位指令和邏輯操作指令才能完成,同時(shí)還需要一個(gè)保存中間變量的寄存器。而使用比特反轉指令能明顯降低需要的指令的數目和節約寄存器。 Thumb-2指令中的寄存器倒轉語(yǔ)句如表4所示,包含比特倒轉、字節倒轉及帶符號倒轉。 表4倒轉指令集 ![]() 對于一些編碼/解碼或加密/解密程序通常要求對數據進(jìn)行高低字節互換,字節倒轉指令REV 2.6實(shí)現跳轉表 使用跳轉表來(lái)控制程序的執行方向足高級語(yǔ)言的一個(gè)常見(jiàn)特性,使用ARM和Thumb指令集都可以很好的實(shí)現這個(gè)功能。使用ARM指令集一般是為了生成高性能的代碼,編澤器會(huì )以代碼密度為代價(jià)對性能進(jìn)行優(yōu)化。而Thumb編譯器則會(huì )使用壓縮的數據表來(lái)盡可能的降低代碼大小。 Thumb-2指令集引入了兩條跳轉表指令TBB和TBH,分別對應字節分支跳轉和半字分支跳轉。它綜合了ARM/Thumb的優(yōu)點(diǎn),在壓縮的數據表上可以使用最少的指令來(lái)實(shí)現跳轉表功能,最終可以以最小的代碼和數據實(shí)現最優(yōu)的性能。 2.7 改善小額數值運算速度 對于普通的控制系統或數據采集系統,精度往往并不要求很高,12位數據已經(jīng)足夠,但ARM指令和Thumb指令都不提供12位立即數的相關(guān)指令(前文已經(jīng)說(shuō)明,ARM指令中的12位立即數的有效位數是8)。ThurIlb-2技術(shù)提供2條12位立即數參與加法和減法運算的指令,指令格式如表5所示,利用這2條指令能夠改善數據處理速度。 表5 12位立即數的算術(shù)運算 ![]() 特別是閉環(huán)控制系統,需要根據預設值和反饋值計算偏移量,并根據偏移量來(lái)控制被控對象。預設值通常是一個(gè)常量,在系統運行過(guò)程中都不會(huì )改變。習慣于高級語(yǔ)言編程的開(kāi)發(fā)者喜歡使用宏定義的方式來(lái)設置該常量,但讀取保存在內存中的常量會(huì )降低數據處理速度,如果把常量保存在寄存器當中則浪費一個(gè)非常宗貴寄存器。針對預設值不易改變的情況,直接使用12位立即數來(lái)表示該預設常量并直接參與算術(shù)運算的方式既可以節約存儲空間,還能夠改善數據處理速度,而且與12位AD轉換器做反饋采樣環(huán)節剛好對應。 2.8最大限度地使用寄存器 像ARM這樣的load-store體系結構的處理器上,訪(fǎng)問(wèn)寄存器中的數據要比訪(fǎng)問(wèn)存儲器中的數據效率高很多,為軟件變量分配寄存器要遠比分配存儲空間性能優(yōu)越。 ARM Cortex處理器共有14個(gè)通用寄存器,實(shí)際工程應用軟件巾的變量數大多超出14個(gè),但數值較小,可以把多個(gè)變量存放在一個(gè)寄存器當中。還可以讓不同函數的局部變量對寄存器進(jìn)行時(shí)分復用,以充分發(fā)揮寄存器的優(yōu)勢。 2.9其他 Thumb-2技術(shù)提供2條過(guò)零檢測并跳轉的指令CBZ和CBNZ。分別對應檢測到零跳轉或檢測到非零跳轉。該指令可以被用來(lái)替換常用的一個(gè)指令序列:與零比較,以及隨后的跳轉指令,這樣的指令序列通常被用來(lái)檢查指針是否為空。Thumb-2指令集中還增加了訪(fǎng)問(wèn)協(xié)處理器的指令,這樣Thumb-2代碼就可以直接支持欠量浮點(diǎn)防處理器,以及其他的協(xié)處理器。配合其他訪(fǎng)問(wèn)系統寄存器的指令。整個(gè)應用程序就都可以用Thumb-2指令來(lái)實(shí)現,不必再切換的ARM狀態(tài)才能實(shí)現一些特殊的功能。 3 結束語(yǔ) 在一個(gè)應用程序中,要實(shí)現最好的性能.就需要編寫(xiě)優(yōu)化的匯編程序。只不過(guò)是對性能影響最大的關(guān)鍵程序才值得優(yōu)化?梢允褂眯阅芊治銎骰蛘咧噶钪芷谟嫈倒ぞ邅(lái)找這些敏感的關(guān)鍵程序段。優(yōu)化程序的基本思想就是盡可能地壓縮代碼尺寸以節省存儲空間,盡可能提高程序的執行效率以獲得更高的性能,并降低功耗。 本文作者創(chuàng )新點(diǎn):結合Thumb-2指令特點(diǎn)來(lái)優(yōu)化嵌入式軟件設計。 作者:謝川 來(lái)源:《微計算機信息》(嵌入式與SOC)2009年第4-2期 |