RISC-V内核中的mtvec寄存器
今天下午研究了一下沁恒CH32V317,要玩CH32V317也要使用WCH-Link。WCH-Link支持RISC-V模式和ARM模式。还是蛮高级的一件事。再来研究了一下RISC-V和ARM的一个显著区别——中断向量表的配置mtvec寄存器,其支持ARM的vector table模式。好吧!再多看看mtvec寄存器。
mtvec 寄存器是用来设置机器模式的异常向量基地址寄存器(Machine Mode Exception Vector Base Address Register)。这个寄存器决定了如何处理中断和异常。
寄存器概述
在 RISC-V 中,mtvec 寄存器是一个 CSR(Control and Status Register),其地址为 0x305。它有两个主要的配置模式:直接模式和向量模式。
直接模式
在直接模式下,mtvec 的最低位(bit 0)被设置为 0。在这种模式下,异常向量基地址的低两位被忽略,因此实际的基地址是对齐到4字节边界的。例如,如果 mtvec 被设置为 0x80000000,实际的异常处理代码起始地址会是 0x80000000。
向量模式
在向量模式下,mtvec 的最低位被设置为 1。在这种模式下,异常向量基地址的低两位用来决定是使用 4 字节对齐的异常处理代码还是使用 16 字节对齐的异常处理代码。例如,如果 mtvec 被设置为 0x80000001,则实际的异常处理代码起始地址会是 0x80000000(4字节对齐),如果是 0x80000003,则可能是 0x80000010(16字节对齐)。
如何设置 mtvec
在汇编语言中,你可以使用 csrrw, csrrs, csrrc, 或 csrrwi, csrrsi, csrrci 指令来操作 mtvec 寄存器。例如,要将 mtvec 设置为向量模式下的 0x80000010(16字节对齐),你可以使用以下指令:
li t0, 0x80000013 # Load the value into a register
csrw mtvec, t0 # Write the value to mtvec
或者,如果你只想设置基地址而不改变模式位(比如设置为直接模式下的 0x80000024):
li t1, 0x80000024 # Load the base address into a register
csrw mtvec, t1 # Write the base address to mtvec (direct mode, mode bit is 0)
注意事项
确保异常处理代码在指定的内存地址处正确对齐。
在多核处理器中,通常每个核心的 mtvec 可以独立设置,以便每个核心可以有不同的异常处理代码。
在启动代码或操作系统初始化时设置 mtvec 是非常重要的,以确保系统能够正确响应异常和中断。
通过正确配置和使用 mtvec,你可以有效地管理和响应 RISC-V 系统中的异常和中断。
总结
学习之后,可以看到沁恒在mtvec寄存器上面应该融入了自己想法。将其扩展之后,更加适合现场应用。