arm中cp15协处理器的详细用法
在 ARMv8-R 架构中,CP15(系统控制协处理器) 是管理底层硬件资源的核心模块,通过协处理器指令(MCR/MRC)实现系统配置。以下是其详细用法及关键操作示例:
🔧 一、CP15 核心功能与寄存器映射
CP15 通过 组合寄存器(CRn + CRm + opc2)访问,关键功能如下:
| 功能 | CRn | CRm | opc2 | 寄存器名 | 作用 |
|---|---|---|---|---|---|
| 系统控制 | c1 | c0 | 0 | SCTLR |
全局使能 MPU/Cache/TCM |
| MPU 基址配置 | c6 | c0 | 0-7 | MPU_RBAR |
设置内存区域起始地址 |
| MPU 属性配置 | c6 | c1 | 0-7 | MPU_RASR |
定义区域大小/权限/缓存策略 |
| 缓存维护 | c7 | c5/c6 | 0-6 | ICIALLU/DCISW |
指令/数据缓存失效 |
| TCM 配置 | c9 | c1 | 0 | ITCM Region |
指令 TCM 基址与大小 |
| c10 | c1 | 0 | DTCM Region |
数据 TCM 基址与大小 | |
| 异常向量基址 | c12 | c0 | 0 | VBAR |
设置异常处理入口地址 |
| 安全域权限 | c3 | c0 | 0 | DACR |
内存域访问控制 |
🛠️ 二、关键操作详解与代码示例
1. 全局系统控制(SCTLR)
作用:启用 MPU、Cache、对齐检查等核心功能。
寄存器位定义:
- Bit 0:MPU 使能(
1=启用) - Bit 2:数据 Cache 使能
- Bit 12:指令 Cache 使能
- Bit 18:ITCM 使能(Cortex-R52)
示例:启用 MPU 和 ITCM
MRC p15, 0, r0, c1, c0, 0 ; 读取 SCTLR 到 r0
ORR r0, r0, #(1 << 0) ; 设置 Bit0 (MPUEN=1)
ORR r0, r0, #(1 << 18) ; 设置 Bit18 (ITCMEN=1)
MCR p15, 0, r0, c1, c0, 0 ; 写回 SCTLR
DSB ; 数据同步屏障
ISB ; 指令同步屏障
2. 配置 MPU 区域
步骤:
- 设置基址(RBAR):
- 寄存器格式:
[31:N] = Base Address,[4:0] = Region Number N由区域大小决定(如 64KB 区域时N=16)
- 寄存器格式:
- 设置属性(RASR):
[31:28]:XN(执行禁止)[24:22]:AP(访问权限,如011=特权R/W)[18:16]:TEX/S/C/B(内存类型)[5:1]:SIZE(区域大小 = 2^(SIZE+1))Bit 0:ENABLE
示例:定义特权代码区(0x00000000, 64KB, RO)
; 1. 设置 RBAR (Region 0)
LDR r0, =0x00000000 ; 基地址 + Region 0
MCR p15, 0, r0, c6, c0, 0 ; 写入 MPU_RBAR
; 2. 设置 RASR
LDR r0, =0x0308001D ; AP=011 (特权R/W), TEX:S:C:B=0000, SIZE=64KB (0x11+1=18位)
MCR p15, 0, r0, c6, c1, 0 ; 写入 MPU_RASR
3. 控制 TCM
配置指令 TCM(ITCM):
; 设置 ITCM 基址和大小 (c9)
LDR r0, =0x00010000 ; 基地址=0x10000, SIZE=64KB (值=0x10)
MCR p15, 0, r0, c9, c1, 0 ; 写入 ITCM 区域寄存器
启用 ITCM:需在 SCTLR 中设置 Bit 18(见上文)。
4. 缓存维护操作
清理数据缓存:
MCR p15, 0, r0, c7, c10, 1 ; DC CLEAN单行 (地址在r0)
; 或清理整个缓存:
MOV r0, #0
MCR p15, 0, r0, c7, c10, 4 ; DCCLEAN
5. 设置异常向量表
LDR r0, =0xFFFF0000 ; 异常向量表基址
MCR p15, 0, r0, c12, c0, 0 ; 写入 VBAR
⚠️ 三、关键注意事项
-
特权模式要求:
- 所有 CP15 操作需在 特权模式(如 Supervisor)执行,用户模式触发异常。
// C 中通过 SVC 调用 void set_vbar(uint32_t addr) { __asm__ volatile("SVC #0x01" : : "r" (addr)); // 切换到特权模式执行 MCR } -
内存屏障:
- 修改关键配置(如 SCTLR、MPU)后必须插入屏障:
DSB ; 等待所有内存访问完成 ISB ; 清空流水线
- 修改关键配置(如 SCTLR、MPU)后必须插入屏障:
-
实时性约束:
- MPU/TCM 配置应在 启动阶段完成,避免运行时重配引入延迟抖动。
-
寄存器破坏声明:
内联汇编中需声明破坏的寄存器:__asm__ volatile ( "MCR p15, 0, %0, c12, c0, 0 \n" : : "r" (addr) : "memory" // 声明内存被修改 );
💎 四、完整示例:安全启动配置
_start:
; 1. 启用 ITCM
LDR r0, =0x00010000 ; ITCM 基址+大小
MCR p15, 0, r0, c9, c1, 0
MRC p15, 0, r0, c1, c0, 0
ORR r0, r0, #(1 << 18) ; SCTLR.ITCMEN=1
MCR p15, 0, r0, c1, c0, 0
; 2. 配置 MPU
; Region 0: 代码区 (0x00000000, 64KB, RO)
LDR r0, =0x00000000
MCR p15, 0, r0, c6, c0, 0
LDR r0, =0x0308001D ; AP=011, SIZE=64KB
MCR p15, 0, r0, c6, c1, 0
; Region 1: 数据区 (0x20000000, 256KB, RW)
LDR r0, =0x20000000
MCR p15, 0, r0, c6, c0, 1 ; Region 1 RBAR
LDR r0, =0x0303001F ; SIZE=256KB
MCR p15, 0, r0, c6, c1, 1
; 3. 全局启用 MPU
MRC p15, 0, r0, c1, c0, 0
ORR r0, r0, #1 ; SCTLR.M=1
MCR p15, 0, r0, c1, c0, 0
DSB
ISB
; 4. 设置异常向量
LDR r0, =_vectors
MCR p15, 0, r0, c12, c0, 0
💎 总结
CP15 是 ARMv8-R 的系统控制中枢,核心操作包括:
SCTLR:全局功能开关(MPU/Cache/TCM)MPU_RBAR/MPU_RASR:内存区域保护配置c9/c10:TCM 地址与大小设置VBAR:异常向量表定位c7:缓存维护操作
严格遵循 特权模式+内存屏障+实时约束 原则,是构建可靠实时系统(如汽车电子 Cortex-R52)的基础。
浙公网安备 33010602011771号