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

          新聞中心

          ARM中斷異常處理的返回

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          舉個(gè)小例子,下面是一段ARM匯編代碼:
          地址

          指令

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

          0x3000

          BL add

          0x3004

          MOV r0,#0

          0x3008

          MOV r1,#1

          0x300C

          MOV r2,#2

          AREA test,CODE,READONLY
          ENTRY
          Start
          MOV r0,#1
          MOV r1,#1
          BL add
          MOV r0,#0
          MOV r1,#1
          Add
          ADD r0,r0,r1
          MOV r0,r0,r1
          END

          當(dāng)0x3000處的BL指令執(zhí)行時(shí),會(huì)把PC(=0x3008)保存到LR寄存器里面,也就是LR=0x3008。接下來(lái)處理器會(huì)立即對(duì)LR進(jìn)行一個(gè)自動(dòng)的更新動(dòng)作:LR=LR-0x4,這樣,LR里面的地址為0x3008 – 0x4 = 03004,它是指令”MOV r0,#0”的地址,所以當(dāng)從子程序add返回時(shí),LR里面正好是正確的返回地址。既是下一條要執(zhí)行的指令的地址。

          一、中斷異常處理函數(shù)調(diào)用
          異常就是正在執(zhí)行的指令,由于各種軟件或硬件故障被打斷,比如,在讀數(shù)據(jù)或指令時(shí),訪問(wèn)存儲(chǔ)器失敗、產(chǎn)生了一個(gè)外部硬件中斷等。當(dāng)這些情況發(fā)生時(shí),在ARM系統(tǒng)里,由異常和中斷處理程序做出相應(yīng)的處理,當(dāng)處理完成后,要返回到被中止的指令,使被中止的指令能夠繼續(xù)正常執(zhí)行下去。因此,確定異常和中斷處理程序的返回地址是一個(gè)非常重要的問(wèn)題。

          1、中斷處理

          當(dāng)外部中斷IRQ和FIQ(Fast Interrpt Request,快速中斷請(qǐng)求)發(fā)生時(shí),ARM核完成一部分工作。當(dāng)然,這些工作是任何異常發(fā)生時(shí)都必須要做的,所以ARM處理器就會(huì)自動(dòng)帶我們完成。 其它重要的工作,必須由程序員來(lái)完成。ARM處理器處理的事包括從用戶(hù)模式切換到IRQ模式、狀態(tài)寄存器值的變化及跳轉(zhuǎn)。比如說(shuō),處理器自動(dòng)跳轉(zhuǎn)到從0x0地址開(kāi)始的異常中斷向量表的0x18處,在向量表的0x18處,最簡(jiǎn)單的指令為”B HandlerIRQ”。

          那程序員所要關(guān)心的就是實(shí)現(xiàn)具體的異常處理程序(HandlerIRQ)。當(dāng)用ARM匯編語(yǔ)言實(shí)現(xiàn)HandlerIRQ函數(shù)的時(shí)候,如何確定HandlerIRQ函數(shù)正確地返回地址,使被中止的指令能夠繼續(xù)正常執(zhí)行下去。

          比較常用的中斷處理程序結(jié)構(gòu)如下:

          HandlerIRQ ;中斷響應(yīng),從向量表直接跳來(lái)

          SUB r14,r14,#4;計(jì)算返回地址

          STMFD r13,{r0-r3,r14} ;保護(hù)現(xiàn)場(chǎng),一般只需要保護(hù){r0-r3,lr}

          BL irqHandler ;跳到具體的異常處理函數(shù)

          LDMFD r13,{r0-r3,pc}^ ;恢復(fù)現(xiàn)場(chǎng)

          有程序可以看出,通過(guò)”SUB R14,R14,#4”計(jì)算中斷函數(shù)的返回地址。那有人一定會(huì)問(wèn),為什么計(jì)算返回地址的時(shí)候要減去4呢?

          地址

          指令

          0x3000

          BL add

          0x3004

          MOV r0,#0

          0x3008

          MOV r1,#1

          0x300C

          MOV r2,#2

          我們看上個(gè)表,比如在執(zhí)行地址為0x3004的move指令時(shí),突然來(lái)了一個(gè)IRQ中斷,這個(gè)中斷打斷了move指令的執(zhí)行,這個(gè)時(shí)候就要去跳轉(zhuǎn)到異常處理函數(shù),之后還要返回0x3004地址重新執(zhí)行move指令。當(dāng)中斷發(fā)生時(shí),LR里面保存了用戶(hù)模式下PC的值,那么當(dāng)執(zhí)行地址為0x3004的move指令時(shí),PC的值應(yīng)該是0x300C,前面介紹過(guò),當(dāng)發(fā)生跳轉(zhuǎn)時(shí),處理器會(huì)對(duì)LR進(jìn)行一個(gè)自動(dòng)的更新動(dòng)作:LR=LR-0x4,這樣LR里面的地址是0x300C-0x04=0x3008。但是0x3008并不是我們要的地址,因?yàn)橹袛喟l(fā)生在地址為0x3004的move指令執(zhí)行的時(shí)候,所以中斷處理完后應(yīng)該返回這個(gè)地址。 這就是在計(jì)算返回地址的時(shí)候LR減去4的原因。對(duì)于FIQ中斷和預(yù)取指中止異常,計(jì)算返回地址方法和IRQ相同。

          我的理解:本身PC總是指向當(dāng)前指令的下兩條指令的地址,PC的值為當(dāng)前指令的地址值加8個(gè)字節(jié)。發(fā)生跳轉(zhuǎn)時(shí),LR=LR-04,所以子程序返回時(shí)處理器自動(dòng)計(jì)算LR=LR+08-04(LR+04),剛好是執(zhí)行下一條指令。而中斷后是要返回發(fā)生中斷的當(dāng)前指令繼續(xù)執(zhí)行,所以應(yīng)該在LR返回后再減去一條指令地址04,即LR=LR-04。

          以下我的整理:

          2 、ARM處理器對(duì)異常的響應(yīng)步驟:

          a. 保護(hù)LR;

          b. 將CPSR到相應(yīng)的SPSR中;

          c. 根據(jù)異常類(lèi)型強(qiáng)制設(shè)置CPSR的運(yùn)行模式位;

          d. 跳轉(zhuǎn)異常處理程序。

          3、 ARM處理器對(duì)異常的返回步驟:

          a. LR,LR減去相應(yīng)的偏移量后送到PC;

          b. 將SPSR回CPSR中;

          c.清楚中斷禁止位。

          二、各中斷類(lèi)型及優(yōu)先級(jí)和返回值:

          1、FIQ(Fast Interrupt Request)

          FIQ異常是為了數(shù)據(jù)傳輸或通道處理而設(shè)計(jì)的。CPSR中的F位:=1 禁止FIQ中斷,=0允許中斷。只能在特權(quán)模式下才能改變F的狀態(tài)??捎赏獠繉FIQ引腳輸入低電平也能產(chǎn)生FIQ。返回指令: SUBS PC,R14_fiq,#4.

          2、IRQ(Interrupt Request)

          IRQ異常屬于正常的終端請(qǐng)求,可以在nIRQ引腳輸入低電平產(chǎn)生。CPSR中的I位: =1 禁止IRQ中斷,=0允許IRQ中斷,只能在特權(quán)模式下才能改變I的狀態(tài)。返回指令:SUBS PC,R14_irq,#4.

          3、Abort:中止

          產(chǎn)生中止異常意味著對(duì)存儲(chǔ)器的訪問(wèn)失敗。

          a:指令預(yù)取中止:發(fā)生在指令預(yù)取時(shí)。中斷后PC=PC+8,返回指令:SUBS PC,R14_abt,#4.

          b:數(shù)據(jù)中止:發(fā)生在數(shù)據(jù)訪問(wèn)時(shí)。中斷后PC=PC+12,返回指令: SUBS PC,R14_abt,#8.

          4、Software Interrupt

          SWI用于進(jìn)入管理模式,用于請(qǐng)求執(zhí)行特定的管理功能。返回地址:MOV PC,R14_svc.



          關(guān)鍵詞: ARM中斷異常處

          評(píng)論


          技術(shù)專(zhuān)區(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); })();