黄昏收获 发表于 2025-6-28 15:32

RISC-V的向量中断

本帖最后由 黄昏收获 于 2025-6-28 15:35 编辑

RISC-V的向量中断      RISC-V是一个开源的内核指令集。其有一个特别的优势就是其规范手册的内容特别少。于是,要学习的,尤其是自己要学习的内容就更多。没办法啊!先来难度较高的来啃吧!      RISC-V的向量中断是一种通过硬件实现快速中断响应的机制,其核心是通过中断类型号自动定位并跳转到特定中断处理程序的入口地址。具体原理和特点如下:一、向量中断的核心机制
[*]索引跳转原理当中断发生时,处理器根据‌中断类型号‌(如外部中断号、定时器中断号等)计算出中断服务程序入口地址的存储位置:
入口地址 = 中断向量表基地址 + 中断号 × 4(每个入口占4字节)。硬件直接跳转至该地址执行服务程序,无需软件查询中断源。
[*]中断向量表结构

[*]表存储在内存固定区域(如RISC-V的mtvec寄存器指定基址),每个表项包含‌跳转指令‌或‌中断服务程序入口地址‌。
[*]在RISC-V中,向量表项通常存放跳转指令(如j isr_timer),而非直接地址,需二次跳转至实际处理函数。
二、RISC-V的向量中断实现‌
[*]‌向量模式配置‌RISC-V通过mtvec(机器模式陷阱向量基址寄存器)控制中断处理模式:

[*]‌向量模式‌:设置mtvec.MODE = 1,使中断触发时根据中断号偏移跳转(偏移量 = 中断号 × 4)。
[*]‌直接模式‌:所有中断共享同一入口,需软件识别中断源。
[*]‌地址对齐要求‌向量表基址必须按实现要求对齐(如4字节或更高),否则可能导致异常。
[*]‌典型应用场景‌常用于处理‌本地中断‌(如CLINT生成的定时器中断、软件中断),而外部中断(PLIC管理)通常采用非向量模式处理。
三、GD32VF103的向量中断配置      在GD32VF103系列MCU里面,我们使用ECLIC模块的寄存器clicintattr[]来实现。ECLIC 的每个中断源都可以独立配置为向量模式和非向量模式,即clicintattr[]寄存器是中断源的属性寄存器,软件可以通过改写该寄存器配置中断源的若干属性。bit位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的中断处理还是有点复杂的。慢慢来吧!
页: [1]
查看完整版本: RISC-V的向量中断