所有指令都需要一个以上的时钟周期才能执行。获取、解码、执行。如果您在 stm32 上运行,则由于 prom 的缓慢,每次读取可能会花费几个时钟,如果从 ram 运行,谁知道它是 168Mhz 还是更慢。 Arm 总线通常需要多个时钟周期才能完成任何操作。
没有人再谈论指令周期,因为它们不是确定性的。答案总是“视情况而定”。
建造一辆汽车可能需要 X 小时,但如果你开始建造一辆汽车,然后 30 秒后开始建造另一辆汽车,每 30 秒开始建造另一辆汽车,那么 X 小时后,你将每 30 秒拥有一辆新车。这是否意味着制造一辆车需要30秒?当然不是。但这确实意味着一旦启动并运行,您就可以在该生产线上平均每 30 秒生产一辆新车。
这正是处理器的工作方式,每条指令需要多个时钟才能运行,但是您将它们管道化,以便同时在管道中运行许多时钟,这样平均下来,如果每个时钟向核心提供正确的指令,每个时钟可以完成一个指令。对于分支和缓慢的内存/ROM,您甚至不能指望得到它。
如果你想在你的处理器上做一个实验,那么用几百个 nop 做一个循环
beg = read time
load r0 = 100000
top:
nop
nop
nop
nop
nop
nop
...
nop
nop
nop
r0 = r0 - 1
bne top
end = read timer
如果完成该循环需要几分之一秒的时间,那么要么增加 nop 的数量,要么让它运行更多数量级的循环。实际上,您希望达到大量的计时器滴答声,不一定是挂钟上的秒或分钟,而是大量的计时器滴答声。
然后进行数学计算并计算平均值。
使用位于 ram 而不是 rom 中的程序重复实验
将处理器时钟减慢至不需要闪存除数的最快时间,从闪存重复运行。
作为 cortex-m4,打开 I 缓存,使用闪存重复,使用 ram 重复(168Mhz)。
如果您没有使用相同的测试循环从所有这些实验中获得一系列不同的结果,那么您可能做错了什么。