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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM的嵌入式系統(tǒng)程序開發(fā)要點(diǎn)(五)

          基于ARM的嵌入式系統(tǒng)程序開發(fā)要點(diǎn)(五)

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

          在前面的文章中提到過,很多情況下應(yīng)用程序需要在ARM跟Thumb狀態(tài)之間相互切換,這部分就討論交互工作的實(shí)現(xiàn)方法和一些注意問題。

          1需要交互的原因

          前面提到過,Thumb指令在某些特殊情況下具有比ARM指令更為出色的表現(xiàn),主要是在代碼長(zhǎng)度和窄帶寬存儲(chǔ)器系統(tǒng)性能兩方面。正是因?yàn)門humb指令在特定環(huán)境下的優(yōu)勢(shì),它在很多方面得到了廣泛應(yīng)用。但是因?yàn)橄旅嬉恍┰?Thumb又不可能獨(dú)立地組成一個(gè)應(yīng)用系統(tǒng)。
          ◇ Thumb指令集在功能上只是ARM指令集的一個(gè)子 集,某些功能只能在ARM狀態(tài)下執(zhí)行,如CPSR和 協(xié)處理器的訪問。
          ◇ 進(jìn)行異常響應(yīng)時(shí),處理器會(huì)自動(dòng)進(jìn)入ARM狀態(tài)。
          ◇ 從系統(tǒng)優(yōu)化考慮,在寬帶存儲(chǔ)器上不應(yīng)該放置 Thumb代碼,很多窄帶系統(tǒng)具有寬帶的內(nèi)部存儲(chǔ)器。
          ◇ 即使是一個(gè)單純的Thumb應(yīng)用系統(tǒng),也必須加一 個(gè)匯編的交互頭程序,因?yàn)橄到y(tǒng)總是自動(dòng)從ARM 開始啟動(dòng)。

          所以,不可避免地會(huì)產(chǎn)生ARM與Thumb之間交互的問題。

          2狀態(tài)切換的實(shí)現(xiàn)

          處理器在 ARM/Thumb之間的狀態(tài)切換是通過一條專用的跳轉(zhuǎn)交換指令BX來實(shí)現(xiàn)的。BX指令以通用寄存器(R0~R15)為操作數(shù),通過拷貝Rn到PC來實(shí)現(xiàn) 4GB空間范圍內(nèi)的一個(gè)絕對(duì)跳轉(zhuǎn)。BX利用Rn寄存器中存儲(chǔ)的目標(biāo)地址值的最后一位來判斷跳轉(zhuǎn)后的狀態(tài)。如圖1所示,是用BX指令實(shí)現(xiàn)狀態(tài)切換。




          無論ARM還是Thumb,其指令存儲(chǔ)在存儲(chǔ)器中都是邊界對(duì)齊的(4字節(jié)或2字節(jié)對(duì)齊)。因此,在執(zhí)行跳轉(zhuǎn)過程中,PC寄存器中的最低位肯定被舍棄,不起作用。在BX指令的執(zhí)行過程中,最低位正好被用作狀態(tài)判斷的標(biāo)識(shí),不會(huì)造成存儲(chǔ)器訪問不對(duì)齊的錯(cuò)誤。

          圖 2 中是一段直接進(jìn)行狀態(tài)切換的例程:



          下面是一段直接進(jìn)行狀態(tài)切換的例程。
          ;從ARM狀態(tài)開始
            CODE32 ;匯編關(guān)鍵字
            ADR R0, Into_Thumb+1 ;得到目標(biāo)地址,末位置1, ;轉(zhuǎn)向Thumb
            BX R0 ;執(zhí)行 ? ;其它代碼
            CODE16 ;匯編關(guān)鍵字
          Into_Thumb ;Thumb代碼段起始地址
            … ;Thumb代碼
            ADR R5, Back_to_ARM ;得到目標(biāo)地址,末位缺 ;省為0,轉(zhuǎn)向ARM
            BX R5 ;執(zhí)行
            … ;其它代碼
            CODE32 ;匯編關(guān)鍵字
          Back_to_ARM ;ARM代碼段起始地址

          我們知道,在ARM的狀態(tài)寄存器CPSR 中,bit-5是狀態(tài)控制位T-bit,決定當(dāng)前處理器的運(yùn)行狀態(tài)。如果直接修改CPSR的狀態(tài)位,也能夠達(dá)到改變處理器運(yùn)行狀態(tài)的目的。但是這樣會(huì)帶來一個(gè)問題,因?yàn)锳RM采用多級(jí)流水線的結(jié)構(gòu),所以在程序執(zhí)行過程中,指令流水線上會(huì)存在幾條預(yù)取指令(具體數(shù)目視流水線級(jí)數(shù)而不同)。當(dāng)修改CPSR的 T-bit后,狀態(tài)的轉(zhuǎn)變會(huì)造成流水線上預(yù)取指令的執(zhí)行錯(cuò)誤。而如果用BX指令,則執(zhí)行后會(huì)進(jìn)行流水線的刷新動(dòng)作,清除流水線上的殘余指令,在新的狀態(tài)下重新開始指令預(yù)取,從而保證狀態(tài)轉(zhuǎn)變時(shí)指令流的正確銜接。

          上一頁 1 2 3 下一頁

          關(guān)鍵詞: 交互工作ARM程序開

          評(píng)論


          技術(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); })();