您的位置 首页 模拟

2440中断向量的了解

以定时器中断为例,我们作为用户需要完成的任务:1定时器的初始化,各种寄存器赋值2使能中断(cpsr和中断控制器),然后将服务程序地址赋给

定时器中止为例,咱们作为用户需求完结的使命:1定时器的初始化,各种寄存器赋值2使能中止(cpsr和中止控制器),然后将服务程序地址赋给pISR_TIMER1(为什么赋给它,后边评论)3当然是编写具体的中止服务程序。其他发动代码协助咱们完结了。程序履行过程中,中止产生了,咱们看看处理器怎么找到咱们的服务程序的(这不是天然的,是通过n道工序,没有平白无故的爱)。
(1),中止产生,arm跳到0x00000018履行此处指令,这是硬件决议的。这儿放置了一个跳转指令:b HandlerIRQ ;handlerforIRQinterrupt
(2)持续找,HandlerFIQHANDLERHandleFIQ,这是什么呢,他是一个宏,我把它翻译过来:
HandlerFIQ
sub sp,sp,#4 ;decrementsp(tostorejumpaddress)
stmfd sp!,{r0} ;PUSHtheworkregistertostack(lrdoestpushbecauseitreturntooriginaladdress)
ldrr0,=HandleFIQ;loadtheaddressofHandleXXXtor0
ldrr0,[r0] ;loadthecontents(serviceroutinestartaddress)ofHandleXXX
strr0,[sp,#4];storethecontents(ISR)ofHandleXXXtostack
ldmfdsp!,{r0,pc};POPtheworkregisterandpc(jumptoISR)
有爱好的能够看下,它终究将pc赋值HandleFIQ的值
(3)那么HandleFIQ那里贮存了什么呢?arm在发动时做了这样的赋值
ldr r0,=HandleIRQ
ldr r1,=IsrIRQ
str r1,[r0]
可见现在(2)中pc值为IsrIRQ所代表的地址。
(4)现在来到了IsrIRQ。具体看下:
IsrIRQ
sub sp,sp,#4;reservedforPC
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便是有中止向量表得到的寄存实践的中止处理函数的地址
#definepISR_TIMER1 (*(unsigned*)(_ISR_STARTADDRESS+0x4c))
其实这个地址就应该是add r8,r8,r9,lsl#2中终究得到的r8。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/262918.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部