You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单一代码访问SOC中R52与A55核心的PMU寄存器?

跨核心访问PMU寄存器的方案说明

核心结论

不能通过在单个核心上执行的代码直接读取另一核心的PMU寄存器——PMU是每个CPU核心的私有硬件组件,只能在对应核心上执行指令才能访问其寄存器。但可以通过核心绑定+跨核心数据同步的方式,实现对两款核心PMU寄存器的读取。

分核心读取实现

  1. 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;
    }
    
  2. 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;
      }
      

跨核心读取的实现步骤

  1. 绑定任务到对应核心
    • 在Linux系统中,可使用sched_setaffinity接口将读取PMU的函数绑定到指定核心(A55或R52)执行。
    • 在RTOS环境中,通过内核提供的任务绑定API(如FreeRTOS的vTaskCoreAffinitySet)将读取任务固定到目标核心。
  2. 同步读取结果
    将两个核心读取到的PMU值写入共享内存、通过IPC消息传递,或使用原子变量同步,即可在同一上下文汇总两个核心的PMU数据。

注意事项

  • 两款核心的PMU配置流程可能存在差异(如计数器使能、事件选择),需参考SOC的技术参考手册和ARM R52/A55的架构手册完成前置配置。
  • 部分SOC可能对PMU寄存器的访问权限有严格限制,需确保代码运行在具备足够权限的异常级别(如EL1)。

内容的提问来源于stack exchange,提问作者SARATH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:15:55