2440中断向量的理解
(1),中断发生,arm跳到0x0000
(2)继续找,HandlerFIQ
HandlerFIQ
sub sp,sp,#4 ;decrement
stmfd sp!,{r0} ;PUSH
ldr
ldr
str
ldmfd
有兴趣的可以看下,它最终将pc赋值HandleFIQ的值
(3)那么HandleFIQ那里储存了什么呢?arm在启动时做了这样的赋值
ldr r0,=HandleIRQ
ldr r1,=IsrIRQ
str r1,[r0]
可见现在(2)中pc值为IsrIRQ所代表的地址。
(4)现在来到了IsrIRQ。详细看下:
IsrIRQ
sub sp,sp,#4
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
这段代码,首先计算服务程序的地址,然后跳过去。但是INTOFFSET和
HandleEINT0其实就是中断是量表的首地址(区分于arm的异常向量表),而上面所说的pISR_TIMER1就是有中断向量表得到的存放实际的中断处理函数的地址
#define
其实这个地址就应该是add r8,r8,r9,lsl
评论