ARM程序設(shè)計(jì)方案優(yōu)化策略與技術(shù)_第1頁
ARM程序設(shè)計(jì)方案優(yōu)化策略與技術(shù)_第2頁
ARM程序設(shè)計(jì)方案優(yōu)化策略與技術(shù)_第3頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、作者:Pan Hon glia ng僅供個(gè)人學(xué)習(xí)ARM程序設(shè)計(jì)優(yōu)化策略與技術(shù)程序優(yōu)化是指軟件編程結(jié)束后, 利用軟件開發(fā)工具對程序進(jìn)行調(diào)整和改進(jìn), 讓程序充分利用資源, 提 高運(yùn)行效率, 縮減代碼尺寸的過程。按照優(yōu)化的側(cè)重點(diǎn)不同,程序ARM尤化可分為運(yùn)行速度優(yōu)化和代碼尺寸優(yōu)化。運(yùn)行速度優(yōu)化是指在充分掌握軟硬件特性的基礎(chǔ)上,通過應(yīng)用程序結(jié)構(gòu)調(diào)整等手段來降低完成指定任務(wù)所需執(zhí)行的指令數(shù)。在同一個(gè)處理器上,經(jīng)過速度優(yōu)化的程序比未經(jīng)優(yōu)化的程序在完成指定任務(wù)時(shí)所需的時(shí)間更短,即前者比后者具有更高的運(yùn)行效率。代碼尺寸優(yōu)化是指,采取措施使應(yīng)用程序在能夠正確完成所需功能的前提下,盡可能減少程序的ARM代碼量。然

2、而在實(shí)際的程序設(shè)計(jì) ARM過程中,程序優(yōu)化的兩個(gè)目標(biāo)(運(yùn)行速度和代碼大?。┩ǔJ腔ハ嗝艿摹榱颂岣叱绦蜻\(yùn)行效率,往往要以犧牲存儲(chǔ)空間、增加代碼量為代價(jià),例如程序設(shè)計(jì)中經(jīng)常使用的以查表代替計(jì)算、循環(huán)展開等方法就容易導(dǎo)致程序代碼量增加。而為了減少程序代碼量、壓縮存 儲(chǔ)器空間,可能又要以降低程序運(yùn)行效率為代價(jià)。因此,在對程序?qū)嵤﹥?yōu)化之前,應(yīng)先根據(jù)實(shí)際需求確定相應(yīng)的策略。在處理器資源 ARM緊張的情況下,應(yīng)著重考慮運(yùn)行速度優(yōu)化;而在存儲(chǔ)器資源使用受限的情況下,則應(yīng)優(yōu)先考慮代碼尺寸的優(yōu)化。1程序運(yùn)行速度優(yōu)化程序運(yùn)行速度優(yōu)化的方法可分為以下 ARM幾大類。1.1通用的優(yōu)化方法(1)減小運(yùn)算強(qiáng)度利用左/右

3、移位操作代替乘/除2運(yùn)算:通常需要乘以 ARM或除以2的幕次方都可以通過左移或右 移n位來完成。實(shí)際上乘以任何一個(gè)整數(shù)都可以用移位和加法來代替乘法。ARM 7中加法和移位可以通過一條指令來完成,且執(zhí)行時(shí)間少于乘法指令。例如:i = i X 5可以用i = (i<<2) + i 來代替。利用乘法代替乘方運(yùn)算:ARM7核中內(nèi)建有32 X 8 ARM乘法器,因此可以通過乘法運(yùn)算來代替乘方 運(yùn)算以節(jié)約乘方函數(shù)調(diào)用的開銷。例如:i = pow(i, 3.0) 可用i = i X i X i來代替。利用與運(yùn)算代替求余運(yùn)算:有時(shí)可以通過用與(AND )指令代替求余操作(% )來提高效率。例如:i

4、 = i % 8 可以用i = i & 0x07 來代替。(2)優(yōu)化循環(huán)終止ARM條件在一個(gè)循環(huán)結(jié)構(gòu)中,循環(huán)的終止條件將嚴(yán)重影響著循環(huán)的效率,再加上ARM指令的條件執(zhí)行特性,所以在書寫循環(huán)的終止條件時(shí)應(yīng)盡量使用cou nt-dow n-to-zero 結(jié)構(gòu)。這樣編譯器可以用一條 BNE(若非零則跳轉(zhuǎn))指令代替 CMP (比較)和BLE (若小于則跳轉(zhuǎn))兩條指令,既減小代碼尺寸,又加快 了運(yùn)行ARM速度。使用inline 函數(shù)ARM C支持inline 關(guān)鍵字,如果一個(gè)函數(shù)被設(shè)計(jì) ARM成一個(gè)inline 函數(shù),那么在調(diào)用它的地方將 會(huì)用函數(shù)體來替代函數(shù)調(diào)用語句, 這樣將會(huì)徹底省去函數(shù)調(diào)

5、用的開銷。使用 in li ne 的最大缺點(diǎn)是 函數(shù)在被頻繁調(diào)用時(shí),代碼量將增大。1.2處理器相關(guān)的優(yōu)化ARM方法(1)保持流水線暢通從前面的介紹可知,流水線延遲或阻斷會(huì)對處理器的性能造成影響,因此應(yīng)該盡量保持流水線暢通。流水線延遲難以避免,但可以利用延遲周期進(jìn)行其它 ARM操作。LOAD/STORE旨令中的自動(dòng)索引(auto-indexing )功能就是為利用ARM流水線延遲周期而設(shè)計(jì)的。當(dāng) 流水線處于延遲周期時(shí),處理器的執(zhí)行單元被占用, 算術(shù)邏輯單元ARM(ALU )和桶形移位器卻可 能處于空閑狀態(tài),此時(shí)可以利用它們來完成往基址寄存器上加一個(gè)偏移量的操作,供后面的指令使用。例如:指令 LD

6、R R1, R2, #4 完成R1= * R2及R2 += 4兩個(gè)操作,是后索 引(post-indexing )的例子;而指令 LDR R1, R2, #4! 完成 R1 =* (R2 + 4) 和 R2 +=4 兩個(gè)操作,是前索引(pre-indexing )的例子。流水線阻斷的情況可通過循環(huán)拆解等方法加以改善。一個(gè)循環(huán)可以考慮拆解以減小跳轉(zhuǎn)指令在循環(huán)指令中所占的比重,進(jìn)而提高代碼效率。下面以一個(gè)內(nèi)存復(fù)制函數(shù)加以ARM說明。void memcopy(char * to, char * from, unsigned int nbytes)while( nbytes-)ARM* to+ =*

7、from+;為簡單起見,這里假設(shè) nbytes為16的ARM倍數(shù)(省略對余數(shù)的處理)。上面的函數(shù)每處理一個(gè)字節(jié)就要進(jìn)行一次判斷和跳轉(zhuǎn),對其中的循環(huán)體可作如下拆解:void memcopy(char * to, char * from, unsigned int nbytes)while( nbytes) * to+ =* from+;* to+ =* from+;ARM* to+ =* from+;* to+ =* from+;n bytes -=4;這樣一來,循環(huán)體中的指令數(shù)增加了,循環(huán)次數(shù)卻減少了。跳轉(zhuǎn)指令A(yù)RM帶來的負(fù)面影響得以削弱利用ARM 7處理器32位字長的特性, 上述代碼可進(jìn)一步

8、作如下調(diào)整:void memcopy(char * to, charint * p_to = (int * )to;int * p_from = (int * from;* from, unsigned int nbytes)ARMwhile( nbytes) * p_to+ =* p_from+;* p_to+ =* p_from+;* p_to+ =* p_from+;* p_to+ =* p_from+;n bytes - = 16;經(jīng)過優(yōu)化后,一次循環(huán)可以處理 16個(gè)字節(jié)。跳轉(zhuǎn)指令帶來的影響 ARM進(jìn)一步得到減弱。不過可以看岀,調(diào)整后的代碼在代碼量方面有所增加。(2)使用寄存器變量CP

9、U對寄存器的存取要比對內(nèi)存的存取快得多 ARM因此為變量分配一個(gè)寄存器, 將有助于代碼的 優(yōu)化和運(yùn)行效率的提高。整型、指針、浮點(diǎn)等類型的變量都可以分配寄存器; 一個(gè)結(jié)構(gòu)的部分或者 全部也可以分配寄存器。給循環(huán)體中需要頻繁訪問的變量分配寄存器也能在'定程度上提高程序效率。1.3指令集相關(guān)的優(yōu)化方法有時(shí)可以利用ARM7指令集的特點(diǎn)對程序ARM進(jìn)行優(yōu)化。(1)避免除法ARW指令集中沒有除法指令,其除法是通過調(diào)用C庫函數(shù)實(shí)現(xiàn)的。一個(gè)32位的除法通常需要20140 個(gè)時(shí)鐘周期。因此,除法成了一個(gè)程序效率的瓶頸,應(yīng)盡量避免使用。有些除法可用乘法代替,例如:if ( (x / y) > z)可

10、變通為if ( x > (y x z)。在能滿足精度,且存儲(chǔ)器空間冗余的情況下, 也可考慮使用查表法代替除法。當(dāng)除數(shù)為2的ARM冪次方時(shí),應(yīng)用移位操作代替除法。(2) 利用條件執(zhí)行ARM指令集的一個(gè)重要特征就是所有的指令均可包含一個(gè)可選的條件碼。當(dāng)程序狀態(tài)寄存器(PSR )中的條件碼標(biāo)志滿足指定條件時(shí),帶條件碼的指令才能執(zhí)行。利用條件執(zhí)行通常可以省去單獨(dú)的判斷arMW令,因而可以減小代碼尺寸并提高程序效率。(3) 使用合適的變量類型ARM指令集支持有符號(hào)/無符號(hào)的8位、16位、32位整型及浮點(diǎn)型變量。恰當(dāng)?shù)氖褂米兞康念愋停粌H可以節(jié)省代碼,并且可以提高代碼運(yùn)行效率。應(yīng)該盡可能地避免使用c

11、har、short型的ARM局部變量,因?yàn)椴僮?位/16位局部變量往往比操作 3 2位變量需要更多指令, 請對比下列3個(gè)函 數(shù)和它們的匯編代碼。in tword in c(i nta) wordi nc ADD a1,a1,#1return a + 1; MOV pc,lr short incshortshorti nc(shorta) ADD a1,a1,#1 MOV a1,a1,LSL #16return a + 1; MOV a1,a1,ASR #16ARM MOV pc,lrcharchar in c(chara) char inc ADD a1,a1,#1return a + 1;

12、AND a1,a1,#&ff MOV pc,lr可以看岀,操作3 2位變量所需的指令要少于操作 8位及16位變量。1.4存儲(chǔ)器相關(guān)的優(yōu)化方法(1) 用查表代替計(jì)算在處理器資源緊張而存儲(chǔ)器資源相對富裕的情況下,可以用犧牲存儲(chǔ)空間換取運(yùn)行速度的辦法。例如需要頻繁計(jì)算正弦或余弦函數(shù)值時(shí),可預(yù)先將函數(shù)值計(jì)算出來置于內(nèi)存中供以后ARM查找。(2) 充分利用片內(nèi)RAM一些廠商岀產(chǎn)的 ARM芯片內(nèi)集成有一定容量的 RAM女口 Atmel公司的AT91R40807內(nèi)有128KB的RAM 夏普公司的LH75400/LH75401內(nèi)有32KB的RAM處理器對片內(nèi)RAM的訪問速度要快于對外部 RAM的 訪問

13、,所以應(yīng)盡可能將程序調(diào)入片內(nèi)RAM中運(yùn)行。若因程序太大無法完全放入片內(nèi)RAM,可考慮ARM將使用最頻繁的數(shù)據(jù)或程序段調(diào)入片內(nèi)RAM以提高程序運(yùn)行效率。1.5編譯器相關(guān)的優(yōu)化方法多數(shù)編譯器都支持對程序速度和程序大小的優(yōu)化,有些編譯器還允許用戶選擇可供優(yōu)化的內(nèi)容及優(yōu)化的程度。相比前面的各種優(yōu)化方法,通過設(shè)置編譯器選項(xiàng)對程序進(jìn)行優(yōu)化不失為一種簡單有效的途徑。2代碼尺寸優(yōu)化精簡指令集計(jì)算機(jī)的一個(gè)重要特點(diǎn)是指令長度固定,這樣做可以簡化指令譯碼的過程,但卻容易導(dǎo)ARM弋碼量。致代碼尺寸增加。為避免這個(gè)問題,可以考慮采取以下措施來縮減程序2.1使用多寄存器操作指令A(yù)RM指令集中的多寄存器操作指令 LDM/S

14、TM可以加載/存儲(chǔ)多個(gè)寄存器,這在保存/恢復(fù)寄存器組 的狀態(tài)及進(jìn)行大塊數(shù)據(jù)復(fù)制時(shí)非常有效。例如要將寄存器R4R12及R14的內(nèi)容保存到堆棧中,若用STR指令共需要10條,而一條STMEA R13!, R4R12, R14指令就能達(dá)到相同的目的,節(jié)省的指令存儲(chǔ)空間相當(dāng)可觀。不過需要注意的是,雖然一條LDM/STM指令能代替多條LDR/STR指令,但這并不意味著程序運(yùn)行速度得到了 ARM提高。實(shí)際上處理器在執(zhí)行 LDM/STM指令的時(shí)候還是將它拆 分成多條單獨(dú)的LDR/STR指令來執(zhí)行。2.2合理安排變量順序ARM 7處理器要求ARM程序中的32位/16位變量必須按字/半字對齊,這意味著如果變量順

15、序安排 不合理, 有可能會(huì)造成存儲(chǔ)空間的浪費(fèi)。例如:一個(gè)結(jié)構(gòu)體中的4個(gè)32位int型變量i1 i4 和4個(gè)8位char型變量cl c4,若按照i1、cl、i2、c2、i3、c3、i4、c4的順序交錯(cuò)存放時(shí),由于整型變量的對齊會(huì)導(dǎo)致位于 2個(gè)整型變量中間的那個(gè) 8位char型變量實(shí)際占用32位的存儲(chǔ)器, 這樣就造成了存儲(chǔ)空間的浪費(fèi)。為避免這種情況,應(yīng)將int型變量和char型變量按類似i1、i2、i3、i4、c1、c2、c3、c4的順序連續(xù)存放。2.3使用Thumb指令為了從根本上有效 ARM降低代碼尺寸,ARM公司開發(fā)了 16位的Thumb指令集。Thumb是ARM體系 結(jié)構(gòu)的擴(kuò)充。Thumb

16、指令集是大多數(shù)常用32位ARM指令壓縮成16位寬指令的集合。在執(zhí)行時(shí),16 位指令透明的實(shí)時(shí)解壓成 32位ARM指令并沒有性能損失。而且程序在 Thumb狀態(tài)和ARM狀態(tài)之間 切換是零開銷的。與等價(jià)的 32位ARM代碼相比,Thumb代碼節(jié)省的存儲(chǔ)器空間可高達(dá) 35%以上。結(jié)語綜上所述,優(yōu)化的過程是 ARM在透徹了解軟/硬件結(jié)構(gòu)和特性的前提下,充分利用硬件資源,不斷調(diào) 整程序結(jié)構(gòu)使之趨于合理的過程。其目的是最大程度發(fā)揮處理器效能,最大限度利用資源,盡可能提 高程序在特定硬件平臺(tái)上的性能。隨著ARM處理器在通信及消費(fèi)電子等行業(yè)中的應(yīng)用日趨廣泛,優(yōu)化技術(shù)將在基于ARM處理器的程序設(shè)計(jì)過程中發(fā)揮越來

17、越重要的作用。值得注意的是,程序的優(yōu)化通常只是軟件設(shè)計(jì)需要達(dá)到的諸多目標(biāo)之一,優(yōu)化應(yīng)在不影響程序正確性、健壯性、可移植性及可維護(hù)性的前提下進(jìn)行。片面追求程序的優(yōu)化往往會(huì)影響健壯性、可移植性 等重要目標(biāo)版權(quán)申明本文部分內(nèi)容,包括文字、圖片、以及設(shè)計(jì)等在網(wǎng)上搜集整理。版權(quán)為潘宏亮個(gè)人所有This article in eludes someparts, in cludi ng text, pictures, and desig n. Copyright is Pan Hon glia ng's pers onal own ership.用戶可將本文的內(nèi)容或服務(wù)用于個(gè)人學(xué)習(xí)、研究或欣賞,以及

18、其他非商業(yè)性或非盈利性用途,但同時(shí)應(yīng)遵守著作權(quán)法及其他相關(guān)法律 的規(guī)定,不得侵犯本網(wǎng)站及相關(guān)權(quán)利人的合法權(quán)利。除此以外,將本 文任何內(nèi)容或服務(wù)用于其他用途時(shí),須征得本人及相關(guān)權(quán)利人的書面 許可,并支付報(bào)酬。Users may use the contents or services of this articlefor pers onal study, research or appreciati on, and other non-commercial or non-profit purposes, but at the same time, they shall abide by the provisi ons of copyright law and other releva nt laws, and shall n ot infringe upon the legitimate rights of

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論