微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cortex-M NVIC如何继续执行中断的指令?

如何解决Cortex-M NVIC如何继续执行中断的指令?

(我正在学习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异常条目行为部分中,我找到了用于确定返回地址的伪代码

enter image description here

因此对于不同的异常类型,可以返回不同的返回地址。 ThisInsTraddrNextInsTraddr都是可能的。

我认为应该对前两种情况进行一些更正。即,PC是由硬件自动推入堆栈的值。可以是ReturnAddressThisInsTraddr

ADD 2-2020年10月6日晚上10:32

感谢old_timer。是的,我确实混合了故障并打断了一点。故障不会通过NVIC,中断不会。

以下是内部异常/故障和外部中断的优先级列表。 (引自 Cortex-M处理器系列设计指南第二版)

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。