【发布时间】:2021-11-29 10:46:11
【问题描述】:
我正在尝试确定以下简单延迟循环的时钟周期的确切持续时间:
loop: subs r2, r2, 1
bne loop
Cortex-M4 Technical Reference Manual 表示:1 + P,其中 P 是:
管道重新填充所需的周期数。这个范围从 1 到 3,取决于目标指令的对齐方式和宽度,以及处理器是否设法提前推测地址。
ARM9(5 级流水线)在这种情况下对于 bne 有 3 个周期,对于 subs 有 1 个周期。 Cortex-M4 有一个 3 阶段的流水线,但看起来非常相似,因为前两个阶段是相同的......
所以我的问题是:根据参考手册,它可以是 2 到 4 个周期,对吗?什么时候是2,什么时候是3,什么时候是4?在 3 级流水线中,至少有 3 个周期是合乎逻辑的,但似乎只有 2 个周期是可能的。是否涉及某种分支预测?
【问题讨论】:
-
这不是确定性的。它可以是可重复的,但是如果您更改代码的对齐方式和其他因素,相同的循环、相同的机器代码将需要不同数量的系统时钟来执行。一些实现在闪存和 CPU 之间有一个缓存,您无法关闭。
-
你到底想做什么?如果是延迟循环,请使用计时器。您将很难将这样的循环用于固定延迟,您可以使用大于或等于类型的延迟,这非常好。
-
您使用的是 thumb2 扩展程序还是原始拇指指令?您的处理器是一次取一个字还是一次取一个半字(某些内核具有该选项,这取决于芯片供应商)。你的内存或闪存用完了吗?
-
笔芯将受芯片(而不是内核)的约束,因此是特定于实现的。我经常使用这个循环来展示同一系统内的广泛性能差异。你现在应该已经看到了吧?
-
也许我应该改写我的问题 - 根据 refman 它可以是 2 到 4 个周期 - 对吧?什么时候是2,什么时候是3,什么时候是4?在三阶段管道中,至少有 3 个周期是合乎逻辑的,但似乎只有 2 个周期 - 是否涉及某种分支预测?