找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4294|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ARM 向量中斷和非向量中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99624 發(fā)表于 2015-12-27 05:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
44B0的向量中斷響應(yīng)過程是中斷發(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
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)被后面程序中的branchinstructions取代了,舉個例子,如果芯片EINT3發(fā)生中斷,芯片會跳轉(zhuǎn)到0x18處執(zhí)行,先在0x18處取指,這時取到的指令已經(jīng)不是bHandlerIRQ,b HandlerIRQ已經(jīng)被芯片自動替換成了ldrpc,=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
0 movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1 ldr 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處指令為bIsrIRQ,IsrIRQ程序的作用是檢查I_ISPR的各位,判斷是何種中斷發(fā)生,然后根據(jù)中斷的種類跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序去執(zhí)行,各種中斷服務(wù)程序的地址定義如下:
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
. . . . . .
HandleEINT3 # 4
值得一提的是在44binit代碼中,向量中斷跳轉(zhuǎn)到HandlerEINT0處而非向量中斷跳轉(zhuǎn)到HandleEINT0,程序利用一個宏將這兩個標號等同起來,無論采取向量中斷還是非向量中斷,無論是跳到HandleEINT0還是HandlerEINT0,得到的效果是一樣的,都是跳到了中斷服務(wù)程序的地址去執(zhí)行。
另外順便說一下飛利浦的LPC系列ARM芯片的中斷的方法,當LPC芯片得到中斷信號后,在中斷初始化時,程序?qū)⒅袛喾⻊?wù)程序的入口地址放到中斷向量地址寄存器中,每個中斷源有一個中斷向量地址寄存器和他相對應(yīng),另外還有一個叫做VICVectAddr(0xffff0030)的寄存器,當發(fā)生中斷時,硬件自動判斷該執(zhí)行哪一個中斷,然后將該中斷源對應(yīng)的中斷向量地址寄存器中的地址放到寄存器VICVectAddr中。程序中斷向量表里的代碼為跳轉(zhuǎn)到VICVectAddr中的地址執(zhí)行。一旦發(fā)生中斷,自動跳轉(zhuǎn)到VICVectAddr中的地址去執(zhí)行,因為此時VICVectAddr已經(jīng)被替換成中斷源的中斷服務(wù)程序地址了.
上述
HandleADC # 4
是在數(shù)據(jù)區(qū)中分配4個字節(jié)的存儲空間, 等同于
HandleADC FEILD 4
這四個字節(jié)的存儲空間中存的是中斷服務(wù)程序的地址.在C語言編寫的main程序中,如何將中斷服務(wù)程序的入口地址放入到這個存儲空間中呢?細心的讀者可以發(fā)現(xiàn)這段數(shù)據(jù)區(qū)的起始地址是_ISR_STARTADDRESS,在MAIN函數(shù)中只要讓
(*(unsigned *)(_ISR_STARTADDRESS+0x74))=(int)MyIsr;
MyIsr是中斷服務(wù)程序的名稱,但是_ISR_STARTADDRESS是一個非定值,這個值只有在連接器連接的時候才賦值,在編譯階段他是個不定值,所以編譯的時候會報錯。#define_ISR_STARTADDRESS 成一個在SDRAM中的地址值。在本例中是0xc7fff00。
中斷的初始化包括對INTMSK ,INTCON進行初始化,如果是EINT0~7還需要對PCONG、EXTINT進行初始化,對
(*(unsigned *)(_ISR_STARTADDRESS+0x74
(或者其他偏移量)))賦值. 在中斷服務(wù)程序結(jié)尾要對I_ISPC寫數(shù)清除INTPND。
如果是EINT0~7還要在寫I_ISPC之前對EXTINTPND寄存器寫數(shù)。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表