【问题标题】:ISB instruction in ARM Cortex MARM Cortex M 中的 ISB 指令
【发布时间】:2017-06-07 00:21:57
【问题描述】:

到目前为止,我使用 3 个 NOP 来“清理”管道。 最近我遇到了为我做这件事的 ISB 指令。 查看 arm 信息中心,我注意到这个命令需要 4 个周期(在 Cortex M0 下),而 3 个 NOP 只需要 3 个。

我为什么要使用这个命令?它与 3 NOP 有什么不同?

【问题讨论】:

  • 也许是为了优化尺寸?我不相信它对 Cortex M0 有任何真正的影响,单个nop 可能足以作为中断屏障。与处理器系列的其他成员的点兼容性,不需要依赖微妙的架构细节,当判断错误时可能会产生特别微妙的错误。我猜如果以前的外围存储需要额外的周期来传播和发出中断,那么额外的周期可能会很有用。
  • 你无法预测未来内核的样子,3 nop 可能在今天的一个/一些内核上工作,但可能并非总是如此。执行此功能的指令在哪里,只要该指令得到支持,这是明智的解决方案。
  • 我不需要预测。我知道它现在是如何工作的,这一切都很重要。经过一番研究,我发现没有人真正知道答案。我想我会保留 3 个 NOP 并保存一个周期。
  • @old_timer 我通常会删除 cortex-m3 标签,因为大多数 Q/A 并非仅针对 M3,而是适用于 M3/M4 和其他 cortex-M 内核。但是,我看到您添加了很多,我不想与您“战斗”。请参阅:ARM tag merging,优秀的元人以跑题而关闭。每个问题都应该有这两个标签吗?
  • 我尝试制作单独的标签,但有人希望将其全部归入 cortex-m3 标签,所以我只是在关注。

标签: assembly arm cortex-m memory-barriers instructions


【解决方案1】:

这是 NOP (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/CHDJJGFB.html) 的问题:

操作

NOP 不执行任何操作,并且不保证耗时。 处理器可能会在它到达 执行阶段。

使用 NOP 进行填充,例如放置后续指令 在 64 位边界上。

相同的信息在其他 ARM Cortex 设备的文档中,因此将该指令用于 任何 目的而不是填充根本不可靠。唯一的保证是这条指令将占用 2 (nop) 或 4 字节 (nop.w) 并且它不会执行任何操作 - 仅此而已。

【讨论】:

    【解决方案2】:

    您应该使用 ISB 指令来确保管道畅通。正如上述 cmets 所述,不同 ARM 处理器之间的管道可能不同(例如,M7 有 6 级管道,而 M3/4 有 3 级)。根据 M4 技术参考手册“对于 ISB,最少循环次数等于管道重新填充所需的次数。”。

    我不确定为什么这是 4 个周期而不是 3 个周期,这可能与确保分支预测逻辑正确有关。无论您是否希望您的代码可移植,我都建议您使用 ARM 为这项工作提供的功能,如果他们认为您需要 4 个周期,那么我希望您这样做。如果只有 3 个,在某些情况下可能会出现错误操作。

    【讨论】:

      【解决方案3】:

      ISB指令是4个周期的原因很简单。 Cortex-M 指令集是 16 位和 32 位指令的混合。 Cortex-M 设计(例如 Cortex-M0)支持六种 32 位指令:BL、MSR、MRS、ISB、DMB、DSB。

      所有这六条指令都可以在 16 位指令中混合使用。

      问题是处理器如何知道哪条指令是 16 位的,哪一条是 32 位的?为了回答这个问题,处理器读取前 16 位并对其进行解码(1 个周期)。如果操作码与 32 位指令匹配,则它知道下一个 16 位指令实际上是 32 位指令的后半部分并尝试执行它(3 个周期)。

      这使得 Cortex-M 内核中的所有 32 位指令为 1+3 个周期 = 4 个周期。

      如果您确定核心实现,可以使用 3 个 NOP 来刷新管道。您必须确保核心没有分支预测和删除连续 NOP 的动态指令优化。如果您确定没有此功能,请使用 3 个 NOP 指令,您将节省 1 个周期。但是如果你不使用并且你还希望你的 ARM 代码可以移植到其他架构,如 ARMv7 等。那么你必须使用 ISB 指令,这是一条 32 位指令,需要 4 个周期。

      【讨论】:

        【解决方案4】:

        不保证 3 个 NOP 会消耗 3 个周期。在某些情况下,它们在 Cortex-M3 上会消耗 2 个周期 - 在这些情况下,您可能需要使用 3 个以上的 NOP 才能获得所需的效果。

        “有趣”的场景很可能不会出现在通用代码中,或者还需要其他事件的特定时间 - 所以您可能不太可能观察到它们。关键是没有保证,而且这种故障的可观察性通常很低。

        即使您在某处仅错误地使用了 2 个 NOP,您的代码也可能大部分时间都在工作 - 直到其他地方的更改可能会影响对齐并暴露失败。

        【讨论】:

          猜你喜欢
          • 2019-11-13
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 2015-03-10
          • 2015-04-20
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          相关资源
          最近更新 更多