background image

.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 中的。