Skip to content
This repository has been archived by the owner on Mar 24, 2021. It is now read-only.

一次硬件中断被响应多次 #19

Open
rsthnn opened this issue Jan 24, 2019 · 3 comments
Open

一次硬件中断被响应多次 #19

rsthnn opened this issue Jan 24, 2019 · 3 comments

Comments

@rsthnn
Copy link

rsthnn commented Jan 24, 2019

Hi, 各位大牛
我在使用e203 core测试中断时,发现硬件上拉高一个中断之后,软件端响应了两次中断。
软件响应中断的程序是清除中断,在第一响应中断之后,中断源就被清除拉低,但是发现plic模块送到core 的plic_ext_int高电平持续时间较长,中断源被拉低后,但是plic_ext_int依然为高,导致又进入一次中断。

请问在响应中断时,为什么中断源被拉低,但是plic输出到core的plic_ext_int信号却持续高电平呢?
响应中断时需要额外的配置PLIC相关寄存器吗?

@hyf6661669
Copy link

hyf6661669 commented Feb 6, 2019

@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设置为电平触发时如何使用的问题。

image

如果用边沿触发(上升或下降)可能就没这种问题,好像很多MCU(比如STM32)在控制外设的时候也大多数用的是边沿触发。

@xiaojia102003
Copy link

Hi, 各位大牛
我在使用e203 core测试中断时,发现硬件上拉高一个中断之后,软件端响应了两次中断。
软件响应中断的程序是清除中断,在第一响应中断之后,中断源就被清除拉低,但是发现plic模块送到core 的plic_ext_int高电平持续时间较长,中断源被拉低后,但是plic_ext_int依然为高,导致又进入一次中断。

请问在响应中断时,为什么中断源被拉低,但是plic输出到core的plic_ext_int信号却持续高电平呢?
响应中断时需要额外的配置PLIC相关寄存器吗?

确实有这个bug,需要自己修改

@lujikai
Copy link

lujikai commented Jul 2, 2020

这的确是个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);
问题解决。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants