问题描述
(我正在学习Cortex-M微控制器,不禁将其与x86 cpu进行比较。)
对于x86,对于诸如页面错误之类的错误,导致/触发该错误的指令将在处理该错误之后再次执行。
但是对于ARM NVIC,我没有看到这种机制。 NVIC硬件只是自动将R0-R3,R12,PC,LR,SP xPSR
放在ISR入口处的堆栈上(不受编程人员的干扰)。并在ISR出口处从堆栈中还原此寄存器上下文。根据我的调试,恢复后, PC寄存器仍将指向被中断指令的地址。
我认为中断只能在一个循环的边界发生(如果我错了,请纠正我)。我不确定以下2种猜测是否成立:
-
对于单周期指令,由于PC仍指向该中断指令,因此将再次执行该中断的指令。
-
对于多周期指令,应继续执行被中断指令的剩余周期。
我猜这两种情况应该由实现这些指令的微代码来保证。
所以我的问题是:
-
ARM NVIC是否具有x86之类的机制来重新执行引起错误的指令?
-
被中断的指令是否像上述两种情况一样继续执行?
ADD 1-2020年10月6日晚上9:31
感谢domen的提醒。
我检查了例外控制流程上的一些材料,例外通常归类为:
- 中断(异步发生,在当前指令完成后处理,处理程序返回到下一条指令。)
- 陷阱(同步发生,由当前指令有意触发,处理程序返回到下一条指令。)
- 故障(异步发生,与当前指令无关,处理程序返回到当前指令。)
- 中止(异步发生,与当前指令无关,处理程序从不返回应用程序,而是返回特殊的中止例程。)
我检查了《 ARMv7-M Arch参考手册》。在B1.5.6异常条目行为部分中,我找到了用于确定返回地址的伪代码:
因此对于不同的异常类型,可以返回不同的返回地址。 ThisInsTraddr
和NextInsTraddr
都是可能的。
我认为应该对前两种情况进行一些更正。即,PC
是由硬件自动推入堆栈的值。可以是ReturnAddress
或ThisInsTraddr
。
ADD 2-2020年10月6日晚上10:32
感谢old_timer。是的,我确实混合了故障并打断了一点。故障不会通过NVIC,中断不会。
以下是内部异常/故障和外部中断的优先级列表。 (引自 Cortex-M处理器系列设计指南第二版)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)