|
为什么采用中断嵌套方式时要使用SYS模式?
这应该SP和LR有关:
LR的作用:1保存函数返回地址。
在调用子程序时,用反汇编工具可以看到:编译器编译后,每个子程序的最开始部分
都是一个压栈操作,必须要保存LR寄存器,来记录子程序运行后的返回地址
子程序调用示例:
main
....
ldr r0,=SubRoutine ;读取子程序地址
mov lr,pc ;保存当前pc到lr中
bx r0 ;跳转到子程序
SubRoutine
stmfd sp!,{r4-r12,lr} ;首先要保护lr,将其压栈
;body of routine
......
ldmfd sp!,{r4-r12,pc} ;return
2。发生中断时,保存被中断的模式的PC值。
问题是这两个作用在某些情况下是有冲突的。
当中断服务函数在IRQ模式下运行,允许中断嵌套,且在中断服务程序isr中调用了子程序时,这种冲突就会出现。
如果不允许中断嵌套,或者在isr中没有子程序调用,就不会发生这种冲突
当第一层中断运行到isr的子程序代码中时,发生了中断嵌套,此时lr保存了PC的值,
当异常发生时,cp被保存在异常模式下的lr中,cpsr也被保存在异常模式下的spsr中
接下来,cpsr根据异常方式被修改,pc 跳转到异常处理函数那里。
在改变pc前,ARM 子程序 跳转指令BL复制返回地址到lr中
所以子程序返回指令将r14(lr)返给pc(mov pc,lr)
这些操作结合起来,意味着处理异常的ARM模式必须确保不让另一个同类型的中断产生,
如果要调用子程序的话。因为子程序返回地址会被异常返回地址覆盖掉
注意:异常并不能进入系统模式。异常处理函数通过修改CPSR来进入SYS模式 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|