0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

时钟周期、机器周期、指令周期

修罗 2025-08-26 607 5条评论 stm32

首页 / 正文

时钟周期、机器周期、指令周期

1.1 时钟周期

时钟信号是一个方波,它在高电平和低电平之间周期性切换。通常,寄存器、计数器等元件在时钟的上升沿采样数据或执行操作。

  • 周期:完成一个完整循环所需的时间。这个循环可以是 从上升沿到下一个上升沿,或者 从下降沿到下一个下降沿。周期用符号 T 表示。
  • 频率每秒内完成的周期数。频率用符号 f 表示。频率和周期是互为倒数关系:f = 1 / TT=1 / f

image-20250826143918644.png

一个具体的例子

假设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个时钟周期,如果缓存命中)。
  2. 译码:解码这条指令(1个时钟周期)。
  3. 执行:在ALU中执行计算(1个时钟周期)。
  4. 写回:将结果存回寄存器(1个时钟周期)。

那么这条指令的指令周期就是 4个时钟周期

而对于一条更复杂的指令,其中“执行”阶段本身就需要3个时钟周期(比如除法),那么它的指令周期可能就是 6个时钟周期

打个比方(工厂流水线)

  • 时钟周期:像工厂里 传送带的齿轮每转一下
  • 机器周期:工人完成 一次最小动作(比如抓一个零件)的时间,可能需要齿轮转几下。
  • 指令周期:工人从头到尾 组装好一个产品 的时间,需要做很多次最小动作。

评论(5)

  1. 1 游客 2025-09-01 11:26 回复

    1

  2. 1 游客 2025-09-01 12:00 回复

    1

  3. 1 游客 2025-09-01 12:01 回复

    1

  4. 1 游客 2025-09-01 12:02 回复

    1

  5. 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"*/


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis