找了介绍ARM的外部中断处理过程的很多资料,但是大部分文章介绍的都不太清楚,现在自己总结如下:
我认为,ARM外部中断处理过程应该从静态核动态两个方面来解释:
静态方面,需要系统做如下准备工作:
1.初始化各中断分发例程在内存中的地址,在s3c2410init.s中是如下代码:
^ _ISR_STARTADDRESS
HandleIRQ # 4
.......
2.准备中断处理子程序IRQ
3.宏$HandlerLabel HANDLER $HandleLabel,该宏实现了跳转进入中断处理子程序IRQ的功能,不通中断调用宏如下:
HandlerIRQ HANDLER HandleIRQ
HandlerFIQ HANDLER HandleFIQ
........
4.系统自己建立中断向量表
b HandlerIRQ
b HandlerFIQ
..........
5.在系统启动初始化阶段将中断处理子程序地址放入HandleIRQ(在第一步中建立)所指向的空间。
到此为止,我们已经建立好了完整的中断处理程序。
下面,我们从动态方面介绍中断处理过程:
1.产生外部中断
2.CPU自动执行0x18处指令(应为跳转指令),跳转进入宏HandlerIRQ。
3.在宏HandlerIRQ中,跳转进入IRQ中断处理子程序(在系统初始化时已经把IRQ中断处理子程序地址放入HandleIRQ指向地址空间),从而响应中断。
至此,从动态方面解释中断处理过程完毕。
1.开中断
2.发生中断 内核自动跳转到0x0000018,0x0000018处应该又一个b HandlerIRQ (中断向量表)
3.进入IRQ中断异常,执行b HandlerIRQ 这条指令在启动代码bootloder中定义好了
4.跳转到HandlerIRQ HANDLER HandleIRQ 调用宏$HandlerLabel HANDLER $HandleLabel
5.宏的作用就是由HandlerIRQ跳到ISR中断处理程序。
6.下面语句就是把IsrIRQ 的地址装入HandleIRQ
ldr r0,=HandleIRQ ;This routine is needed
ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
str r1,[r0]
7.IsrIRQ的地址里面放的是C文件中服务程序的入口地址:pISR_IRQ = (unsigned)IrqHandler;
8.这样就实现了中断的跳转