这一个部分主要是对Cortex-M3的大致了解,包括我个人的理解。
流水线
在 Cortex-M3 处理器中,使用了3 级流水线来提高处理器的执行效率。
Cortex-M3 的流水线由三个主要阶段组成:取指(Fetch)、解码(Decode) 和 执行(Execute)。
取址 :
- 取指阶段是处理器从内存或指令缓存中读取当前要执行的指令,并将其送入流水线。
- 工作原理:处理器通过程序计数器(PC)来指示当前要执行的指令的地址。
- 取指阶段的输出是指令本身,它被传递到流水线的下一个阶段——解码阶段。
解码:
- 解码阶段是处理器会对从内存中取回的指令进行解释,确定该指令的类型和操作数。
- 工作原理:指令是以二进制形式存储的,在解码阶段,处理器需要解析指令,确定这条指令对应的操作是什么(例如,是否是加法、减法、加载/存储等)。同时,处理器还会确定指令的操作数位置,即指令需要操作哪些寄存器或内存地址。
- 解码阶段的输出是执行阶段所需的信息,包括指令类型、操作数位置和操作类型。
执行:
- 执行阶段是处理器实际执行解码阶段指定的操作,对操作数进行计算或数据处理。
- 执行阶段将解码得到的操作数和操作类型传递给处理器的执行单元,并执行指令指定的操作。
- 执行阶段的输出是指令的执行结果。
流水线的工作模式是,
- 在时钟周期 1:指令 1 处于取指阶段。
- 在时钟周期 2:指令 1 进入解码阶段,指令 2 进入取指阶段。
- 在时钟周期 3:指令 1 进入执行阶段,指令 2 进入解码阶段,指令 3 进入取指阶段。
Cortex-M3处理器总线接口起的作用,
- I-Code 总线用于取指阶段,从内存中快速获取指令。
- D-Code 总线用于加载和存储指令的数据传输,与内存进行数据交互。
- 系统总线用于访问外设和系统资源,实现对外设寄存器的读写。
在 Cortex-M3 中,由于流水线的存在,读取 PC 时返回的并不是当前正在执行的指令的实际地址,而是当前指令地址 + 4 的值。这是由于指令的预取机制造成的。
预取单元(Prefetch Unit) 是处理器中的一个模块,用来提前取回即将执行的指令。它负责将指令从存储器中取出,并放入一个称为指令缓冲区(Instruction Buffer)的地方,以便处理器的执行单元随时可以从缓冲区中取指,避免等待。
既然每一次读取的是PC+4的值,那么处理器如何知道要执行当前的指令?
-
当指令正在执行时,PC 已经指向了下一条即将执行的指令地址,这样可以提前为下一条指令做好准备,但不会影响当前指令的执行。
-
虽然 PC 的值是 PC + 4,但处理器内部已经保存了当前指令的上下文和地址,因此可以在流水线的执行阶段执行正确的指令。
处理器框图
CM3的处理器整体框图如下,
备注:虚线框住的 MPU 和 ETM 是可选组件,不一定会包含在每一个 CM3 的 MCU 中。
这里知识了解一下CM3的整体架构,上述的简略介绍如下,
总线接口
- I-Code总线:I-Code 总线是一条基于 AHB-Lite 总线协议的 32 位总线,负责取指操作。取指以字的长度执行,即使是对于 16 位指令也如此。因此 CPU 内核可以一次取出 两条 16 位 Thumb 指令。
- D-Code总线:D-Code 总线也是一条基于 AHB-Lite 总线协议的 32 位总线,负责数据访问操作。尽管 CM3 支持非对齐访问,但你绝不会在该总线上看到任何非对齐的地址, 这是因为处理器的总线接口会把非对齐的数据传送都转换成对齐的数据传送。
- 系统总线:系统总线也是一条基于 AHB-Lite 总线协议的 32 位总线,负责数据传送,取指和数据访问都算上。和 D-Code 总线一样,所有的数据传送都是对齐的。
- 外部私有外设总线:这是一条基于 APB 总线协议的 32 位总线。此总线来负责私有外设访问。
- 调试访问端总线:调试访问端口总线接口是一条基于“增强型 APB 规格”的 32 位总线,它专用于挂接调试接口, 例如 SWJ-DP 和 SW-DP。
样板连接
以下是CM3架构的样板连接图,
由上图可知,STM32 采用了一种总线矩阵架构,允许处理器和外设高效地访问内存和外部设备。STM32 的总线分为几个主要类别,其中最重要的两个是:
- AHB 总线(Advanced High-performance Bus):用于连接高性能外设和存储器。
- APB 总线(Advanced Peripheral Bus):用于连接低速外设。