如何通过单一代码访问SOC中R52与A55核心的PMU寄存器?
跨核心访问PMU寄存器的方案说明
核心结论
不能通过在单个核心上执行的代码直接读取另一核心的PMU寄存器——PMU是每个CPU核心的私有硬件组件,只能在对应核心上执行指令才能访问其寄存器。但可以通过核心绑定+跨核心数据同步的方式,实现对两款核心PMU寄存器的读取。
分核心读取实现
A55核心的PMU读取
你当前使用的代码是正确的,pmccntr_el0是ARMv8-A架构(A55属于该架构)的PMU循环计数器寄存器,在A55核心上执行这段汇编指令,即可读取该核心的PMU计数:uint64_t read_a55_pmu(void) { uint64_t value; asm volatile("mrs %0, pmccntr_el0" : "=r" (value)); return value; }R52核心的PMU读取
R52属于ARMv8-R实时架构,其PMU寄存器的访问指令同样使用MRS,但需根据运行模式调整:- 若R52运行在AArch64模式下,循环计数器寄存器同样为
pmccntr_el0,读取代码格式和A55一致,但必须在R52核心上执行这段代码才能获取R52的PMU值。 - 若R52运行在AArch32模式下,对应的寄存器为
PMCCNTR,读取代码需调整为:uint32_t read_r52_pmu(void) { uint32_t value; asm volatile("mrs %0, PMCCNTR" : "=r" (value)); return value; }
- 若R52运行在AArch64模式下,循环计数器寄存器同样为
跨核心读取的实现步骤
- 绑定任务到对应核心
- 在Linux系统中,可使用
sched_setaffinity接口将读取PMU的函数绑定到指定核心(A55或R52)执行。 - 在RTOS环境中,通过内核提供的任务绑定API(如FreeRTOS的
vTaskCoreAffinitySet)将读取任务固定到目标核心。
- 在Linux系统中,可使用
- 同步读取结果
将两个核心读取到的PMU值写入共享内存、通过IPC消息传递,或使用原子变量同步,即可在同一上下文汇总两个核心的PMU数据。
注意事项
- 两款核心的PMU配置流程可能存在差异(如计数器使能、事件选择),需参考SOC的技术参考手册和ARM R52/A55的架构手册完成前置配置。
- 部分SOC可能对PMU寄存器的访问权限有严格限制,需确保代码运行在具备足够权限的异常级别(如EL1)。
内容的提问来源于stack exchange,提问作者SARATH
相关产品推荐
相关产品推荐

