ARM中斷區(qū)別-LPC2142與S3C2440的區(qū)別
/***************************************************
*說 明 :ARM中斷區(qū)別-LPC2142與S3C2440的區(qū)別
***************************************************/
LPC 與三星ARM的區(qū)別就是三星固定了中斷向量的地址,而LPC的就沒有。例如三星的S3C2440
所有的中斷源都有相對應(yīng)的中斷向量。
關(guān)于三星ARM
(1)使用向量中斷
ENTRY
b ResetHandler ; 0x00
b HandlerUndef ; 0x04
b HandlerSWI ; 0x08
b HandlerPabort ;0x0c
b HandlerDabort ; 0x10
b .; 0x14
b HandlerIRQ ; 0x18
b HandlerFIQ ; 0x1c
ldrpc,=HandlerEINT0; 0x20
ldrpc,=HandlerEINT1
ldrpc,=HandlerEINT2
ldrpc,=HandlerEINT3
ldrpc,=HandlerEINT4567
ldrpc,=HandlerTICK; 0x34
b.
b.
ldrpc,=HandlerZDMA0; 0x40
ldrpc,=HandlerZDMA1
ldrpc,=HandlerBDMA0
ldrpc,=HandlerBDMA1
ldrpc,=HandlerWDT
ldrpc,=HandlerUERR01; 0x54
b.
b.
ldrpc,=HandlerTIMER0; 0x60
ldrpc,=HandlerTIMER1
ldrpc,=HandlerTIMER2
ldrpc,=HandlerTIMER3
ldrpc,=HandlerTIMER4
ldrpc,=HandlerTIMER5; 0x74
b.
b.
ldrpc,=HandlerURXD0; 0x80
ldrpc,=HandlerURXD1
ldrpc,=HandlerIIC
ldrpc,=HandlerSIO
ldrpc,=HandlerUTXD0
ldrpc,=HandlerUTXD1 ; 0x94
b.
b.
ldrpc,=HandlerRTC; 0xa0
b.
b.
b.
b.
b .
b.
ldrpc,=HandlerADC; 0xb4
精析:很大不同的是ldr pc,=HandlerEINT0開始不同,三星ARM恰當利用了這些地址,很方便完成中斷的跳轉(zhuǎn)。
(2)不使用向量中斷
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
精析:
很大不同的是IsrIRQ,還有的是IsrIRQ沒有進行sub lr,lr,#4的操作。
原因是這里沒有出現(xiàn)過函數(shù)調(diào)用,那么lr仍然
是進入中斷前保存的lr的值.由于當函數(shù)加上__irq關(guān)鍵字(中斷服務(wù)函數(shù))時,
編譯器在執(zhí)行中斷服務(wù)函數(shù)之前自動添加上
sub lr,lr,#4
stmfd sp!,{r0-r3,r12,lr}(只壓棧r0-r3,r12,lr原因時ARM內(nèi)核進入中斷時默認壓棧r4-r7)
.....
ldmfd sp!,{r0-r3,r12,pc}^
注意:IsrIRQ是不可重入的。
; 在這里不出現(xiàn)sub lr,lr,#4原因是這里沒有出現(xiàn)過函數(shù)調(diào)用,那么lr仍然
; 是進入中斷前保存的lr的值.由于當函數(shù)加上__irq關(guān)鍵字(中斷服務(wù)函數(shù))時,
; 編譯器在執(zhí)行中斷服務(wù)函數(shù)之前自動添加上
; sub lr,lr,#4
; stmfd sp!,{r0-r3,r12,lr}(只壓棧r0-r3,r12,lr原因時ARM內(nèi)核進入中斷時默認壓棧r4-r7)
; .....
; ldmfd sp!,{r0-r3,r12,pc}^
; 注意:IsrIRQ是不可重入的。
關(guān)