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

          新聞中心

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

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

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

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

          復(fù)位程序?qū)⑦M(jìn)行一些初始化工作,內(nèi)容與具體系統(tǒng)相關(guān)。下面是復(fù)位程序的主要功能。

          · 設(shè)置異常中斷向量表。

          · 初始化數(shù)據(jù)棧和寄存器。

          · 初始化存儲(chǔ)系統(tǒng),如系統(tǒng)中的MMU等。

          · 初始化關(guān)鍵的I/O設(shè)備。

          · 使能中斷。

          · 處理器切換到合適的模式。

          · 初始化C變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行。

          2.未定義指令異常

          當(dāng)處理器執(zhí)行協(xié)處理器指令時(shí),它必須等待一個(gè)外部協(xié)處理器應(yīng)答后,才能真正執(zhí)行這條指令。若協(xié)處理器沒(méi)有相應(yīng),則發(fā)生未定義指令異常。

          未定義指令異??捎糜谠跊](méi)有物理協(xié)處理器的系統(tǒng)上,對(duì)協(xié)處理器進(jìn)行軟件仿真,或通過(guò)軟件仿真實(shí)現(xiàn)指令集擴(kuò)展。例如,在一個(gè)不包含浮點(diǎn)運(yùn)算的系統(tǒng)中,CPU遇到浮點(diǎn)運(yùn)算指令時(shí),將發(fā)生未定義指令異常中斷,在該未定義指令異常中斷的處理程序中可以通過(guò)其他指令序列仿真浮點(diǎn)運(yùn)算指令。

          仿真功能可以通過(guò)下面步驟實(shí)現(xiàn)。

          ① 將仿真程序入口地址鏈接到向量表中未定義指令異常中斷入口處(0x00000004或0xffff0004),并保存原來(lái)的中斷處理程序。

          ② 讀取該未定義指令的bits[27∶24],判斷其是否是一條協(xié)處理器指令。如果bits[27∶24]值為0b1110或0b110x,該指令是一條協(xié)處理器指令;否則,由軟件仿真實(shí)現(xiàn)協(xié)處理器功能,可以同過(guò)bits[11∶8]來(lái)判斷要仿真的協(xié)處理器功能(類(lèi)似于SWI異常實(shí)現(xiàn)機(jī)制)。

          ③ 如果不仿真該未定義指令,程序跳轉(zhuǎn)到原來(lái)的未定義指令異常中斷的中斷處理程序執(zhí)行。

          當(dāng)未定義異常發(fā)生時(shí),系統(tǒng)執(zhí)行下列的偽操作。

          r14_und = address of next instruction after the undefined instruction

          SPSR_und = CPSR

          CPSR[4∶0] = 0b11011 /*進(jìn)入未定義指令模式*/

          CPSR[5] = 0 /*處理器進(jìn)入狀態(tài)*/

          /*CPSR[6]保持不變*/

          CPSR[7] = 1 /*禁止外設(shè)中斷*/

          If high vectors configured then

          PC = 0xffff0004

          Else

          PC = 0x00000004

          3.軟中斷SWI

          軟中斷異常發(fā)生時(shí),處理器進(jìn)入特權(quán)模式,執(zhí)行一些特權(quán)模式下的操作系統(tǒng)功能。軟中斷異常發(fā)生時(shí),處理器執(zhí)行下列偽操作。

          r14_svc = address of next instruction after the SWI instruction

          SPSR_und = CPSR

          CPSR[4∶0] = 0b10011 /*進(jìn)入特權(quán)模式*/

          CPSR[5] = 0 /*處理器進(jìn)入狀態(tài)*/

          /*CPSR[6]保持不變*/

          CPSR[7] = 1 /*禁止外設(shè)中斷*/

          If high vectors configured then

          PC = 0xffff0008

          Else

          PC = 0x00000008

          4.預(yù)取指令異常

          預(yù)取指令異常使由系統(tǒng)存儲(chǔ)器報(bào)告的。當(dāng)處理器試圖去取一條被標(biāo)記為預(yù)取無(wú)效的指令時(shí),發(fā)生預(yù)取異常。

          如果系統(tǒng)中不包含MMU時(shí),指令預(yù)取程序只是簡(jiǎn)單地報(bào)告錯(cuò)誤并退出。若包含MMU,引起異常的指令的物理地址被存儲(chǔ)到內(nèi)存中。

          預(yù)取異常發(fā)生時(shí),處理器執(zhí)行下列偽操作。

          r14_svc = address of the aborted instruction + 4

          SPSR_und = CPSR

          CPSR[4∶0] = 0b10111 /*進(jìn)入特權(quán)模式*/

          CPSR[5] = 0 /*處理器進(jìn)入ARM狀態(tài)*/

          /*CPSR[6]保持不變*/

          CPSR[7] = 1 /*禁止外設(shè)中斷*/

          If high vectors configured then

          PC = 0xffff000C

          Else

          PC = 0x0000000C

          5.?dāng)?shù)據(jù)訪問(wèn)中止異常

          數(shù)據(jù)訪問(wèn)中止異常是由存儲(chǔ)器發(fā)出數(shù)據(jù)中止信號(hào),它由存儲(chǔ)器訪問(wèn)指令Load/Store產(chǎn)生。當(dāng)數(shù)據(jù)訪問(wèn)指令的目標(biāo)地址不存在或者該地址不允許當(dāng)前指令訪問(wèn)時(shí),處理器產(chǎn)生數(shù)據(jù)訪問(wèn)中止異常。

          當(dāng)數(shù)據(jù)訪問(wèn)中止異常發(fā)生時(shí),處理器執(zhí)行下列偽操作。

          r14_abt = address of the aborted instruction + 8

          SPSR_abt = CPSR

          CPSR[4∶0] = 0b10111

          CPSR[5] = 0

          /*CPSR[6]保持不變*/

          CPSR[7] = 1 /*禁止外設(shè)中斷*/

          If high vectors configured then

          PC = 0xffff000C10

          Else

          PC = 0x00000010



          評(píng)論


          相關(guān)推薦

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