看了Cortex-M3技术参考手册后,感觉对异常处理中堆栈的操作理解还是不清晰.
1.在Thread mode下,发生异常或中断,处理器自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行压栈,当ISR返回时,又自动将上述寄存器出栈.这个没问题.
2.当抢先优先级不同时,优先级高的中断可以对正在处理的低优先级中断处理程序进行占先.那占先的过程应该是怎样的?是立即终止低优先级中断代码执行,转到高优先级中断处理程序;还是手册中所指的Tail-chaining,等低优先级中断处理完成,不进行入栈出栈,紧接着调用高优先级中断处理程序?
3.如果中断嵌套是按照第2点中的前者,也就是高优先级中断立即打断低优先级中断的执行的话,那么用汇编编写中断处理程序时,是否需要自己对用到的寄存器进行入栈保护?因为处理器只是在第一次进入异常或中断时,才自动保存第1点中提到的8个寄存器.
4.如果中断嵌套是按照第2点中的后者,也就是低优先级处理完成才处理高优先级的中断,那么这样的抢先似乎名不符实,怎么保证快速的中断响应呢?
请不要混淆中断的优先级处理和Tail-chaining
这是2个独立的概念,不要把他们硬拉到一起。
我的理解
3.如果中断嵌套是按照第2点中的前者,也就是高优先级中断立即打断低优先级中断的执行的话,那么用汇编编写中断处理程序时,是否需要自己对用到的寄存器进行入栈保护?因为处理器只是在第一次进入异常或中断时,才自动保存第1点中提到的8个寄存器.
发生低优先级中断后处理器自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行压栈并开始执行低优先级中断程序。
发生抢占的时候,高优先级中断立即打断低优先级中断的执行,同时处理器自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行压栈并执行高优先级中断程序。
等高优先级的中断执行完后,自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行出栈,继续执行低优先级的中断。
等低优先级的中断执行完,自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行出栈。
谁说:处理器只是在第一次进入异常或中断时,才自动保存
LZ从哪里得到这个结论?
我是看它写着不可重复开始,所以以为只是刚中断时自动保存
请始终按合理的方向理解
如果总是向不合理的方向理解,只能是钻牛角尖了。
楼上红笔圈出的部分表示:一旦开始了“Push eight registers”的动作,则这个动作不能被重新开始。
那Tail-chaining怎么理解呢
手册上5.6有一段这样写的
The processor tail-chains if a pending interrupt has higher priority than all stacked exceptions.
如果挂起的中断比当前中断优先级高的话,那不是立即就发生切换了吗?Tail-chaining什么情况下发生呢?
Tail-chaining是指一个中断退出至下一个中断进入这段时间的动
当CPU服务于某个中断(假设为A)时,如果有优先级低于当前中断的其它中断到达,它们(假设有B、C、D)将会被至于挂起状态;当前中断的处理结束后,所有处于挂起状态的中断中优先级最高的哪个(假设是C)将要被响应(8楼那段英文的后半段就是这个意思)。
按照以前没有Tail-chaining的处理,大致的处理过程可以如下描述:
1)压栈保存寄存器
2)进入中断A的服务程序
3)处理中断A
4) 退栈恢复寄存器
5)压栈保存寄存器
6)进入中断C的服务程序
7)处理中断C
8) 退栈恢复寄存器
引入Tail-chaining的概念,上述的步骤4)和步骤5被省略,节省了时间。
从这个过程可以看出Tail-chaining的概念与中断优先级的概念无关。
Tail-chaining 咬尾,尾联,交尾。总之还没回过神来又干上了。
等干完了再收拾现场,省得多一道手续。
多谢香主
明白了,抢先用于低级中断处理过程中发生高级中断,Tail-Chaining是高级中断处理过程中发生低级中断时用到的一项技术.