• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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 区域

步骤:

  1. 设置基址(RBAR):
    • 寄存器格式:[31:N] = Base Address, [4:0] = Region Number
    • N 由区域大小决定(如 64KB 区域时 N=16)
  2. 设置属性(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

⚠️ 三、关键注意事项

  1. 特权模式要求:

    • 所有 CP15 操作需在 特权模式(如 Supervisor)执行,用户模式触发异常。
    // C 中通过 SVC 调用
    void set_vbar(uint32_t addr) {
        __asm__ volatile("SVC #0x01" : : "r" (addr)); // 切换到特权模式执行 MCR
    }
    
  2. 内存屏障:

    • 修改关键配置(如 SCTLR、MPU)后必须插入屏障:
      DSB     ; 等待所有内存访问完成
      ISB     ; 清空流水线
      
  3. 实时性约束:

    • MPU/TCM 配置应在 启动阶段完成,避免运行时重配引入延迟抖动。
  4. 寄存器破坏声明:
    内联汇编中需声明破坏的寄存器:

    __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 的系统控制中枢,核心操作包括:

  1. SCTLR:全局功能开关(MPU/Cache/TCM)
  2. MPU_RBAR/MPU_RASR:内存区域保护配置
  3. c9/c10:TCM 地址与大小设置
  4. VBAR:异常向量表定位
  5. c7:缓存维护操作
    严格遵循 特权模式+内存屏障+实时约束 原则,是构建可靠实时系统(如汽车电子 Cortex-R52)的基础。

posted on 2025-06-18 22:08  SOC验证工程师  阅读(290)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3