Open rsthnn opened 5 years ago
@rsthnn 这个和PLIC的设置有关,一般PLIC在设置为高电平触发的时候,考虑如下情况:
T时刻PLIC所连接的中断源引脚由低变高,则这个中断源会让plic连接到CPU的信号plic_ext_int = 1,但是此时CPU暂时不能接收这个中断。
T+1时刻CPU处理完了之前的工作,可以接收T时刻产生的中断,但是我们假设实际上中断源在T~T+1中间的时候已经取消了对CPU发送的中断请求,即外设连接到PLIC的中断源引脚由高变低,这种情况下PLIC并不会将发送给CPU的plic_ext_int信号变低,这是PLIC在电平触发设置下的工作特性。所以此时CPU虽然接收到了一个中断请求(plic_ext_int = 1),但是实际上外设是没有发起中断请求的,CPU需要再去读取它控制的外设中的状态寄存器看外设是否真的发起了中断请求。
如果还不理解的话可以去看一下risc-v特权文档1.10版本中对于PLIC的描述,里边说了对于PLIC设置为电平触发时如何使用的问题。
如果用边沿触发(上升或下降)可能就没这种问题,好像很多MCU(比如STM32)在控制外设的时候也大多数用的是边沿触发。
Hi, 各位大牛 我在使用e203 core测试中断时,发现硬件上拉高一个中断之后,软件端响应了两次中断。 软件响应中断的程序是清除中断,在第一响应中断之后,中断源就被清除拉低,但是发现plic模块送到core 的plic_ext_int高电平持续时间较长,中断源被拉低后,但是plic_ext_int依然为高,导致又进入一次中断。
请问在响应中断时,为什么中断源被拉低,但是plic输出到core的plic_ext_int信号却持续高电平呢? 响应中断时需要额外的配置PLIC相关寄存器吗?
确实有这个bug,需要自己修改
这的确是个bug,原因出在PLIC硬件模块,修改方式如下。 找到sirv_plic_man.v文件,定位到行 icb_claim_irq [i] = icb_claim_irq[i] | ((icb_rsp_rdata == i) & icb_cmd_sel_clam & icb_cmd_rd_hsked); 将其中icb_rsp_rdata改成rsp_rdata,也就是 icb_claim_irq [i] = icb_claim_irq[i] | ((rsp_rdata == i) & icb_cmd_sel_clam & icb_cmd_rd_hsked); 问题解决。
Hi, 各位大牛 我在使用e203 core测试中断时,发现硬件上拉高一个中断之后,软件端响应了两次中断。 软件响应中断的程序是清除中断,在第一响应中断之后,中断源就被清除拉低,但是发现plic模块送到core 的plic_ext_int高电平持续时间较长,中断源被拉低后,但是plic_ext_int依然为高,导致又进入一次中断。
请问在响应中断时,为什么中断源被拉低,但是plic输出到core的plic_ext_int信号却持续高电平呢? 响应中断时需要额外的配置PLIC相关寄存器吗?