在用ADS调试的时候,把程序下载到0x3000 0000处,如果此时0x00处有中断向量的话,程序调试就会成功,进入到中断处理程序中。
现在的问题是,程序怎么知道中断处理函数在哪?此时我明明是烧写到0x3000 0000处,但中断向量怎么会跳转到这个地方呢?
这个不是一两句就能讲清楚的,建议看看ARM手册,以及汇编代码.
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}
这是对应非向量中断的查找中断入口的ISR,每个中断服务程序的入口地址都被保存到一个固定内存区域,然后通过上面代码查找。
0地址的异常处理:
b ResetHandler
b . ;handler for Undefined mode
b . ;HandlerSWI
b . ;HandlerPabort
b . ;HandlerDabort
b .
b IsrIRQ ;HandlerIRQ;
b . ;HandlerFIQ
IsrIRQ的处的代码再去查找相应的中断处理函数,就如2楼所写的代码
程序怎么知道中断处理函数在哪? 中断服务程序的地址设定好了么?
引用: 引用 6 楼 cfanlwn 的回复:
程序怎么知道中断处理函数在哪? 中断服务程序的地址设定好了么?
你小子和我当年学习一样,非要插根问底,呵呵,搞研发应该这样!
中断发生后,系统工作模式变成中断异常,pc就会跑到b IsrIRQ ;HandlerIRQ; 这一过程是CPU实现的,然后跑到2楼代码去查找中断源对应中断处理函数的入口地址,pc就会跳转到那里。这个地址我们编程时怎么赋值的呢?
在我们的程序中有类似pISR_IIC = (unsigned)IicInt;一句代码,IicInt就是我们编写的中断处理代码,这句代码的意思就是将中断处理程序的入口地址放在PC要跳转的地方。这样PC就会再跳转到IicInt得入口地址,这个地址我们不需要知道!
更正,俺不是男生,不要叫俺小子 pISR_IIC = (unsigned)IicInt; 我说的中断地址就是IicInt 这如果都没设置好,还跑啥中断啊
ls刚刚只是说了 非向量中断,另外还有向量中断。
在44b0里面,向量中断,在产生中断,读取0x18存放的指令的时候,会由中断控制器产生一条跳转语句,自动跳转到你对应的中断入口函数。
在lpc里面,则是由vicvect来搞的。。也是类似的东西。