|
本文轉引自 飛凌嵌入式 S3C2440 技術討論區 www.witech.com.cn
粗略寫了一下S3C2440的中斷處理流程(以飛凌2440開發板所用bootloader代碼為例),給初學者看的,希望大家多多討論,不斷改進,使其最終成為一份完善的教程!
首先定義向量表堆棧 bootloader中取0x33ffff00
^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
IRQ堆棧地址為0x33ffff18,這里放中斷處理函數的入口地址。
ldr r0,=HandleIRQ ;This routine is needed
ldr r1,=IsrIRQ ;IsrIRQ就是中斷處理函數的入口地址
str r1,[r0]
中斷發生后程序自動從該處取值并跳轉
b HandlerIRQ ;handler for IRQ interrupt
HandlerIRQ HANDLER HandleIRQ
這里跳轉到了IsrIRQ
IsrIRQ
sub sp,sp,#4 ;sp-4,預留給pc。
stmfd sp!,{r8-r9} ;保護r8 r9 一會兒要用。這里沒有保持r14。
ldr r9,=INTOFFSET
ldr r9,[r9] ;獲得中斷號
ldr r8,=HandleEINT0 ;
add r8,r8,r9,lsl #2 ;通過中斷偏移值計算中斷源
ldr r8,[r8] ;取出相應中斷處理函數的入口地址值
str r8,[sp,#8] ;將其存在sp+8處,即剛才預留給pc的堆棧
ldmfd sp!,{r8-r9,pc} ;還原r8 r9并跳轉到中斷處理函數
中斷函數處理完后會從r14取值返回 |
|