本帖最后由 黄昏收获 于 2025-6-28 15:35 编辑
RISC-V的向量中断 RISC-V是一个开源的内核指令集。其有一个特别的优势就是其规范手册的内容特别少。于是,要学习的,尤其是自己要学习的内容就更多。没办法啊!先来难度较高的来啃吧! RISC-V的向量中断是一种通过硬件实现快速中断响应的机制,其核心是通过中断类型号自动定位并跳转到特定中断处理程序的入口地址。具体原理和特点如下: 一、向量中断的核心机制索引跳转原理 当中断发生时,处理器根据中断类型号(如外部中断号、定时器中断号等)计算出中断服务程序入口地址的存储位置:
入口地址 = 中断向量表基地址 + 中断号 × 4(每个入口占4字节)。 硬件直接跳转至该地址执行服务程序,无需软件查询中断源。 二、RISC-V的向量中断实现向量模式配置 RISC-V通过mtvec(机器模式陷阱向量基址寄存器)控制中断处理模式:
地址对齐要求 向量表基址必须按实现要求对齐(如4字节或更高),否则可能导致异常。 典型应用场景 常用于处理本地中断(如CLINT生成的定时器中断、软件中断),而外部中断(PLIC管理)通常采用非向量模式处理。
三、GD32VF103的向量中断配置 在GD32VF103系列MCU里面,我们使用ECLIC模块的寄存器clicintattr[]来实现。ECLIC 的每个中断源都可以独立配置为向量模式和非向量模式,即clicintattr[]寄存器是中断源的属性寄存器,软件可以通过改写该寄存器配置中断源的若干属性。bit[0]位shv域即为中断属性。配置为1 时为向量模式,配置为0 时为非向量模式,默认值为0,非向量模式。 //sets vector-mode or non-vector mode
void eclic_set_vmode(uint32_t source)
{
//read the current attr
uint8_t old_intattr = eclic_get_intattr(source);
// Keep other bits unchanged and only set the LSB bit
uint8_t new_intattr=(old_intattr | 0x1);
eclic_set_intattr(source, new_intattr);
}
RISC-V的中断处理还是有点复杂的。慢慢来吧!
|