这次我们介绍的功能是PLIC中断。
首先我们先看一下指令集《The RISC-V Instruction Set Manual Volume II: Privileged Architecture Privileged Architecture Version 1.10》是如何定义的。
文档链接:https://riscv.org/specifications/privileged-isa/


PLIC是全局的中断单元,用于I/O设备,入口可以很多个,但上报给CORE的只有一个,也就是多个中断来临时,是有优先级限制的。上图的红色箭头是一些使能位置,后面我会一个个进行说明。
协议中的7.5节规定了ID 0是没有中断的含义,且中断ID值从1开始,当多个优先级相同的中断来临时,ID越小的优先级越高,关于优先级的说明后面会详细分析。
更多关于PLIC的协议内容,大家可以直接查看指令集,我就不在这里说了。
现在我们参考SiFive E3的使用文档来使用rocket-chip的PLIC模块。
首先先看一下rocket-chip的PLIC模块的物理地址,如下图。

可以看出是物理地址是对得上的,那我们直接看E3怎么用就是了。
下面看的是E3关于PLIC的寄存器内容。

具体的寄存器说明大家看文档吧。需要注意的是,pending相关的寄存器是只读的,priorities & enables相关的寄存器复位后为x值,priority thresholds寄存器 为零时允许所有具有非零优先级的中断,而值为7则屏蔽所有中断。claim process & completion寄存器是同一个寄存器。读取0表示没有中断悬挂。非零就说明有中断,且记录当前中断产生中优先级最高的中断ID。对该寄存器写入当前产生中断中最高的中断ID,则说明系统已知道该中断发生,且已处理或丢弃该中断。
接下来介绍的是与中断相关的CSR寄存器。

本文深入解析PLIC中断控制器,探讨其在RISC-V架构中的作用及配置流程。从指令集定义出发,介绍PLIC的工作原理,包括优先级处理、使能配置、寄存器功能等关键概念。并通过实际代码示例,展示如何在SiFive E3平台上使用PLIC处理中断。
最低0.47元/天 解锁文章
1991





