<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM程序設計優(yōu)化

ARM程序設計優(yōu)化

作者: 時(shí)間:2011-04-30 來(lái)源:網(wǎng)絡(luò ) 收藏

程序是指軟件編程結束后,利用軟件開(kāi)發(fā)工具對程序進(jìn)行調整和改進(jìn),讓程序充分利用資源, 提高運行效率, 縮減代碼尺寸的過(guò)程。按照的側重點(diǎn)不同, 程序可分為運行速度優(yōu)化和代碼尺寸優(yōu)化。運行速度優(yōu)化是指在充分掌握軟硬件特性的基礎上, 通過(guò)應用程序結構調整等手段來(lái)降低完成指定任務(wù)所需執行的指令數。在同一個(gè)處理器上, 經(jīng)過(guò)速度優(yōu)化的程序比未經(jīng)優(yōu)化的程序在完成指定任務(wù)時(shí)所需的時(shí)間更短,即前者比后者具有更高的運行效率。代碼尺寸優(yōu)化是指,采取措施使應用程序在能夠正確完成所需功能的前提下, 盡可能減少程序的代碼量。

本文引用地址:http://dyxdggzs.com/article/150814.htm

  然而在實(shí)際的過(guò)程中,程序優(yōu)化的兩個(gè)目標(運行速度和代碼大小) 通常是互相矛盾的。為了提高程序運行效率,往往要以犧牲存儲空間、增加代碼量為代價(jià), 例如中經(jīng)常使用的以查表代替計算、循環(huán)展開(kāi)等方法就容易導致程序代碼量增加。而為了減少程序代碼量、壓縮存儲器空間,可能又要以降低程序運行效率為代價(jià)。因此, 在對程序實(shí)施優(yōu)化之前, 應先根據實(shí)際需求確定相應的策略。在處理器資源緊張的情況下, 應著(zhù)重考慮運行速度優(yōu)化;而在存儲器資源使用受限的情況下, 則應優(yōu)先考慮代碼尺寸的優(yōu)化。

  1 程序運行速度優(yōu)化

  程序運行速度優(yōu)化的方法可分為以下幾大類(lèi)。

  1.1 通用的優(yōu)化方法

  (1)減小運算強度

  利用左/ 右移位操作代替乘/ 除2 運算:通常需要乘以或除以2 的冪次方都可以通過(guò)左移或右移n 位來(lái)完成。實(shí)際上乘以任何一個(gè)整數都可以用移位和加法來(lái)代替乘法。arm 7 中加法和移位可以通過(guò)一條指令來(lái)完成,且執行時(shí)間少于乘法指令。例如: i = i × 5 可以用i = (i2) + i 來(lái)代替。

  利用乘法代替乘方運算:arm7 核中內建有32 ×8 乘法器, 因此可以通過(guò)乘法運算來(lái)代替乘方運算以節約乘方函數調用的開(kāi)銷(xiāo)。例如: i = pow(i, 3.0) 可用 i = i×i × i 來(lái)代替。

  利用與運算代替求余運算:有時(shí)可以通過(guò)用與(AND )指令代替求余操作(% )來(lái)提高效率。例如:i = i % 8 可以用 i = i 0x07 來(lái)代替。

  (2)優(yōu)化循環(huán)終止條件

  在一個(gè)循環(huán)結構中,循環(huán)的終止條件將嚴重影響著(zhù)循環(huán)的效率,再加上arm 指令的條件執行特性,所以在書(shū)寫(xiě)循環(huán)的終止條件時(shí)應盡量使用count-down-to-zero結構。這樣編譯器可以用一條BNE (若非零則跳轉)指令代替CMP (比較)和BLE (若小于則跳轉)兩條指令,既減小代碼尺寸,又加快了運行速度。

  (3)使用inline 函數

  arm C 支持 inline 關(guān)鍵字,如果一個(gè)函數被設計成一個(gè)inline 函數,那么在調用它的地方將會(huì )用函數體來(lái)替代函數調用語(yǔ)句, 這樣將會(huì )徹底省去函數調用的開(kāi)銷(xiāo)。使用inline 的最大缺點(diǎn)是函數在被頻繁調用時(shí),代碼量將增大。

  1.2 處理器相關(guān)的優(yōu)化方法

  (1)保持流水線(xiàn)暢通

  從前面的介紹可知,流水線(xiàn)延遲或阻斷會(huì )對處理器的性能造成影響,因此應該盡量保持流水線(xiàn)暢通。流水線(xiàn)延遲難以避免, 但可以利用延遲周期進(jìn)行其它操作。

  LOAD/STORE 指令中的自動(dòng)索引(auto-indexing)功能就是為利用流水線(xiàn)延遲周期而設計的。當流水線(xiàn)處于延遲周期時(shí), 處理器的執行單元被占用, 算術(shù)邏輯單元(ALU )和桶形移位器卻可能處于空閑狀態(tài),此時(shí)可以利用它們來(lái)完成往基址寄存器上加一個(gè)偏移量的操作,

  供后面的指令使用。例如:指令 LDR R1, [R2], #4 完成 R1= *R2 及 R2 += 4 兩個(gè)操作,是后索引(post-indexing)的例子;而指令 LDR R1, [R2, #4]! 完成 R1 = *(R2 + 4) 和 R2 +=4 兩個(gè)操作,是前索引(pre-indexing)的例子。

  流水線(xiàn)阻斷的情況可通過(guò)循環(huán)拆解等方法加以改善。一個(gè)循環(huán)可以考慮拆解以減小跳轉指令在循環(huán)指令中所占的比重, 進(jìn)而提高代碼效率。下面以一個(gè)內存復制函數加以說(shuō)明。

  void memcopy(char *to, char *from, unsigned int nbytes)

  {

  while(nbytes--)

  *to++ = *from++;

  }

  為簡(jiǎn)單起見(jiàn),這里假設nbytes 為16 的倍數(省略對余數的處理)。上面的函數每處理一個(gè)字節就要進(jìn)行一次判斷和跳轉, 對其中的循環(huán)體可作如下拆解:

  void memcopy(char *to, char *from, unsigned int nbytes)

  {

  while(nbytes) {

  *to++ = *from++;

  *to++ = *from++;

  *to++ = *from++;

  *to++ = *from++;

  nbytes - = 4;

  }

  }

  這樣一來(lái), 循環(huán)體中的指令數增加了,循環(huán)次數卻減少了。跳轉指令帶來(lái)的負面影響得以削弱。利用arm 7 處理器32 位字長(cháng)的特性, 上述代碼可進(jìn)一步作如下調整:

  void memcopy(char *to, char *from, unsigned int nbytes)

  {

  int *p_to = (int *)to;

  int *p_from = (int *)from;

  while(nbytes) {

  *p_to++ = *p_from++;

  *p_to++ = *p_from++;

  *p_to++ = *p_from++;

  *p_to++ = *p_from++;

  nbytes - = 16;

  }

  }

  經(jīng)過(guò)優(yōu)化后,一次循環(huán)可以處理16 個(gè)字節。跳轉指令帶來(lái)的影響進(jìn)一步得到減弱。不過(guò)可以看出, 調整后的代碼在代碼量方面有所增加。

  (2)使用寄存器變量

  CPU 對寄存器的存取要比對內存的存取快得多, 因此為變量分配一個(gè)寄存器, 將有助于代碼的優(yōu)化和運行效率的提高。整型、指針、浮點(diǎn)等類(lèi)型的變量都可以分配寄存器; 一個(gè)結構的部分或者全部也可以分配寄存器。給循環(huán)體中需要頻繁訪(fǎng)問(wèn)的變量分配寄存器也能在

  一定程度上提高程序效率。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 優(yōu)化 程序設計 ARM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>