.endm
申明
IRQ 异常的服务程序为:IsrIRQ,即,发生 IRQ 异常时,执行"b HandlerIRQ"即是
运行
IsrIRQ 代码:
代码
ldr r0,=HandleIRQ @ This routine is needed
ldr r1,=IsrIRQ @ if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
str r1,[r0]
IRQ 异常处理程序:
代码
IsrIRQ:
sub sp,sp,#4 @ reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
由上可以知道,当一个 IRQ 中断发生时,CPU 将从 0X18(IRQ 异常入口地址)取指执
行,在这一步
PC 的跳转是有硬件实现的。在入口 0x18 地址处放的是一条跳转指令,这条
指令将跳到
IRQ 异常处理程序运行,IRQ 异常处理程序主要是根据中断源查找中断向量表。
获得中断入口地址后,接着
CPU 跳转中断处理程序运行。
在嵌入式系统中异常向量表和中断向量表都是存于 FLASH 起始的一段空间中。而异常处
理和中断处理程序都是运行在
RAM 中的。