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

          新聞中心

          ARM中斷PC返回值分析

          作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          在ARM程序的開發(fā)過程中,對(duì)中斷的處理是很普遍的、也是相當(dāng)重要的。Realview MDK使用的RVCT編譯器提供了__irq關(guān)鍵字,用此關(guān)鍵字修飾的函數(shù)被作為中斷來函數(shù)編譯,即在編譯的過程中,編譯器會(huì)自動(dòng)添加中斷處理過程中現(xiàn)場(chǎng)保護(hù)和恢復(fù)的代碼,減小程序的開發(fā)難度,加快軟件的開發(fā)過程。

          在理解__irq關(guān)鍵字的作用之前,先看一下ARM核對(duì)異常的處理過程。當(dāng)產(chǎn)生異常時(shí), ARM核拷貝CPSR寄存器的內(nèi)容SPSR_寄存器中,同時(shí)設(shè)置適當(dāng)?shù)腃PSR 位、改變處理器狀態(tài)進(jìn)入ARM 態(tài)和處理器模式,從而進(jìn)入相應(yīng)的異常模式。在設(shè)置中斷禁止位禁止相應(yīng)中斷(如果需要)后,ARM核保存返回地址到LR_,同時(shí)設(shè)置PC為相應(yīng)的異常向量。當(dāng)異常返回時(shí), 異常處理需要從SPSR_寄存器中恢復(fù)CPSR的值,同時(shí)從LR_恢復(fù)PC,具體的異常返回指令如下:

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

          Ø 從SWI和Undef異常返回時(shí)使用:

          MOVS PC, LR;

          Ø 從FIQ、IRQ和預(yù)取終止返回時(shí)使用:

          SUBS PC, LR,#4;

          Ø 從數(shù)據(jù)異常返回時(shí)使用:

          SUBS PC, LR,#8

          在使用上述指令異常返回時(shí),如果LR之前被壓棧的話使用LDM “∧”, 例如:

          LDMFD SP!, {PC}∧

          退出異常處理

          SWI和未定義指令異常中斷是由當(dāng)前執(zhí)行的指令自身產(chǎn)生的。當(dāng)SWI和未定義指令異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值還未更新,它指向當(dāng)前指令后面第2條指令(對(duì)于ARM指令來說+8字節(jié);對(duì)于Thumb指令來說+4字節(jié)的位置)。當(dāng)SWI和未定義指令異常中斷產(chǎn)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(shí)(PC-4)即指向當(dāng)前指令的下一條指令地址。因此返回操作可以通過下面的指令來實(shí)現(xiàn):MOV PC,LR

          該指令將寄存器LR中的值到程序計(jì)數(shù)器PC中實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode寄存器內(nèi)容到當(dāng)前程序狀態(tài)寄存器CPSR中。

          在指令預(yù)取時(shí),如果目標(biāo)地址是非法的,該指令將被標(biāo)記成有問題的指令。這時(shí),流水線上該指令之前的指令繼續(xù)執(zhí)行。當(dāng)執(zhí)行到該被標(biāo)記成有問題的指令時(shí),處理器產(chǎn)生指令預(yù)取中止異常中斷。

          當(dāng)發(fā)生指令預(yù)取中止異常中斷時(shí),程序要返回到該有問題的指令處,重新讀取并執(zhí)行該指令。因此指令預(yù)取中止異常中斷程序應(yīng)該返回到產(chǎn)生該指令預(yù)取中止異常中斷的指令處,而不是返回到發(fā)生中斷的指令的下一條指令。

          指令預(yù)取中止異常中斷是由當(dāng)前執(zhí)行的指令自身產(chǎn)生的,當(dāng)指令預(yù)取中止異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值還未更新,它指向當(dāng)前指令后面第2條指令(對(duì)于ARM指令來說,它指向當(dāng)前指令地址加8個(gè)字節(jié)的w位置;對(duì)于Thumb指令來說,它指向當(dāng)前指令地址加4個(gè)字節(jié)的位置)。當(dāng)指令預(yù)取中止異常中斷產(chǎn)生時(shí),處理器將(PC-4)值保存到異常模式下的寄存器LR_mode中。這時(shí)(PC-4)即指向當(dāng)前指令的下一條指令。因此返回操作可以通過下面的指令來實(shí)現(xiàn):SUBS PC,LR,#4

          該指令將寄存器LR中的值減4后,到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode寄存器內(nèi)容到當(dāng)前程序狀態(tài)寄存器CPSR中。

          發(fā)生數(shù)據(jù)訪問異常中斷時(shí),程序要返回到該有問題的指令處,重新訪問該數(shù)據(jù),因此數(shù)據(jù)訪問異常中斷應(yīng)該返回到產(chǎn)生該數(shù)據(jù)訪問中止異常中斷的指令處,而不是當(dāng)前指令的下一條指令。

          數(shù)據(jù)訪問異常中斷由當(dāng)前執(zhí)行的指令自身產(chǎn)生,當(dāng)數(shù)據(jù)訪問異常中斷發(fā)生時(shí),程序計(jì)數(shù)器pc的值已經(jīng)更新,它指向當(dāng)前指令后面第3條指令(對(duì)于ARM指令,它指向當(dāng)前指令地址加12字節(jié)的位置;對(duì)于Thumb指令,它指向當(dāng)前指令地址加6字節(jié)的位置)。此時(shí)處理器將值(pc-4)保存到lr_abt中,它指向當(dāng)前指令后面第2條指令,所以返回操作可以通過下面指令實(shí)現(xiàn):subs pc, lr, #8

          該指令將lr中的值減8后傳給程序計(jì)數(shù)器pc中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_abt寄存器內(nèi)容到當(dāng)前程序狀態(tài)寄存器CPSR中;

          通常處理器執(zhí)行完當(dāng)前指令后,查詢IRQ中斷引腳,并查看是否允許IRQ中斷,如果某個(gè)中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生IRQ異常中斷,當(dāng)IRQ異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器pc的值已經(jīng)更新,它指向當(dāng)前指令后面第3條指令(對(duì)于ARM指令,它指向當(dāng)前指令地址加12字節(jié)的位置;對(duì)于Thumb指令,它指向當(dāng)前指令地址加6字節(jié)的位置),當(dāng)IRQ異常中斷產(chǎn)生時(shí),處理器將值(pc-4)保存到IRQ異常模式下的寄存器lr_irq中,它指向當(dāng)前指令之后的第2條指令,因此返回操作可以通過下面指令實(shí)現(xiàn):subs pc, lr, #4

          與IRQ異常中斷一樣,處理器執(zhí)行完當(dāng)前指令后,查詢FIQ中斷引腳,并查看是否允許FIQ中斷,如果中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生FIQ異常中斷,當(dāng)FIQ異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器pc的值已經(jīng)更新,它指向當(dāng)前指令后面第3條指令(對(duì)于ARM指令,它指向當(dāng)前指令地址加12字節(jié)的位置;對(duì)于Thumb指令,它指向當(dāng)前指令地址加6字節(jié)的位置),當(dāng)FIQ異常中斷產(chǎn)生時(shí),處理器將值(pc-4)保存到IRQ異常模式下的寄存器lr_fiq中,它指向當(dāng)前指令之后的第2條指令,因此返回操作可以通過下面指令實(shí)現(xiàn):subs pc, lr, #4



          關(guān)鍵詞: ARM中斷PC返回

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