<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ARM處理器的軟件優(yōu)化設(shè)計

          基于ARM處理器的軟件優(yōu)化設(shè)計

          作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          引言

          隨著嵌入式系統(tǒng)在工業(yè)控制、汽車系統(tǒng)、家庭網(wǎng)絡(luò)、醫(yī)療衛(wèi)生、無線技術(shù)等領(lǐng)域內(nèi)的大量應(yīng)用,嵌入式系統(tǒng)開發(fā)者必須面對務(wù)種復(fù)雜的挑戰(zhàn),其中就包括如何在代碼性能和系統(tǒng)成本之間進行平衡。在這方面,ARM處理器可以提供給開發(fā)者業(yè)界領(lǐng)先的技術(shù)方案ARMCortex系列提供了一個標準的體系結(jié)構(gòu)來滿足各種技術(shù)的不同性能要求,是專門針對功耗和成本敏感的嵌入式應(yīng)用領(lǐng)域?qū)崿F(xiàn)高性能而設(shè)計的,它大大簡化了編程的復(fù)雜性,其成熟的技術(shù)使ARM架構(gòu)成為各種應(yīng)用的上佳選擇。

          ARM Cortex處理器的統(tǒng)一技術(shù)是Thumb-2技術(shù),它以現(xiàn)有的ARM技術(shù)為基礎(chǔ),綜合了ARM指令和Thumb指令的優(yōu)勢,對優(yōu)化嵌人式軟件設(shè)計具有獨到的優(yōu)勢,提供了最佳的代碼密度,能更合理地使用存儲器,對于靠近處理器內(nèi)核的高速存儲器至關(guān)重要,即使只節(jié)省小部分內(nèi)存,也將大大提高系統(tǒng)的性能,大幅降低功耗。

          1 Thumb-2 指令簡介

          并非所有的運算都能夠映射到Thumb指令集,有時需要多條Thumb指令來模擬一條32位指令的任務(wù)。而且Thumb指令不能訪問協(xié)處理器,不能使用異常中斷指令,不支持媒體功能,當(dāng)應(yīng)用中有這些需求而且對存儲器窄問要求較高時,必須混合使用ARM指令和Thumb指令,處理器內(nèi)核根據(jù)需要切換到Thumb狀態(tài)以獲取高代碼密度或切換到ARM狀態(tài)以獲取出色的性能。在開發(fā)階段,為r充分利用存儲器,需要反復(fù)調(diào)整哪些代碼使用ARM指令、哪些代碼使用Thumb指令。往往只有等到軟件和硬件完成后,才能最終決定ARM/Thumb指令的使用方式,這些因素會使開發(fā)流程變得非常復(fù)雜。

          Thumb-2技術(shù)足對ARM架構(gòu)的非常重要的擴展,它可以改善Thumb指令集的性能。Thumb-2指令集在現(xiàn)有的Thumb指令的基礎(chǔ)上做了如下的擴充:

          · 增加了一些新的16位Thumb指令來改進程序的執(zhí)行流程

          · 增加了一些新的32位Thumb指令以實現(xiàn)一些ARM指令的專有功能。

          · 擴充原有的ARM指令,增加了一些新的指令來改善代碼性能和數(shù)據(jù)處理的效率。

          使用Thumb-2指令就不需要在ARM/Thumb狀態(tài)之間反復(fù)切換了,代碼密度和性能得到的顯著的提高。

          2 使用Thumb-2指令優(yōu)化設(shè)計

          對于已經(jīng)有ARM處理器開發(fā)經(jīng)驗的嵌入式開發(fā)工程師析言,使用Thumb-2技術(shù)是非常簡單的,因為Thumb-2技術(shù)是在ARM和Thumb基礎(chǔ)上經(jīng)過創(chuàng)新后發(fā)展起來的,它繼承了原有的基本編程方法,同時具備ARM/Thumb不可比擬的優(yōu)越性。開發(fā)人員在設(shè)計嵌入式軟件時,只需要重點關(guān)注對整體性能影響最大的那部分代碼設(shè)計,就能夠平衡好性能、代碼密度和功耗之間的關(guān)系。

          2.1 減小漢名(Hamming)距離

          表1漢名距離變化對比


          如表1所示,兩組代碼都是用于計算表達式(x1+x2)x(x3-x4)的值,分別使用3條指令束實現(xiàn)。每條指令先成的功能、字書數(shù)、寄存器的使用數(shù)目、操作碼都完全一樣,不同之處就是各寄存器操作數(shù)的二進制編碼不同。

          Rd代表目標寄存器,Rn和Rm代表源操作數(shù)寄存器。執(zhí)行原代碼時,Rd的比特位變化4次,Rn和Rm分別變化3次和5次,操作數(shù)總的比特位變化12次。執(zhí)行優(yōu)化后的代碼時,操作數(shù)總的比特位變化為6次,僅為原代碼的一半,能有效地降低指令執(zhí)行時的功耗。

          2.2擅用16位常數(shù)指令

          Thumb-2指令集中增加了2條關(guān)于16位常數(shù)的新指令。MOVW可以把一個16位常數(shù)加載到寄存器中,并用0填充寄存器的高16位;另一條指令MOVT可以把一個16位常數(shù)加載到寄存器的高16位中。這兩條指令組合使用就可以把一個32位常數(shù)加載到寄存器中。

          操作32位立即數(shù)或是訪問外設(shè),都需要把32位常數(shù)加載到寄存器中。對于原來的ARM/Thumb指令系統(tǒng),因指令編碼位數(shù)限制.最多只能使用12位常數(shù),且其有效位數(shù)只有8位,另外4位用于移位。對任意一個32位的立即數(shù)或者一個地址值讀取到寄存器需要使用到LDR偽指令,編澤器把該32位數(shù)據(jù)放在數(shù)據(jù)緩沖區(qū)中,同時用基于PC的LDR指令讀取該數(shù)據(jù),程序執(zhí)行時,會在處理器中引起額外的開銷,這些開銷來自于需要額外的時鐘周期使數(shù)據(jù)端口能夠?qū)χ噶盍鬟M行訪問。

          用兩條指令把32位常數(shù)分成兩個16位常數(shù)分兩次加載到寄存器中,意味著數(shù)據(jù)直接在指令流內(nèi)部,不再需要通過數(shù)據(jù)端口來訪問。相對于LDR偽指令方式,這種解決辦法可以消除通過數(shù)據(jù)端口訪問指令流的額外開銷,進而提高性能,降低功耗。

          2.3靈活應(yīng)用位操作指令

          嵌入式軟件開發(fā)者經(jīng)常會碰到位操作方面的問題,如需要對某個變量中的某幾位賦值或復(fù)位。提取寄存器的部分數(shù)據(jù)位信息,寄存器中插入固定比特信息等,開發(fā)人員往往采用邏輯運算指令和移位操作指令的組合來實現(xiàn)。如表2所爾,兩組代碼完成的功能一樣,把寄存器R1和寄存器R2的有用信息集中壓縮到寄存器R0中,以節(jié)省寄存器。R1的有用信息為R1[15:0],R2的有用信息為R2[24:8]。對于原代碼,因為需要屏蔽寄存器R1和R2的16位數(shù)據(jù),需要16位常數(shù)參與,所以使用MOVW指令把16位常數(shù)引入,完成程序功能共用了4條指令,還額外使用寄存器R3來存放中間變量。優(yōu)化后的代碼只需要一條指令即可實現(xiàn),而且不需要額外的寄存器參與計算。

          表2位操作指令對比


          除PKHBT指令外。Thumb-2技術(shù)還提供PKHTB、BFC、BFI、SBFX、UBFX等位操作指令。這樣,開發(fā)者進行比特位的插入和抽取所需的指令數(shù)目就可以明顯減少,使用壓縮的數(shù)據(jù)結(jié)構(gòu)也會更加方便。而代碼對寄存器的需求也會降低。

          上一頁 1 2 下一頁

          關(guān)鍵詞: ARM處理器軟件優(yōu)

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();