在ARMv7架构的PMSA(Protected Memory System Architecture)实现中,系统控制寄存器是处理器与操作系统交互的关键接口。这些寄存器通过CP15协处理器指令进行访问,负责管理处理器的核心功能。
关键提示:PMSA与VMSA的主要区别在于内存管理方式。PMSA采用内存保护单元(MPU)而非MMU,适合实时性要求高的场景。
系统控制寄存器主要分为以下几类功能组:
CNTP_CTL是PL1物理定时器的控制寄存器,32位可读写,复位值未知。关键位域包括:
访问CNTP_CTL的汇编示例:
armasm复制MRC p15, 0, <Rt>, c14, c2, 1 ; 读取CNTP_CTL到Rt
MCR p15, 0, <Rt>, c14, c2, 1 ; 将Rt写入CNTP_CTL
CNTP_CVAL是64位可读写寄存器,存储PL1物理定时器的比较值。当计数器值(CNTPCT)达到比较值时,会触发中断。
访问CNTP_CVAL需要特殊的64位操作指令:
armasm复制MRRC p15, 2, <Rt>, <Rt2>, c14 ; 读取64位CNTP_CVAL
MCRR p15, 2, <Rt>, <Rt2>, c14 ; 写入64位CNTP_CVAL
其中Rt存储低32位,Rt2存储高32位。
CNTPCT是64位只读寄存器,提供物理计数器的当前值。其频率通常等于系统时钟频率。
armasm复制MRRC p15, 0, <Rt>, <Rt2>, c14 ; 读取64位CNTPCT
实际经验:在多核系统中,CNTPCT在各核间是同步的,适合作为系统范围的统一时间基准。
DRACR定义数据地址空间中内存区域的访问属性:
典型配置流程:
armasm复制; 1. 设置RGNR选择区域编号
MOV r0, #1 ; 选择区域1
MCR p15, 0, r0, c6, c2, 0
; 2. 配置DRACR
LDR r0, =0x0000030 ; AP=011, TEX=000, C=1, B=1, S=0
MCR p15, 0, r0, c6, c1, 4
32位可读写寄存器,用于标识当前执行上下文:
armasm复制MRC p15, 0, <Rt>, c13, c0, 1 ; 读取CONTEXTIDR
MCR p15, 0, <Rt>, c13, c0, 1 ; 写入CONTEXTIDR
PMSA提供多种缓存维护指令,通过CP15协处理器指令实现:
armasm复制; 清理并无效地址0x200000处的缓存行
MOV r0, #0x200000
MCR p15, 0, r0, c7, c14, 1
armasm复制; 无效第3组第2路的缓存
MOV r0, #(3 << 5) | (2 << 30) ; 组索引和路索引
MCR p15, 0, r0, c7, c6, 2
性能提示:按地址维护适合特定数据操作,按组/路维护适合批量操作,但需要了解缓存拓扑结构。
CPACR控制CP0-CP13协处理器的访问权限:
典型配置示例:
armasm复制MRC p15, 0, r0, c1, c0, 2 ; 读取CPACR
ORR r0, r0, #(0xF << 20) ; 启用CP10和CP11(浮点)
BIC r0, r0, #(3 << 0) ; 禁用CP0
MCR p15, 0, r0, c1, c0, 2 ; 写回CPACR
DFSR记录数据异常的状态信息:
DFAR保存导致同步数据异常的地址。
异常处理典型流程:
armasm复制data_abort_handler:
MRC p15, 0, r0, c5, c0, 0 ; 读取DFSR
MRC p15, 0, r1, c6, c0, 0 ; 读取DFAR
; 分析错误原因并处理
; ...
MOV pc, lr ; 返回
CTR提供缓存架构信息:
armasm复制MRC p15, 0, r0, c0, c0, 1 ; 读取CTR
选择要查询的缓存级别和类型:
armasm复制; 查询L1数据缓存信息
MOV r0, #0 ; L1数据缓存
MCR p15, 2, r0, c0, c0, 0 ; 写入CSSELR
MRC p15, 1, r0, c0, c0, 0 ; 读取CCSIDR
寄存器访问顺序:
定时器使用建议:
armasm复制; 初始化物理定时器示例
MRRC p15, 0, r0, r1, c14 ; 读取CNTPCT
ADD r0, r0, #1000000 ; 设置1ms后触发(假设1MHz时钟)
MOV r1, #0
MCRR p15, 2, r0, r1, c14 ; 写入CNTP_CVAL
MOV r0, #1 ; 启用定时器
MCR p15, 0, r0, c14, c2, 1 ; 写入CNTP_CTL
缓存维护最佳实践:
安全注意事项:
调试技巧:
在实时操作系统的移植过程中,合理配置这些系统控制寄存器对保证系统性能和实时性至关重要。特别是在中断响应、任务切换和内存保护等方面,需要根据具体应用场景优化寄存器配置。