Cortex-M3整体风景
文章目录
Cortex-M3 处理器流水线
Cortex-M3 处理器使用一个 3 级流水线(Pipeline)来提高指令执行的效率。流水线的 3 级分别是:取指(Fetch)、解码(Decode)和执行(Execute)。这三个阶段可以同时进行,从而实现指令的并行处理。
名词解释
取指(Fetch)
- 功能:从内存中读取指令。
- 操作:处理器从程序计数器(PC)指向的内存地址读取指令。
- 输出:将读取的指令传递给下一级流水线。
解码(Decode)
- 功能:解析指令并准备执行。
- 操作:处理器解析从取指阶段传递过来的指令,确定指令的操作码(Opcode)和操作数(Operands)。
- 输出:将解析后的指令和操作数传递给下一级流水线。
执行(Execute)
- 功能:执行指令。
- 操作:处理器根据解码阶段传递过来的指令和操作数,执行相应的操作。这可能涉及算术运算、逻辑运算、数据传输等。
- 输出:执行结果(如果有)被写回到寄存器或内存中。
流水线的并行处理
在理想情况下,Cortex-M3 处理器的流水线可以同时处理多条指令的不同阶段。具体来说:
- 取指阶段:
- 处理器从内存中读取第一条指令。
- 同时,处理器可以开始读取第二条指令。
- 解码阶段:
- 处理器解析第一条指令。
- 同时,处理器可以开始解析第二条指令。
- 执行阶段:
- 处理器执行第一条指令。
- 同时,处理器可以开始执行第二条指令
流水线的优势
流水线技术通过将指令执行过程划分为多个阶段,并使这些阶段并行工作,从而提高了处理器的吞吐量。具体优势包括:
- 提高效率:通过并行处理不同指令的不同阶段,减少了每个指令的平均执行时间。
- 减少等待时间:在执行当前指令的同时,可以预取和解码下一条指令,减少了指令执行的等待时间。
- 提高吞吐量:流水线允许在同一时间处理多条指令的不同阶段,从而提高了处理器的整体性能。
流水线的挑战
尽管流水线技术提高了处理器的效率,但也带来了一些挑战:
- 数据依赖:如果当前指令的执行依赖于前一条指令的结果,可能会导致流水线停顿(Pipeline Stall)。
- 控制依赖:分支指令(如
B
、BL
)会导致流水线冲刷(Pipeline Flush),因为需要重新计算 PC 并重新取指。 - 资源冲突:多个指令同时需要访问相同的资源(如寄存器或内存)时,可能会导致资源冲突。
流水线的细节
取指阶段的优化
Cortex-M3 处理器在取指阶段进行了优化,特别是在处理 16 位指令时。处理器有时可以一次取两条指令(32 位),因此在第一条指令取来时,也顺带着把第二条指令取来了。这样可以减少总线接口的访问频率,提高取指效率。
跳转指令的处理
当执行到跳转指令时,需要清洗流水线,处理器会不得不从跳转目的地重新取指。为了改善这种情况,Cortex-M3 支持一定数量的 v7M 新指令,可以避免很多短程跳转。
在处理器内核的预取单元中有一个指令缓冲区,它允许后续的指令在执行前先在里面排队。这可以在执行未对齐的 32 位指令时,避免流水线“断流”。不过该缓冲区并不会在流水线中添加额外的级数,因此不会恶化跳转导致的性能下降(penalty)。
示例
假设有一段简单的指令序列:
ADD R0, R1, R2 ; R0 = R1 + R2
SUB R3, R4, R5 ; R3 = R4 - R5
在流水线中的执行过程如下:
- 取指阶段:
- 读取
ADD R0, R1, R2
指令。
- 读取
- 解码阶段:
- 解析
ADD R0, R1, R2
指令,确定操作码和操作数。
- 解析
- 执行阶段:
- 执行
ADD R0, R1, R2
指令,计算R0 = R1 + R2
。
- 执行
- 取指阶段:
- 读取
SUB R3, R4, R5
指令。
- 读取
- 解码阶段:
- 解析
SUB R3, R4, R5
指令,确定操作码和操作数。
- 解析
- 执行阶段:
- 执行
SUB R3, R4, R5
指令,计算R3 = R4 - R5
。
- 执行
详细的框图
Cortex-M3 处理器子系统组件
缩写 | 全称 | 功能 | 特点 |
---|---|---|---|
NVIC | 嵌套向量中断控制器 | 管理中断和异常 | 支持中断嵌套,采用向量中断机制,自动取出中断服务例程入口地址,缩短中断延时 |
SysTick Timer | 系统滴答定时器 | 提供周期性中断,用于操作系统时基 | 即使在睡眠模式下也能工作,简化操作系统移植 |
MPU | 存储器保护单元 | 将存储器分成多个区域,并分别予以保护 | 可选组件,支持用户级只读区域,防止用户程序破坏关键数据 |
CM3BusMatrix | 内部的 AHB 互连 | 数据在不同总线之间并行传送 | 提供写缓冲和位带操作逻辑 |
AHB to APB | AHB 到 APB 的总线桥 | 连接 APB 设备到 CM3 处理器的私有外设总线 | 允许芯片厂商添加附加的 APB 设备 |
SW-DP/SWJ-DP | 串行线/串行线 JTAG 调试端口 | 通过串行线调试协议或 JTAG 协议连接调试接口 | 支持 both 串行线协议和 JTAG 协议 |
AHB-AP | AHB 访问端口 | 提供对全部 CM3 存储器的访问机能 | 通过 SW-DP/SWJ-DP 控制,产生所需的 AHB 数据传送 |
ETM | 嵌入式跟踪宏单元 | 实现实时指令跟踪 | 可选组件,控制寄存器映射到主地址空间 |
DWT | 数据观察点及跟踪单元 | 设置数据观察点,匹配命中事件 | 产生观察点事件,激活调试器或联动 ETM |
ITM | 指令跟踪宏单元 | 多种用法,如 printf 风格的调试 | 软件控制,消息送给 TPIU,数据跟踪包输出 |
TPIU | 跟踪端口的接口单元 | 与外部跟踪硬件交互 | 格式化跟踪信息,供外部设备捕捉 |
FPB | Flash 地址重载及断点单元 | 提供 flash 地址重载和断点功能 | 匹配地址重映射到 SRAM,触发断点事件 |
ROM 表 | 查找表 | 提供存储器映射信息 | 定位调试组件,检测可用调试组件类型 |
Cortex-M3 的总线接口
Cortex-M3 处理器的总线接口基于 AHB-Lite 和 APB 协议,提供了高效的数据传输和访问机制。以下是各总线接口的详细介绍:
I-Code 总线
- 功能:负责在 0x0000_0000 – 0x1FFF_FFFF 之间的取指操作。
- 特点:基于 AHB-Lite 总线协议的 32 位总线,取指以字的长度执行,即使是 16 位指令也如此。
- 应用:CPU 内核可以一次取出两条 16 位 Thumb 指令。
D-Code 总线
- 功能:负责在 0x0000_0000 – 0x1FFF_FFFF 之间的数据访问操作。
- 特点:基于 AHB-Lite 总线协议的 32 位总线,支持非对齐访问,但总线接口会将非对齐的数据传送转换成对齐的数据传送。
- 应用:连接到 D-Code 总线上的任何设备只需支持 AHB-Lite 的对齐访问。
系统总线
- 功能:负责在 0x2000_0000 – 0xDFFF_FFFF 和 0xE010_0000 – 0xFFFF_FFFF 之间的所有数据传送,包括取指和数据访问。
- 特点:基于 AHB-Lite 总线协议的 32 位总线,所有的数据传送都是对齐的。
- 应用:处理系统范围内的数据传输。
4. 外部私有外设总线(PPB)
- 功能:负责 0xE004_0000 – 0xE00F_FFFF 之间的私有外设访问。
- 特点:基于 APB 总线协议的 32 位总线,支持 CoreSight 设备,包含 PADDR31 信号用于区分传送来源。
- 应用:连接非共享的系统设备,如调试组件。
调试访问端口总线
- 功能:专用于挂接调试接口,如 SWJ-DP 和 SW-DP。
- 特点:基于“增强型 APB 规格”的 32 位总线。
- 应用:支持调试功能,不应用于普通外设。
Cortex-M3 的其它接口
除了总线接口,Cortex-M3 还有多个用于其它目的的接口,这些接口的信号通常不引出到引脚上,而是用于连接 SoC 的不同部分或用于调试。以下是一些主要接口的简短小结:
信号组 | 功能 |
---|---|
多处理机通信(TXEV, RXEV) | 多处理机之间的简单任务同步信号 |
休眠信号(SLEEPING, SLEEPDEEP) | 电源管理所用的休眠状态 |
中断状态信号(ETMINTNUM, ETMINTSTATE, CURRPRI) | 中断操作的状态,用于 ETM 操作和调试 |
复位请求(SYSRESETREQ) | 来自 NVIC 的复位请求输出 |
锁定和停机状态(LOCKUP, HALTED) | 指示处理器进入了锁定状态或被喊停 |
端模式输入(ENDIAN) | 在内核复位时设置端模式 |
ETM 接口 | 连接到嵌入式跟踪宏单元(用于指令跟踪) |
ITM 的 ATB 接口 | 高级跟踪总线(ATB)接口,用于跟踪数据的传送 |
典型的连接方式
典型连接实例
图 6.4 展示了一个典型的 Cortex-M3 总线连接范例:
- 总线矩阵:用于将 I-Code 和 D-Code 总线与存储器和外设连接。总线矩阵允许在同一时刻访问不同的存储器设备,如从 Flash 中取指的同时从 SRAM 中访问数据。
- AHB 总线复用器:如果只使用总线复用器,则数据传送不能同时发生,但电路尺寸能做得更小。
- 系统总线:连接主 SRAM 和其它 AHB 设备。主 SRAM 应使用系统总线连接,以利用 CM3 的位带操作能力。
- 外部存储器控制器:如果单片机带有外部总线接口(EMI),则需要一个外部存储器控制器连接到系统总线上。
连接细节
- 总线矩阵:
- 允许 I-Code 和 D-Code 总线在同一时刻访问不同的存储器设备。
- 提高性能,避免数据访问和取指操作的冲突。
- AHB 总线复用器:
- 简化电路设计,但限制了数据传送的并行性。
- 系统总线:
- 连接主 SRAM 和其它 AHB 设备。
- 主 SRAM 应使用系统总线连接,以利用 CM3 的位带操作能力。
- 外部存储器控制器:
- 连接到系统总线上,管理外部存储器的访问。
Cortex-M3 复位信号
Cortex-M3 处理器对复位电路有特定的要求,具体内容在《Cortex-M3 Technical Reference Manual》中给出。以下是 Cortex-M3 中的各种复位信号及其描述:
复位信号 | 描述 | 作用 |
---|---|---|
上电复位(nPORESET) | 在器件上电时需要把复位置为有效(assert),把处理器核心和调试系统一起复位 | 确保处理器和调试系统在上电时处于已知状态 |
系统复位(nSYSRESET) | 只影响处理器核心、NVIC(与调试相关的除外)以及 MPU,不复位调试系统 | 复位处理器核心和部分系统组件,保持调试系统不受影响 |
测试复位(nTRST) | 只复位调试系统 | 用于调试目的,复位调试系统而不影响处理器核心和其它系统组件 |