"); //-->
CSR简介
RISC-V 架构的控制和状态寄存器(Control and Status Register, CSR),用于配置或记录一些处理器核的运行状态。CSR寄存器是处理器核内部的寄存器,使用其专有的12位地址编码空间,数量最多有4096个。所以访问CSR寄存器需要使用特殊的指令。
RISC-V定义了以下几种CSR访问指令:
CSR除了RSC-V标准的CSR之外,芯片厂商可能还会添加自定义的CSR,用于实现一些特别功能。例如芯来科技的Bumblebee内核就扩展了数个CSR用于处理中断嵌套,记录处理器当前的异常类型等。
RISC-V的可扩展特性给了厂商比较大的灵活性,可扩展特性也引起了碎片化的问题。这个问题确实是存在的,只有当软硬件工具都提供了一种机制能够灵活的来适应不同的厂商,才能消除这个因素带来的影响。
J-Link访问CSR寄存器
J-Link从6.48 r1开始,支持了读写CSR。于是在对RISC-V处理器进行调试时,就很方便了。不论是标准的CSR,还是厂商自定义的CSR,只需要给出它的地址即可实现读或写操作。在此之前只能通过IDE的调试系统查看标准的CSR,而自定义CSR则无法在IDE调试窗口中查看。
下面以GD32VF103这颗MCU为例,使用J-Link调试器以及J-Link Commander软件工具来读写标准和自定义CSR。GD32VF103使用的是芯来科技的Bumblebee内核,下面先在代码中触发一个EXTI线0中断,然后通过J-Link读取标准CSR中的mcause寄存器:
从mcause寄存器可以看到,当EXTI线0中断触发,bit31应该是1,bit11:0应该是其中断编号,从GD32VF103的手册中确认是25,也就是0x19。
在EXTI0的中断服务程序中加一个断点,让CPU在此暂停执行。
然后通过J-Link Commander连上MCU,通过ReadCSR命令读取macuse(地址0x342):
可以确认读取CSR成功。
下面通过J-Link来写厂商自定义CSR。mcountinhibit(地址0x320)是Bumblebee内核提供的一个自定义CSR,用于开启和关闭RISC-V核内定时器和CPU计数器。
通过WriteCSR命令,对mcountinhibit的CY位置位,关闭mcycle:
在IDE中可以,再次运行代码可以发现mcycle定时器的值不再变化,说明关闭成功。再次置零,mcycle的值又会变化。
Segger Embedded Studio中查看自定义CSR
Segger Embedded Studio是一个支持ARM和RISC-V架构的IDE,具有功能强,运行速度快等优点。从Embedded Studio for RISC-V v6.12a版本开始,用户可以添加厂商自定义的CSR。其中,针对RISC-V内核CSR,在安装路径的targets目录下的cpu_registers_riscv.xml文件描述了当前处理器支持的CSR。
通过修改这个文件可以添加厂商自定义CSR。将这个文件复制到工程路径下面,进行修改。这里添加Bumblebee内核的msubm寄存器,其指示当异常发生时异常的类型。
在cpu_registers_riscv.xml文件的最后面添加上对msubm寄存器的描述,并将Group命名为Customized CSRs:BumbleBee。
然后在Embedded Studio进入调试后,在寄存器窗口可以看到添加的自定义Group,将其使能。
当中断发生时,可从寄存器窗口看到msubm寄存器的TYP域的值变成了1,指示当前发生的是中断。
当异常触发时,TYP域的值变成了2,指示当前发生的是系统异常。
SEGGER的J-Link和Embedded Studio工具都针对RISC-V的CSR寄存器提供了读写功能,方便用户在使用不同厂家的MCU时提高调试的效率。如果你在使用RISC-V架构的处理器,并且有J-Link的话,不妨一试。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
eleaction01 阅读:2950