6
  • 我的猜测是,__no_operation()内在(ARM)指令应该花费 1/(168 MHz)来执行,前提是每个NOP指令都在一个时钟周期内执行,我想通过文档进行验证。

  • 是否有关于处理器指令周期执行时间的信息的标准位置?我正在尝试确定 STM32f407IGh6 处理器执行运行在 168 MHz 的 NOP 指令需要多长时间。

  • 有些处理器需要每个指令周期多次振荡,有些处理器在比较时钟周期和指令周期时是一对一的。

  • 术语“指令周期”甚至没有出现在 STMicro 提供的整个数据表中,也没有出现在他们的编程手册中(列出处理器的指令集,顺便说一句)。然而,8051 文档清楚地定义了它的指令周期执行时间,以及它的机器周期特性。

4

4 回答 4

6

ALL instructions require more than one clock cycle to execute. Fetch, decode, execute. If you are running on an stm32 you are likely taking several clocks per fetch just due to the slowness of the prom, if running from ram who knows if it is 168Mhz or slower. the arm busses generally take a number of clock cycles to do anything.

Nobody talks about instruction cycles anymore because they are not deterministic. The answer is always "it depends".

It may take X hours to build a single car, but if you start building a car then 30 seconds later start building another and every 30 seconds start another then after X hours you will have a new car every 30 seconds. Does that mean it takes 30 seconds to make a car? Of course not. But it does mean that once up and running you can average a new car every 30 seconds on that production line.

That is exactly how processors work, it takes a number of clocks per instruction to run, but you pipeline theme so that many are in the pipe at once so that the average is such that the core, if fed the right instructions one per clock, can complete those instructions one per clock. With branching, and slow memory/rom, you cant even expect to get that.

if you want to do an experiment on your processor, then make a loop with a few hundred nops

beg = read time
load r0 = 100000
top:
  nop
 nop
nop
nop
nop
nop
...
nop
nop
nop
r0 = r0 - 1
bne top
end = read timer

If it takes fractions of a second to complete that loop then either make the number of nops larger or have it run an order of magnitude more loops. Actually you want to hit a significant number of timer ticks, not necessarily seconds or minutes on a wall clock but something in terms of a good sized number of timer ticks.

Then do the math and compute the average.

Repeat the experiment with the program sitting in ram instead of rom

Slow the processor clock down to whatever the fastest time is that does not require a flash divisor, repeat running from flash.

being a cortex-m4 turn the I cache on, repeat using flash, repeat using ram (At 168Mhz).

If you didnt get a range of different results from all of these experiments using the same test loop, you are probably doing something wrong.

于 2013-08-14T21:37:12.450 回答
3

每条指令的时钟周期数很重要。

在 avr 上,它的(通常)1 条指令/时钟,因此 12Mhz AVR 以大约 12 mips 运行

在 PIC 上,它通常是 1 条指令/4 个时钟,因此 12Mhz PIC 以大约 3 mips 运行

在 8051(原始)上,它的 1 条指令/12 个时钟,因此 12Mhz 8051 以大约 1 mips 运行

要知道你能完成多少,说明/时钟是相关的。这就是为什么 AMD 处理器可以比 Intel 处理器完成更多/Mhz 的原因。

于 2016-09-20T04:44:05.360 回答
3

如果您在复位和时钟控制 (RCT) 中仔细配置所有时钟,并且您知道所有时钟,则您可以准确计算大多数指令的指令执行时间,并且至少对所有指令进行最坏情况评估。例如,我使用的是 stm32f439Zi 处理器,它是与 stm32f407 兼容的 cortex-m4。如果您查看参考手册,时钟树会显示 PLL 和所有总线预分频器。在我的例子中,我有一个 8 MHz 外部 quarts,其 PLL 配置为提供 84 Mhz 系统时钟 SYSCLK。这意味着一个处理器周期是 1.0/84e6 ~ 12 ns。

有关一条指令需要多少个周期或 SYSCLK 的参考信息,请使用ARM® Cortex®‑M4 处理器技术参考手册。例如,大多数情况下的 MOV 指令需要一个周期。在大多数情况下,ADD 指令需要一个周期,这意味着在 12 ns 之后,您将加法的结果存储在寄存器中并准备好供其他操作使用。

在许多情况下,您可以使用该信息来调度您的处理器资源,例如周期性中断,而电气和低级嵌入式系统软件开发人员正在谈论这一点,并且在严格的实时性和安全关键系统。通常,工程师在设计期间处理最坏情况下的执行时间,而忽略流水线以使处理器内部负载快速而粗糙。在实施过程中,您正在使用工具进行精确的时间分析和改进软件。

在设计和实现的过程中,非确定性的东西被减少到可以忽略不计。

于 2016-05-24T13:10:44.377 回答
1

由于流水线会影响感知的执行时间,因此单个指令的测量方式与同一指令的序列不同。

您可以使用内置的周期计数寄存器来测量您关心的场景的时间,正如您在此处的另一篇文章中所讨论的那样。

同样,您可以尝试使用and reg, reg而不是nop,因为 Cortex F4 可能不会按照您的预期运行,使用nop指令。

于 2019-10-29T17:09:41.567 回答