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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM微處理器的編程模型之:異常中斷處理

          ARM微處理器的編程模型之:異常中斷處理

          作者: 時(shí)間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257085.htm

          3.4.5 從異常處理程序中返回

          當(dāng)一個(gè)異常處理返回時(shí),一共有3件事情需要處理:通用寄存器的恢復(fù)、狀態(tài)寄存器的恢復(fù)以及PC指針的恢復(fù)。通用寄存器的恢復(fù)采用一般的堆棧操作指令即可,下面重點(diǎn)介紹狀態(tài)寄存器的恢復(fù)以及PC指針的恢復(fù)。

          1.恢復(fù)被中斷程序的處理器狀態(tài)

          PC和CPSR的恢復(fù)可以通過一條指令來實(shí)現(xiàn),下面是3個(gè)例子。

          · MOVS PC,LR

          · SUBS PC,LR,#4

          · LDMFD SP!,{PC}^

          這幾條指令是普通的數(shù)據(jù)處理指令,特殊之處在于它們把程序計(jì)數(shù)器寄存器PC作為目標(biāo)寄存器,并且?guī)Я颂厥獾暮缶Y“S”或“^”。其中“S”或“^”的作用就是使指令在執(zhí)行時(shí),同時(shí)完成從SPSR到CPSR的拷貝,達(dá)到恢復(fù)狀態(tài)寄存器的目的。

          2.異常的返回地址

          異常返回時(shí),另一個(gè)非常重要的問題就是返回地址的確定。前面提到過,處理器進(jìn)入異常時(shí)會有一個(gè)保存LR的動(dòng)作,但是該保持值并不一定是正確中斷的返回地址。以一個(gè)簡單的指令執(zhí)行流水狀態(tài)圖來對此加以說明,如圖3.7所示。

          圖3.7 3級流水線示例

          架構(gòu)里,PC值指向當(dāng)前執(zhí)行指令地址加8。也就是說,當(dāng)執(zhí)行指令A(yù)(地址0x8000)時(shí),PC等于0x8000+8=0x8008,即等于指令C的地址。假設(shè)指令A(yù)是BL指令,則當(dāng)執(zhí)行時(shí),會把PC值(0x8008)保存到LR寄存器。但是,接下來處理器會對LR進(jìn)行一次自動(dòng)調(diào)整,使LR=LR-0x4。所以,最終保存在LR里面的是圖3.5中所示的B指令地址。所以當(dāng)從BL返回時(shí),LR里面正好是正確的返回地址。

          同樣的跳轉(zhuǎn)機(jī)制在所有的LR自動(dòng)保存操作中都存在。當(dāng)進(jìn)入中斷響應(yīng)時(shí),處理器對保存的LR也進(jìn)行一次自動(dòng)調(diào)整,并且跳轉(zhuǎn)動(dòng)作也是LR=LR-0x04。由此,就可以對不同異常類型的返回地址依次比較。

          假設(shè)在指令B處(地址0x8004)發(fā)生了異常,進(jìn)入異常相應(yīng)后,LR經(jīng)過跳轉(zhuǎn)保存的地址值應(yīng)該是C的地址0x8008。

          (1)軟中斷異常

          如果發(fā)生軟中斷異常,即指令B為SWI指令,從SWI中斷返回后下一條執(zhí)行指令就是C,正好是LR寄存器保存的地址,所以只有直接把LR恢復(fù)給PC即可。

          (2)IRQ或FIQ異常

          如果發(fā)生的是IRQ或FIQ異常,因?yàn)橥獠恐袛嗾埱笾袛嗔苏趫?zhí)行的指令B,當(dāng)中斷返回后,需要重新回到B指令執(zhí)行,也就是說,返回地址應(yīng)該是B(0x8004),需要把LR減4送PC。

          (3)Data Abort數(shù)據(jù)中止異常

          在指令B處進(jìn)入的相應(yīng),但導(dǎo)致的原因卻應(yīng)該是上一條指令A(yù)。當(dāng)中斷處理程序恢復(fù)后,要回到A重新執(zhí)行導(dǎo)致數(shù)據(jù)異常的指令,因此返回地址應(yīng)該是LR加8。

          為方便起見,表3.7總結(jié)了各異常和返回地址的關(guān)系

          表3.7 異常和返回地址

          異 常

          地 址

          用 途

          復(fù)位

          復(fù)位沒有定義LR

          數(shù)據(jù)中止

          LR-8

          指向?qū)е聰?shù)據(jù)中止異常的指令

          FIQ

          LR-4

          指向發(fā)生異常時(shí)正在執(zhí)行的指令

          IRQ

          LR-4

          指向發(fā)生異常時(shí)正在執(zhí)行的指令

          預(yù)取指令中止

          LR-4

          指向?qū)е骂A(yù)取指令異常的那條指令

          SWI

          LR

          執(zhí)行SWI指令的下一條指令

          未定義指令

          LR

          指向未定義指令的下一條指令

          3.4.6 在應(yīng)用程序中安裝異常處理程序

          1.使用匯編語言安裝異常處理程序

          如果系統(tǒng)啟動(dòng)不依賴于Debug或Debug monitor軟件,可以使用匯編語言在系統(tǒng)啟動(dòng)時(shí)直接安裝異常處理程序。

          下面的例子顯示了系統(tǒng)從0x0地址啟動(dòng),直接安裝異常處理程序的方法。

          Vector_Init_Block

          LDR PC, Reset_Addr

          LDR PC, Undefined_Addr

          LDR PC, SWI_Addr

          LDR PC, Prefetch_Addr

          LDR PC, Abort_Addr

          NOP ;保留向量

          LDR PC, IRQ_Addr

          LDR PC, FIQ_Addr

          Reset_Addr DCD Start_Boot

          Undefined_Addr DCD Undefined_Handler

          SWI_Addr DCD SWI_Handler

          Prefetch_Addr DCD Prefetch_Handler

          Abort_Addr DCD Abort_Handler

          DCD 0 ;保留向量

          IRQ_Addr DCD IRQ_Handler

          FIQ_Addr DCD FIQ_Handler



          評論


          相關(guān)推薦

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