【问题标题】:Interrupted Load-Multiple/Store-Multiple on CortexMCortexM 上的中断加载倍增/存储倍增
【发布时间】: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]:

  1. 不支持。这意味着 LDM 和 STM 指令不 可中断的。 ARMv7-M 保留。
  2. LDM 和 STM 指令可重新启动。
  3. LDM 和 STM 指令是可继续的。

我的硬件是使用选项 3 实现的。

我无法理解的是,如果我将 IPSR 的 ICI 字段强制为 0, 我的 LDM/STM 指令会重新启动还是会出现异常?

即使它被重新启动(考虑到中断的 STM 指令)它是否会压入已经部分压入的寄存器的顶部,在这种情况下最终会破坏堆栈,或者它会在重新启动操作之前调整堆栈指针。

【问题讨论】:

    标签: exception interrupt-handling cortex-m armv7


    【解决方案1】:

    ICI/IT 字段是 EPSR 的一部分,而不是 IPSR,并不是说如果您与 xPSR 交互,它会产生巨大的差异。

    如果一条 STM 或 LDM 指令被中断,EPSR 设置为指示可以继续执行的点,并触发然后异常入口。因此,堆栈的 PSR 值包含此信息,就像它包含中断代码中的 Thumb 位一样。如果您的新上下文在堆叠 PSR 的 ISI 位中为零,则由于您给出的原因,您不应该看到使用错误异常。 (在没有任何代码的情况下,我真的不能比这更具体。)

    如果 LDM 和 STM 实现为可重新启动或可继续,则不,堆栈不会被此进程破坏。 (那将是一场噩梦!)如果 LDM 和 STM 是可重新启动的,那么堆栈指针会简单地重置为它在 LDM/STM 开始时的值,然后重新执行指令;如果它们是可连续的,则堆栈指针不会被修改,而是会执行部分 STM/LDM 以完成指令。

    您没有具体提到如何实现上下文切换,但我假设您手动将 r4-r11 推送到进程堆栈,然后将 PSP 保存在某处并更新它以指向不同的新上下文堆栈,在弹出 r4-r11 并触发异常返回之前 - 这当然是通常的处理方式。

    【讨论】:

    • 我最初输入我的问题作为项目符号提供选项,从 0 开始。当它发布时,项目符号从 1 开始而不是 0 更改我提供的信息。所以事实上我的硬件是用选项 3 而不是选项 2 实现的。只是一个小的编辑,但我认为它显着改变了问题。因此,如果您可以更新答案,那就太好了。
    • 此外,我相信之前的 xPSR 作为异常进入过程的一部分被压入堆栈,并且更新的返回信息(ICI 字段)在当前用于返回的 xPSR 中可用-打断。就好像新的 xPSR 被推送到堆栈上一样,当我们实际从中断返回到先前的上下文时,我们将从哪里获得先前的 xPSR 是有意义的。您是否对异常进入行为有任何参考,其中新的 xPSR 被推送到堆栈上。?
    • 答案已更新。文档对ICI/IT位的更新时间不是很清楚,但一定是在异常入口堆栈之前。如果不是,则 ISR 必须在使用 LDM/STM 之前堆栈 EPSR,以避免由于嵌套中断而导致损坏,而它没有。说到异常返回,请记住很多东西(包括 PC!)都是从堆栈中获取的。没有理由 EPSR 不应该以同样的方式工作。
    猜你喜欢
    • 2020-01-13
    • 2021-01-13
    • 2020-04-25
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多