处理器指令周期执行时间

时间:2013-08-13 23:28:34

标签: execution-time stm32 cortex-m machine-instruction nop

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

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

  • 某些处理器每个指令周期需要多次振荡,有些处理器在将时钟周期与指令周期进行比较时为1比1。

  • 术语“指令周期”甚至不存在于STMicro提供的整个数据表中,也不存在于编程手册中(列出处理器的指令集,顺便说一下)。但是,8051文档明确定义了其指令周期执行时间,以及机器周期特性。

4 个答案:

答案 0 :(得分:3)

所有指令都需要多个时钟周期才能执行。获取,解码,执行。如果你在stm32上运行,你可能会因为舞会的速度慢而每次获取几个时钟,如果从知道它是168Mhz还是更慢的ram运行的话。臂总线通常需要多个时钟周期来做任何事情。

没有人再谈论指令周期了,因为它们不是确定性的。答案总是“取决于”。

建造一辆汽车可能需要X个小时,但是如果你开始制造一辆汽车,那么30秒后开始建造另一辆车,每30秒开始另一辆汽车,然后在X小时后你将每隔30秒开一辆新车。这是否意味着制作汽车需要30秒?当然不是。但这确实意味着一旦启动并运行,您可以在该生产线上每30秒平均一辆新车。

这正是处理器的工作原理,每条指令运行需要多个时钟,但是您可以使用管道主题,以便许多人同时进入管道中,以便平均值如此核心,如果输入正确的指令一个每个时钟,每个时钟可以完成一个指令。有了分支和慢速内存/ rom,你甚至不能期望得到它。

如果你想在你的处理器上做一个实验,那就做一个几百次的循环

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

重复实验

将处理器时钟降低到不需要闪存除数的最快时间,重复从闪存运行。

作为皮质-m4打开I缓存,重复使用闪光灯,重复使用ram(在168Mhz)。

如果您没有使用相同的测试循环从所有这些实验中获得一系列不同的结果,那么您可能做错了。

答案 1 :(得分:3)

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

为了参考一个指令需要多少个周期或SYSCLK,您使用的是ARM® Cortex®‑M4 Processor Technical Reference Manual。例如,大多数情况下的MOV指令需要一个周期。在大多数情况下,ADD指令需要一个周期,这意味着在12 ns之后,您将添加的结果存储在寄存器中,并准备好供另一个操作使用。

您可以在许多情况下使用该信息来安排处理器资源,例如定期中断,以及电气和低级嵌入式系统软件开发人员正在谈论这些并且在严格实际的情况下这样做时间和安全关键系统。通常,工程师在设计过程中处理最坏情况下的执行时间,忽略管道,以便在处理器负载内部快速粗糙。在实施过程中,您使用工具进行精确时间分析并优化软件。

在设计和实施过程中,非确定性事物减少到可以忽略不计。

答案 2 :(得分:3)

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

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

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

在8051(orig)上它的1个指令/ 12个时钟,所以12Mhz 8051以大约1个mips运行

要了解您可以完成多少工作,说明/时钟是相关的。这就是为什么AMD处理器可以比英特尔处理器更多地完成/ Mhz。

答案 3 :(得分:1)

由于流水线会影响感知的执行时间,因此一条指令的测量结果将不同于同一条指令的序列。

您可以使用内置的周期计数寄存器来衡量您关心的方案的时间安排,如您在其他帖子here中所讨论的。

类似地,您可以尝试使用and reg, reg而不是nop,因为使用nop指令可能会导致Cortex F4的行为不符合您的预期。