ARM Cortex M中的ISB指令

时间:2017-01-22 11:25:44

标签: arm instructions cortex-m

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

为什么要使用此命令?有什么不同于3个NOP?

4 个答案:

答案 0 :(得分:2)

ISB指令为4个周期的原因非常简单。 Cortex-M指令集是16位和32位指令的混合。 Cortex-M设计(例如Cortex-M0)支持6种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个周期。

答案 1 :(得分:1)

您应该使用ISB指令来确保管道清晰。正如上面的评论所述,不同ARM处理器之间的流水线可能不同(例如,M7有一个6级pipleline而不是3级用于M3 / 4)。根据M4技术参考手册“对于ISB,最小循环次数相当于管道补充所需的次数。”。

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

答案 2 :(得分: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)并且它将不执行任何操作 - 仅此而已。

答案 3 :(得分:0)

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

“有趣”场景可能不会出现在常见代码中,或者还需要其他事件的特定时间 - 因此您可能不太可能观察它们。关键点在于没有保证,这种失败的可观察性往往很低。

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