谢谢各位!只是我觉得按CM3手册《李岩 ARM CM3 权威指南》,CM3在中断响应过程,第一步入栈板保存现场,然后更新各寄存器(包括PC),然后再开始执行ISR,我的疑惑是在更新了部分或全部寄存器而在开始执行ISR前来了更高优先级中断,那么已经更新寄存器全部丢弃,按Late-arriving处理,之后再按tail-chaining处理?抑或按嵌套的中断处理?
对于2,我的疑惑是,利用PendSV的自动入栈和出栈操作,按楼上说的,OS任务切换关中断应该在挂起PenSV之前,否则若在PendSV中关中断,则需要在PendSV的ISR返回前开中断,而开了中断就有可能被高级中断抢占(假设PendSV为最低优先级),而这样就使PendSV的ISR中任务切换时只是部分还原了任务现场(R4~R11),其他8个寄存器因还没有执行PendSV的返回而没有还原了就有被中断了;但若是在响应PendSV前关中断,那就不可能响应PendSV了.
另外,还有个疑惑,我觉得按CM3手册《李岩 ARM CM3 权威指南》,CM3设计初衷,其中的非特权模式(Unprivileged)使用于用户任务,PendSV用于OS的任务切换,那么就有二个问题:a 在Unprivileged模式下不能执行MRS/MSR以及CPS指令,也就是说在用户任务中不能开关中断,那么采用类似于uCos II的OS中CM3就不能运行在Unprivileged模式下,否则uCos II中的各种系统调用都不能用(不会建议用SVC切换CM3
特权模式再开关中断吧?);b NVIC的寄存器不能在Unprivileged模式下操作,那么也就不能关起PendSV了,难道也先要切换到Privileged模式再挂起PendSV? 基于以上CM3若在Unprivileged模式下开放CPS指令和挂起PendSV,uCos II就可以完美的利用CM3的Unprivileged模式下的安全保护特性了.
|