Cortex M7-TRM 翻译系列之Programmers Model(二)
2、程序员模型
2.1、操作和执行模型
2.1.1、操作模式
处理器支持两种模式,分别是线程模式(Thread mode)和处理器模式(Handler Mode)。
- 处理器在上电复位时,或是执行异常返回操作后进入线程模式。线程模式下既可运行特权级代码,也可运行非特权级代码。
- 处理器发生异常时进入处理器模式。处理器模式下运行的所有代码均处于特权级。
2.1.2、操作状态
处理器可以运行在两种操作状态下。
- Thumb 状态:正常执行状态,运行半字对齐的16位指令以及32位Thumb指令。
- Debug 状态:处理器因调试需求而停机时所处的状态。
2.1.3、特权访问和非特权用户访问
代码可运行于特权级或非特权级。非特权运行模式会限制或禁止对部分资源的访问;特权运行模式能够访问全部资源。处理器模式始终为特权级,线程模式既可以配置为特权级,也可以配置为非特权级。
2.2、指令集总结
2.2.1、与其他Cortex处理器的二进制兼容
在进行软件迁移(向下迁移)时需要注意以下几点,禁止迁移至如下内核中:
- Cortex‑M3 处理器:如果程序包含浮点运算,或是属于 DSP 扩展的指令(例如 SADD16);
- Cortex‑M4 处理器:如果程序包含双精度浮点运算;
- Cortex‑M0、Cortex‑M0 + 处理器:这类内核基于 ARMv6‑M 架构实现。
如果其他处理器拟向上迁移至M7内核,须注意一下几点:Arm 建议面向 Cortex‑M0、M0+、M3、M4 开发的代码遵守下述规则,并合理配置配置与控制寄存器(CCR):
- 仅使用字访问方式读写 NVIC 以及系统控制空间(SCS)内的寄存器,因为M7只支持字访问;
- 处理器上所有未使用的 SCS 寄存器与寄存器位域,均视作禁止修改;
- 在 CCR 寄存器中配置如下位域:
- STKALIGN 位置 1;
- UNALIGN_TRP 位置 1;
- CCR 寄存器其余所有位保持复位初始值不变。
2.3、系统地址划分
处理器包含一个内部总线矩阵,这个总线矩阵会对处理器内核访问与外部AHBD的访问进行仲裁,访问的范围包括外部存储系统,内部系统控制空间(SCS)以及调试组件。访问优先级始终赋予处理器内核,以此确保各类调试访问尽可能不干扰程序的正常运行。
下表展示了不同存储器映射区域所对应的处理器接口。
Code区:地址访问在0x00000000-0x1FFFFFFF。指令取值和数据访问通过ITCM接口或AXIM接口执行。若ITCM硬件已经实现且处于使能的状态,则ITCM映射地址为0x00000000。补充一下:指令取值通过ITCM。如果指令SRAM或者FLASH中,则通过AXIM接口访问指令。
SRAM区:地址访问在0x20000000-0x3FFFFFFF。数据访问通过DITCM接口或AXIM接口执行。若DTCM硬件已经实现且处于使能的状态,则DTCM映射地址为0x20000000。补充一下:数据访问通过DTCM。如果数据放在SRAM或者FLASH中,则通过AXIM接口访问数据。
Peripheral区:地址访问在0x40000000-0x5FFFFFFF。数据访问通过AHBP接口或AXIM接口完成。如果AHBP硬件已实现并使能,则AHBP对应的地址区间起始地址为0x40000000。另外,指令取值只可以通过AXIM接口实现,AHBP接口只可以访问数据。强烈不建议在该段地址执行代码。
External Ram区:地址访问在0x60000000-0x9FFFFFFF。指令和数据的访问均通过AXIM接口实现。补充,这一步区域就是常见的存储区,和SRAM区的区别就是SRAM区是通过专用告诉TCM接口访问,而External Ram区则只能通过总线AXIM接口。
External Device区:地址访问在0x60000000-0xDFFFFFFF。指令和数据的访问均通过AXIM接口实现。补充一点:和Peripheral区相比,该区域只支持AXIM接口,适合放片外外设,如FMC,IO扩展,外部NOR FLASH等。而Peripheral区则支持专用的AHBP接口,更适合放片上外设,即常见的外设模块,如GPIO,ADC,DMA等。
Private Peripheral Bus:地址访问在0xE0000000-0xE00FFFFF。对处理器外部外设相关寄存器的数据访问通过外部私有外设总线(EPPB)接口执行,该存储区域具备永不执行(XN)属性,因此禁止指令取指;即使处理器搭载存储器保护单元(MPU),也无法修改该固有属性。
System:地址访问在0xE0100000-0xFFFFFFFF。供芯片厂商系统外设使用的系统地址段。数据访问通过 AHBP 接口完成。该存储区域为永不执行(XN)属性,禁止指令取指;即便配备 MPU,也无法修改该硬件限制。
2.3.1、私有外设总线
内部私有外设总线(内部 PPB)接口可访问下述模块:
- 仪器化追踪宏单元(ITM)
- 数据观察点与追踪单元(DWT)
- 断点单元(FPB)
- 系统控制空间(SCS),包含存储器保护单元(MPU)、指令缓存与数据缓存(Icache和Dcache)、嵌套向量中断控制器(NVIC)
- 处理器 ROM 表与私有外设总线 ROM 表
外部私有外设总线(外部 PPB)接口可访问下述模块:
- 嵌入式追踪宏单元(ETM)
- 交叉触发接口(CTI)
- 外部系统中的 CoreSight 调试与追踪组件
2.3.2、跨区域的非对齐访问
Cortex‑M7 处理器支持 ARMv7 规范定义的非对齐访问,所有访问操作都会先作为单次非对齐访问发起。处理器内部会将其转换为两次或多次对齐访问,并通过处理器外部接口完成传输。
备注:软件层面支持非对齐访问,但是在处理器内部,硬件会通过BIU将指令拆解多次地址对齐的访问,对于跨区域的访问,如访问0x3FFFFFFE的四字节,一部分落在sram区,一部分落在了外设区。硬件会分两段,走不同的总线,执行不同的访问策略。所以在执行非对齐的访问时,硬件无法保证访问的原子操作,软件应避免这样的操作。
非对齐访问支持仅适用于单字 / 半字加载存储指令(LDR, LDRH, STR, STRH)。双字加载 / 存储指令本身仅允许字对齐访问,不支持其余类型的非对齐访问;若尝试非对齐访问,将会触发故障异常。
跨越存储器映射边界的非对齐访问,在架构层面行为不可预测。处理器表现取决于访问跨越的边界类型。PPB 地址空间不支持非对齐访问,因此不存在 PPB 访问发生跨边界的场景。
2.4、独占监视器
Cortex‑M7 处理器实现了本地独占监视器。关于信号量与本地独占监视器的更多信息,请参阅《Arm® v7‑M 架构参考手册》。
处理器内部的本地监视器设计为不保存任何物理地址,而是将任意一次访问均视作与上一条 LDREX 指令的地址相匹配。 这意味着本处理器实现的独占保留粒度(ERG, Exclusives Reservation Granule)为全部内存地址空间。
2.5、处理器内核寄存器
处理器包含以下32位处理器:
- 13 个通用寄存器 R0~R12;
- 栈指针寄存器(SP),即 R13,属于分组寄存器别名,包含进程栈指针
SP_process与主栈指针SP_main; - 链接寄存器(LR),R14;
- 程序计数器(PC),R15;
- 专用程序状态寄存器(xPSR);
2.6、异常
处理器与嵌套向量中断控制器(NVIC)负责对所有异常进行优先级判定与处理。处理异常时遵循以下规则:
- 所有异常均在处理器处理模式(Handler mode)下执行。
- 发生异常时,处理器自动将现场状态保存至栈;中断服务程序(ISR)执行完毕后,自动从栈恢复现场。
- 向量地址的读取操作与现场保存并行执行,实现高效的异常入场流程。
处理器支持尾链中断(tail-chaining),可实现中断无缝连续执行,省去重复保存、恢复现场的开销。
芯片实现阶段可配置中断总数以及中断优先级级数。 软件仅可启用已配置中断中的一部分,同时可选择使用已配置优先级级数中的若干层级。
备注:EPSR 寄存器的 T 位用于支持 Arm 架构指令交互模型。但 ARMv7‑M 架构仅允许执行 Thumb 指令,因此该位必须恒保持为 1。这意味着所有异常向量地址最低位 Bit [0] 必须置 1。 异常进入时,若对应向量表条目的 Bit [0] 为 0,执行第一条指令时会触发 INVSTATE UsageFault。 若该错误在复位阶段发生,则故障会升级为硬故障(HardFault),原因是复位状态下 UsageFault 默认处于关闭状态。
2.7、异常处理
来自 TCM 接口、AXIM 接口或 AHB 接口的外部读故障,会在处理器内产生同步异常;外部写故障则在处理器内产生异步异常。处理器实现了《Arm® v7‑M 架构参考手册》所描述的高级异常与中断处理机制。
除架构规定的标准行为外,本处理器异常模型具备以下实现相关特性:
- 从硬故障(HardFault)向不可屏蔽中断(NMI)发生入栈异常时,系统将以 NMI 优先级进入死锁(lockup)状态。
- 从 NMI 向 HardFault 发生出栈异常时,系统将以 HardFault 优先级进入死锁(lockup)状态。
为最大限度降低中断延迟,当检测到中断请求时,处理器可以放弃绝大多数正在执行的多周期指令。唯一例外场景: 从设备内存(Device)或强排序内存(Strongly-ordered)发起的加载操作,或是在 AXI 接口发起的共享独占存储操作,不会被放弃。
一旦识别到中断,所有普通内存访问事务都会被中止。 从中断返回后,处理器会重新发起所有被放弃的操作。处理器同时实现可中断 - 可续执行位(Interruptible-continuable bits),支持多条加载 / 存储多字指令(LDM/STM)被中断打断并后续续执行。 在此机制下,处理器不会从头重启整条指令,而是在上一次已经完成的数据传输之后继续执行。 关于可中断 - 可续执行位及其适用场景的重要限制,请参阅《Arm® v7‑M 架构参考手册》。
知识点:占坑后面更新
1、CCR中的STKALIGN和UNALIGN_TRP的作用
2、找一个芯片的总线系统架构,研究一下在AXIM下挂了那些东西,在AHB总线下挂了那些东西,在APB总线下挂了那些东西。
3、内核里面的独占监视实现机制
4、回顾一下故障升级的条件。
