时钟周期、机器周期、指令周期
1.1 时钟周期
时钟信号是一个方波,它在高电平和低电平之间周期性切换。通常,寄存器、计数器等元件在时钟的上升沿采样数据或执行操作。
- 周期:完成一个完整循环所需的时间。这个循环可以是 从上升沿到下一个上升沿,或者 从下降沿到下一个下降沿。周期用符号 T 表示。
- 频率:每秒内完成的周期数。频率用符号 f 表示。频率和周期是互为倒数关系:f = 1 / T,T=1 / f。
一个具体的例子
假设STM32使用外部8MHz的晶振(HSE),并通过PLL倍频到168MHz作为系统时钟(SYSCLK)。
- 时钟源频率:8 MHz
- 时钟源周期:T = 1/8μs = 125 ns
- 系统时钟频率:168 MHz
- 系统时钟周期:T_sys = 1/168 μs ≈ 5.95 ns
这个 5.95 ns 就是一个时钟周期的长度。CPU会在每一个 5.95 ns 的上升沿(或下降沿,但通常是上升沿)到来时,推动内部逻辑向前执行一步。
1.2 机器周期
CPU完成 一次基本操作 所需要的时间,由若干个时钟周期组成
- 背景:这个概念在早期的简单单片机(如8051)中非常明确和重要。8051的一个机器周期固定地包含12个时钟周期。
- 现代ARM架构(如STM32)的演变:在基于ARM Cortex-M内核的STM32中,“机器周期”这个概念被大大弱化了,甚至可以说不再直接使用。因为其架构采用了流水线和哈佛总线结构,不同指令的执行阶段所需的时钟周期数差异很大,很难定义一个统一的“机器周期”。
- 可以这样理解:在STM32中,你可以把一次总线访问(例如,从内存读取一个32位的数据到寄存器)近似地看作一个“基本操作”,但这个操作所花费的时钟周期数也不是固定的(因为它可能受到缓存是否命中、总线仲裁等因素影响)。
简单来说,对于STM32:传统的“机器周期”概念已经融合到了“指令周期”中,不再是一个固定值。
1.3 指令周期
- 定义:CPU取出一条指令并完全执行它所需的时间。
- 组成:一个指令周期由1个到多个机器周期(在STM32中,更准确地说是“执行阶段”)组成。而每个机器阶段又由1个到多个时钟周期组成。
可变性:这是最关键的一点。不同指令的指令周期长度可以相差巨大。
- 简单指令:比如一个
Thumb
指令集的16位加法指令ADD R1, R2
,可能在1个时钟周期内就完成。 - 复杂指令:比如一个32位的乘法指令
MUL R0, R1, R2
,可能需要多个时钟周期才能完成。 - 访存指令:比如从外部Flash读取数据的指令,由于要等待总线响应和内存的速度,可能需要几十甚至上百个时钟周期。
- 简单指令:比如一个
三者关系总结与类比
周期类型 | 定义 | 关系 | 在STM32 (Cortex-M) 中的特点 |
---|---|---|---|
时钟周期 | 最基本的计时单位,由主频决定 | 最小单位 | 固定,由SYSCLK频率决定。例如5.95ns @168MHz。 |
机器周期 | 完成一个基本操作(如取指、访存)的时间 | 1个机器周期 = n个时钟周期 | 概念已淡化,不同操作所需时钟周期数不同且不固定。 |
指令周期 | 取出并执行一条完整指令的时间 | 1个指令周期 = 1~n个基本操作 = m个时钟周期 | 变化很大,取决于指令本身和访问的存储器速度。 |
一个简单的例子(假设性)
假设一条指令需要执行以下步骤,且每个步骤需要1个时钟周期:
- 取指:从内存取出指令(1个时钟周期,如果缓存命中)。
- 译码:解码这条指令(1个时钟周期)。
- 执行:在ALU中执行计算(1个时钟周期)。
- 写回:将结果存回寄存器(1个时钟周期)。
那么这条指令的指令周期就是 4个时钟周期。
而对于一条更复杂的指令,其中“执行”阶段本身就需要3个时钟周期(比如除法),那么它的指令周期可能就是 6个时钟周期。
打个比方(工厂流水线)
- 时钟周期:像工厂里 传送带的齿轮每转一下。
- 机器周期:工人完成 一次最小动作(比如抓一个零件)的时间,可能需要齿轮转几下。
- 指令周期:工人从头到尾 组装好一个产品 的时间,需要做很多次最小动作。
1 游客 2025-09-01 11:26 回复
1
1 游客 2025-09-01 12:00 回复
1
1 游客 2025-09-01 12:01 回复
1
1 游客 2025-09-01 12:02 回复
1
1 游客 2025-09-01 12:03 回复
if(now()=sysdate(),sleep(3),0)/*'XOR(if(now()=sysdate(),sleep(3),0))OR'"XOR(if(now()=sysdate(),sleep(3),0))OR"*/