2440中断向量的理解
时间:11-21
来源:互联网
点击:
以定时器中断为例,我们作为用户需要完成的任务:1定时器的初始化,各种寄存器赋值2使能中断(cpsr和中断控制器),然后将服务程序地址赋给pISR_TIMER1(为什么赋给它,后面讨论)3当然是编写具体的中断服务程序。其他启动代码帮助我们完成了。程序执行过程中,中断发生了,我们看看处理器如何找到我们的服务程序的(这不是天然的,是经过n道工序,没有无缘无故的爱)。
(1),中断发生,arm跳到0x0000 0018执行此处指令,这是硬件决定的。这里放置了一个跳转指令:b HandlerIRQ ;handler for IRQ interrupt
(2)继续找,HandlerFIQ HANDLER HandleFIQ,这是什么呢,他是一个宏,我把它翻译过来:
HandlerFIQ
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does t push because it return to original address)
ldr r0,= HandleFIQ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
有兴趣的可以看下,它最终将pc赋值HandleFIQ的值
(3)那么HandleFIQ那里储存了什么呢?arm在启动时做了这样的赋值
ldr r0,=HandleIRQ
ldr r1,=IsrIRQ
str r1,[r0]
可见现在(2)中pc值为IsrIRQ所代表的地址。
(4)现在来到了IsrIRQ。详细看下:
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}
这段代码,首先计算服务程序的地址,然后跳过去。但是INTOFFSET和 HandleEINT0两个东西然人费解。INTOFFSET寄存器的功能则很简单,它的作用只是用于表明哪个中断正在被处理。下面是该寄存器各位详细功能列表
HandleEINT0其实就是中断是量表的首地址(区分于arm的异常向量表),而上面所说的pISR_TIMER1就是有中断向量表得到的存放实际的中断处理函数的地址
#define pISR_TIMER1 (*(unsigned *)(_ISR_STARTADDRESS+0x4c))
其实这个地址就应该是add r8,r8,r9,lsl #2中最终得到的r8。
(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
2440中断向 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)