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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM 向量中斷和非向量中斷

          ARM 向量中斷和非向量中斷

          作者: 時間:2016-11-21 來源:網(wǎng)絡 收藏
          44B0的向量中斷響應過程是中斷發(fā)生后芯片會自動跳轉(zhuǎn)到0x00000018處執(zhí)行指令

          ENTRY
          b ResetHandler ; 0x00
          b HandlerUndef ; 0x04
          b HandlerSWI ; 0x08
          b HandlerPabort ; 0x0c
          b HandlerDabort ; 0x10
          b . ; 0x14
          b HandlerIRQ ; 0x18
          b HandlerFIQ ; 0x1c

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

          ldr pc,=HandlerEINT0 ; 0x20
          ldr pc,=HandlerEINT1
          ldr pc,=HandlerEINT2
          ldr pc,=HandlerEINT3
          ldr pc,=HandlerEINT4567
          ldr pc,=HandlerTICK ; 0x34
          b .
          b .
          ldr pc,=HandlerZDMA0 ; 0x40
          ldr pc,=HandlerZDMA1
          ldr pc,=HandlerBDMA0
          ldr pc,=HandlerBDMA1
          ldr pc,=HandlerWDT
          ldr pc,=HandlerUERR01 ; 0x54
          b .
          b .
          ldr pc,=HandlerTIMER0 ; 0x60
          ldr pc,=HandlerTIMER1
          ldr pc,=HandlerTIMER2
          ldr pc,=HandlerTIMER3
          ldr pc,=HandlerTIMER4
          ldr pc,=HandlerTIMER5 ; 0x74
          b .
          b .
          ldr pc,=HandlerURXD0 ; 0x80
          ldr pc,=HandlerURXD1
          ldr pc,=HandlerIIC
          ldr pc,=HandlerSIO
          ldr pc,=HandlerUTXD0
          ldr pc,=HandlerUTXD1 ; 0x94
          b .
          b .
          ldr pc,=HandlerRTC ; 0xa0
          b .
          b .
          b .
          b .
          b .
          b .
          ldr pc,=HandlerADC ; 0xb4

          根據(jù)44b0的DATASEET,0x18處放置的指令為b HandlerIRQ; 當程序跳轉(zhuǎn)到這里執(zhí)行時, 芯片在這個地址取到的代碼已經(jīng)被后面程序中的branch instructions取代了,舉個例子,如果芯片EINT3發(fā)生中斷,芯片會跳轉(zhuǎn)到0x18處執(zhí)行,先在0x18處取指,這時取到的指令已經(jīng)不是b HandlerIRQ,b HandlerIRQ已經(jīng)被芯片自動替換成了ldr pc,=HandlerEINT3,然后芯片再執(zhí)行此條指令。

          非向量中斷的代碼如下:

          ENTRY
          b ResetHandler ; for debug
          b HandlerUndef ; handlerUndef
          b HandlerSWI ; SWI interrupt handler
          b HandlerPabort ; handlerPAbort
          b HandlerDabort ; handlerDAbort
          b . ; handlerReserved
          b IsrIRQ
          b HandlerFIQ
          . . . . . .

          IsrIRQ
          sub sp,sp,#4 ; reserved for PC
          stmfd sp!,{r8-r9}
          ldr r9,=I_ISPR
          ldr r9,[r9]
          mov r8,#0x0
          0movs r9,r9,lsr #1
          bcs %F1
          add r8,r8,#4
          b %B0
          1ldr r9,=HandleADC
          add r9,r9,r8
          ldr r9,[r9]
          str r9,[sp,#8]
          ldmfd sp!,{r8-r9,pc}
          . . . . . .

          HandleADC # 4
          HandleRTC # 4
          HandleUTXD1 # 4
          HandleUTXD0 # 4
          . . . . . .

          HandleEINT3 # 4
          HandleEINT2 # 4
          HandleEINT1 # 4
          HandleEINT0 # 4 ; 0xc1(c7)fff84

          當發(fā)生中斷時, 芯片自動跳轉(zhuǎn)到0x18處執(zhí)行, 0x18處指令為b IsrIRQ,IsrIRQ程序的作用是檢查I_ISPR的各位,判斷是何種中斷發(fā)生,然后根據(jù)中斷的種類跳轉(zhuǎn)到相應的中斷服務程序去執(zhí)行,各種中斷服務程序的地址定義如下:

          HandleADC # 4
          HandleRTC # 4
          HandleUTXD1 # 4
          HandleUTXD0 # 4
          . . . . . .

          HandleEINT3 # 4

          值得一提的是在44binit代碼中,向量中斷跳轉(zhuǎn)到HandlerEINT0處而非向量中斷跳轉(zhuǎn)到HandleEINT0,程序利用一個宏將這兩個標號等同起來,無論采取向量中斷還是非向量中斷,無論是跳到HandleEINT0還是HandlerEINT0,得到的效果是一樣的,都是跳到了中斷服務程序的地址去執(zhí)行。

          另外順便說一下飛利浦的LPC系列ARM芯片的中斷的方法,當LPC芯片得到中斷信號后,在中斷初始化時,程序?qū)⒅袛喾粘绦虻娜肟诘刂贩诺街袛嘞蛄康刂芳拇嫫髦校總€中斷源有一個中斷向量地址寄存器和他相對應,另外還有一個叫做VICVectAddr(0xffff0030)的寄存器,當發(fā)生中斷時,硬件自動判斷該執(zhí)行哪一個中斷,然后將該中斷源對應的中斷向量地址寄存器中的地址放到寄存器VICVectAddr中。程序中斷向量表里的代碼為跳轉(zhuǎn)到VICVectAddr中的地址執(zhí)行。一旦發(fā)生中斷,自動跳轉(zhuǎn)到VICVectAddr中的地址去執(zhí)行,因為此時VICVectAddr已經(jīng)被替換成中斷源的中斷服務程序地址了.

          上述
          HandleADC # 4
          是在數(shù)據(jù)區(qū)中分配4個字節(jié)的存儲空間, 等同于
          HandleADC FEILD 4
          這四個字節(jié)的存儲空間中存的是中斷服務程序的地址. 在C語言編寫的main程序中,如何將中斷服務程序的入口地址放入到這個存儲空間中呢?細心的讀者可以發(fā)現(xiàn)這段數(shù)據(jù)區(qū)的起始地址是_ISR_STARTADDRESS, 在MAIN函數(shù)中只要讓
          (*(unsigned *)(_ISR_STARTADDRESS+0x74)) =(int)MyIsr;
          MyIsr是中斷服務程序的名稱, 但是_ISR_STARTADDRESS是一個非定值,這個值只有在連接器連接的時候才賦值,在編譯階段他是個不定值,所以編譯的時候會報錯。#define _ISR_STARTADDRESS 成一個在SDRAM中的地址值。在本例中是0xc7fff00。

          中斷的初始化包括對INTMSK ,INTCON進行初始化,如果是EINT0~7 還需要對PCONG、EXTINT進行初始化,對
          (*(unsigned *)(_ISR_STARTADDRESS+0x74
          (或者其他偏移量)))賦值. 在中斷服務程序結(jié)尾要對I_ISPC寫數(shù)清除INTPND。
          如果是EINT0~7還要在寫I_ISPC之前對EXTINTPND寄存器寫數(shù)。




          關(guān)鍵詞: ARM向量中斷非向量中

          評論


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