【发布时间】:2019-03-26 05:16:50
【问题描述】:
当 IRQ 中断加载/存储多条指令时,我面临与 Return-From-Interrupt 相关的问题。
当 IRQ 中断一个加载/存储多条指令时,EPSR 的 ICI 字段指示 LDM/STM 指令应在中断返回时继续。
在中断入口异常帧(包含调用者保存的上下文)由硬件自动存储在当前堆栈中。
在我的例子中,内核软件然后保存被调用者保存的上下文并准备一个新的上下文,其中包括堆栈上的一个虚拟异常帧。 准备好新上下文后,执行 BX LR 指令,弹出虚拟异常帧。由于虚拟异常帧包含返回地址(返回地址指向新的中断处理程序),执行转到新的中断处理程序。
在这种情况下,如果被中断的指令是 LDM/STM 指令,我会得到一个带有 INVSTATE 的 USAGE-FAULT 异常,因为从中断返回的硬件需要适当的 LDM/STM 指令,而返回地址是就我而言,位置不同。
ARM-Architecture Reference Manual 提到了三个可以为 CortexM 实现的设计选项。
在指令集属性寄存器2(ID_ISAR2)中,bits[11:8]:
- 不支持。这意味着 LDM 和 STM 指令不 可中断的。 ARMv7-M 保留。
- LDM 和 STM 指令可重新启动。
- LDM 和 STM 指令是可继续的。
我的硬件是使用选项 3 实现的。
我无法理解的是,如果我将 IPSR 的 ICI 字段强制为 0, 我的 LDM/STM 指令会重新启动还是会出现异常?
即使它被重新启动(考虑到中断的 STM 指令)它是否会压入已经部分压入的寄存器的顶部,在这种情况下最终会破坏堆栈,或者它会在重新启动操作之前调整堆栈指针。
【问题讨论】:
标签: exception interrupt-handling cortex-m armv7