本文转引自 飞凌嵌入式 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取值返回