C906 RISCV HPM(PMU)使用方法

本文介绍RISC-V架构中HPM(硬件性能监视器)的初始化方法及使用技巧,包括如何通过计数器获取ICache miss率,并提供实际测试结果。探讨了不同事件计数器单位的区别及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HPM(Hardware performance Monitor)对应ARM平台中的PMU(Performance Monitoer Unit), 是架构定义的一部分,为系统提供了非入侵调试(Non-Invasive Debug)的手段。 RISCV架构对此也作了定义。

下面是RISCV初始化HPM的方法,可以在系统初始化时调用。

.option norvc
.global	hpm_get_icache_miss_rate
hpm_get_icache_miss_rate:
    li   x5, 0xffffffff
    csrw mcountinhibit, x5
    csrw mcycle, x0
    csrw minstret, x0
    csrw mhpmcounter3, x0
    csrw mhpmcounter4, x0
    csrw mhpmcounter5, x0
    csrw mhpmcounter6, x0
    csrw mhpmcounter7, x0
    csrw mhpmcounter8, x0
    csrw mhpmcounter9, x0
    csrw mhpmcounter10, x0
    csrw mhpmcounter11, x0
    csrw mhpmcounter12, x0
    csrw mhpmcounter13, x0
    csrw mhpmcounter14, x0
    csrw mhpmcounter15, x0
    csrw mhpmcounter16, x0
    csrw mhpmcounter17, x0
    csrw mhpmcounter18, x0
    csrw mhpmcounter19, x0
    csrw mhpmcounter20, x0
    csrw mhpmcounter21, x0
    csrw mhpmcounter22, x0
    csrw mhpmcounter23, x0
    csrw mhpmcounter24, x0
    csrw mhpmcounter25, x0
    csrw mhpmcounter26, x0
    csrw mhpmcounter27, x0
    csrw mhpmcounter28, x0
    csrw mhpmcounter29, x0
    csrw mhpmcounter30, x0
    csrw mhpmcounter31, x0

    li   x5, 1
    csrw mhpmevent3, x5
    li   x5, 2
    csrw mhpmevent4, x5
    li   x5, 3
    csrw mhpmevent5, x5
    li   x5, 4
    csrw mhpmevent6, x5
    li   x5, 5
    csrw mhpmevent7, x5
    li   x5, 6
    csrw mhpmevent8, x5
    li   x5, 7
    csrw mhpmevent9, x5
    li   x5, 0xb
    csrw mhpmevent13, x5
    li   x5, 0xc
    csrw mhpmevent14, x5
    li   x5, 0xd
    csrw mhpmevent15, x5
    li   x5, 0xe
    csrw mhpmevent16, x5
    li   x5, 0xf
    csrw mhpmevent17, x5

    li   x5, 0xffffffff
    csrw mcounteren, x5
    
    li   x5, 0xffffffff
    csrw scounteren, x5

    csrw mcountinhibit, x0

    ret

在需要检测cache miss的位置,调用读取event寄存器:


DBG("counter3: %lx,counter4: %lx, dcr: 0x%lx, dcrm: 0x%lx dcw: 0x%lx, dcwm: 0x%lx, sto:0x%lx\n", csr_read(mhpmcounter3), csr_read(mhpmcounter4),csr_read(mhpmcounter14),csr_read(mhpmcounter15), csr_read(mhpmcounter16), csr_read(mhpmcounter17),csr_read(mhpmcounter13));

测试,在timer中断中查询当前的事件寄存器状态:

riscv_timer_interrupt line 43, counter3: 18c970e9d8,counter4: 28
riscv_timer_interrupt line 43, counter3: 18c9bb2df2,counter4: 28
riscv_timer_interrupt line 43, counter3: 18ca05720f,counter4: 28
riscv_timer_interrupt line 43, counter3: 18ca4fb62c,counter4: 28
riscv_timer_interrupt line 43, counter3: 18ca99fa49,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cae43e67,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cb2e8277,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cb78c68a,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cbc30a99,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cc0d4eb6,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cc5792cf,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cca1d6ec,counter4: 28
riscv_timer_interrupt line 43, counter3: 18ccec1afc,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cd365f0f,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cd80a31e,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cdcae73b,counter4: 28
riscv_timer_interrupt line 43, counter3: 18ce152b4a,counter4: 28
riscv_timer_interrupt line 43, counter3: 18ce5f6f5d,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cea9b36d,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cef3f78a,counter4: 28
riscv_timer_interrupt line 43, counter3: 18cf3e3b99,counter4: 28

通过访问counter3和counter4寄存器,在RTOS上成功获取到了ICache的miss率(counter3/counter4),但是貌似没有办法得到cache miss时候对用的访问地址。 也就是有没有办法能够获得失中时刻的访问地址。它更是一个程序段行为的统计展示。 为了优化程序可以分程序段分别统计cache miss率,针对miss率高的程序段进行分析。

关于HPM的使用,总结如下:

1、不同事件计数器单位不同,可以从事件描述中看出。例如:time这一计数器所表示的是系统计时器的当前值,或者counter_i表征L1 ICache miss counter时,它的单位就是L1 ICache访问缺失的次数;

2、如上所述,如果counter3设置为CACHE(ICACHE/DCACHE读/DCACHE写)的缺失次数,读该寄存器的返回值得到的时访问CACHE缺失的次数,只需再设置某一寄存器counter_i为CACHE访问次数,用counter3的值除以counter_i的值即可得到CACHE缺失率。


结束!

<think>好的,用户的问题是关于PMU上电时如何通过I2C或SIF进行锁存选择。首先,我需要理解PMU是什么,以及锁存选择的作用。根据引用[3],PMU在ARM平台中是性能监控单元,而在RISCV架构中称为HPM,用于非侵入式调试。不过这里用户提到的PMU可能是指电源管理单元,需要结合上下文判断。 接下来,用户提到的I2C和SIF是两种接口。根据引用[1],光模块的I2C地址相同,不能挂同一总线,可能需要分时控制。引用[2]提到GPIO的不同输入模式,可能涉及硬件配置。SIF可能是指串行接口,比如某种特定的通信协议。 锁存选择可能是在上电时通过某种引脚电平决定PMU的配置接口是I2C还是SIF。例如,硬件设计时可能通过上拉或下拉电阻设置特定GPIO的状态,PMU在上电时会检测这些引脚的电平,从而选择相应的通信接口。 需要确认PMU的具体型号或文档,但用户没有提供。因此,回答应基于一般方法,结合现有引用。例如,参考GPIO的上拉/下拉输入模式(引用[2]),可能通过配置相关GPIO在启动时的状态来选择接口。此外,I2C地址冲突的问题(引用[1])可能需要分时切换或使用交换芯片,但此处可能不适用,因为PMU可能单独使用总线。 总结步骤:1. 确定硬件引脚配置;2. 设置上拉/下拉电阻;3. 通过启动时的电平状态选择接口模式;4. 软件配置相应驱动。需要提醒用户查阅具体手册,并注意电平稳定性和抗干扰措施。</think>### PMU上电锁存选择I2C/SIF配置方法 1. **硬件引脚配置** 大多数PMU芯片通过特定引脚(如`BOOT_SEL`、`CFG_MODE`)的电平状态决定启动时的通信接口模式。例如: - **高电平**:选择I2C接口 - **低电平**:选择SIF接口 需在PCB设计时为这些引脚配置上拉/下拉电阻(参考GPIO输入模式中的上拉/下拉配置[^2])。 2. **典型电路设计** ```plaintext PMU_CFG_MODE引脚 ├── 10kΩ上拉电阻 → VCC(选择I2C) └── 跳线或焊盘接地(选择SIF) ``` 上电时PMU会锁存该引脚电平状态,确定后续通信协议。 3. **软件初始化注意事项** - 若选择I2C模式,需确保总线地址无冲突(参考光模块I2C地址设计问题[^1])。 - SIF模式可能需要特定时序初始化,需遵循芯片手册的时序要求。 4. **调试与验证** - 使用逻辑分析仪捕获上电瞬间引脚电平。 - 通过HPM/PMU性能监控单元(如RISCV HPM[^3])观察总线活动状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值