没什么好说的,只是搞不懂怎么把中断向量表固化到0x1000000,并映射到0x00000000地址
程序流程比较简单,首先运行2410init中的b ResetHandler跳转到初始化,然后在初始化结束以后跳转到main执行,main返回以后b .死循环
我们看看IRQ的执行过程,首先b HandlerIRQmm这里的HandlerIRQ是在2410init中定义的宏,也就是HandlerIRQ HANDLER HandleIRQ
HandlerIRQ可以理解成一个标号,无所谓
HandleIRQ是定义在 _ISR_STARTADDRESS+0x18地址的变量,保存了IRQ中断服务函数的入口地址
^ _ISR_STARTADDRESS ;0x33ffff00
HandleReset # 4 ;系统复位
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4 ;初始化成IsrIRQ的入口地址
HandleFIQ # 4 ;以上是异常向量表
HandleEINT0 # 4 ;以下定义不同IRQ的中断服务程序入口
HandleEINT1 # 4
HandleEINT2 # 4
;.
;.
HandleRTC # 4
HandleADC # 4 ;在IsrIRQ中断服务程序中实现中断服务分支
IRQ中断以后系统跳转到0x00000018也就是b HandlerIRQ,前边我们说了HandlerIRQ实际上是一个宏,实现跳转到变量HandleIRQ指定的地址(初始化成IsrIRQ中断服务函数),进入IRQ中断服务程序.在IsrIRQ中断服务程序中,根据INTOFFSET(中断偏移)实现中断服务分支程序.所以我们在主函数中需要初始化IRQ中断服务分支,如pISR_EINT1 = (unsigned)KeyIRQ1,其中pISR_EINT1 =_ISR_STARTADDRESS+0x24,KeyIRQ1是按键1的响应函数.
下面我们详细介绍按下Key1的中断服务过程:
1.跳转到0x00000018
2.调用HandlerIRQ HANDLER HandleIRQ
3.在2中跳转到HandleIRQ,也就是IsrIRQ
4.在3中取到IRQ中断偏移INTOFFSET = 0x01,跳转到HandleEINT0 + 0x01也就是变量HandleEINT1地址
关键点:异常向量表&IRQ中断分支表的初始化