RISC-V MCU中文社区

arty a7 调试蜂鸟E203 的demogpio程序 重复两次进入中断

发表于 开源蜂鸟E203 2020-05-17 09:55:23
6
6143
0

大家好,有个问题想请教一下:

    如题,硬件平台为arty a7,用prebuilt的system.mcs文件,在芯来的IDE中调试demogpio程序,可是发现,每次用button1进入中断后,都是连续进入两次。昨天看公众号,有提到访问device乱序的问题。尝试加了fence的内嵌汇编:

  __asm__ __volatile__(
		"fence"
		  :
		  :
		  :"memory"
  );

可是还是会连续进入两次。有人遇到同样的问题吗?望解答。

喜欢0
用户评论 (6)
  • 威尔罗格

    2021-05-29 15:55:47 威尔罗格 1#

    卢吉凯

    这应该是个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);

    问题解决。

    改了解决不了问题呀,请问具体怎么解决这个问题呢

  • XQQ1989

    2021-04-18 18:04:21 XQQ1989 2#

    柳京伯

    牛逼,这段时间看了一下plic_man的源码,的确是这样的,当icb_rsp_rdata==i的时候cmd通道的握手已经结束了,所以只有第二次进入中断的时候,才能让icb_rsp_rdata和icb_cmd_rd_hsked同时出现

    请问你改了之后解决了吗

  • XQQ1989

    2021-04-18 18:02:01 XQQ1989 3#

    卢吉凯

    这应该是个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);

    问题解决。

    改了还是会进两次中断啊,怎么办

  • 柳京伯

    2020-09-25 01:52:35 柳京伯 4#

    卢吉凯

    这应该是个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);

    问题解决。

    牛逼,这段时间看了一下plic_man的源码,的确是这样的,当icb_rsp_rdata==i的时候cmd通道的握手已经结束了,所以只有第二次进入中断的时候,才能让icb_rsp_rdata和icb_cmd_rd_hsked同时出现

  • 卢吉凯

    2020-07-02 10:43:10 卢吉凯 5#

    这应该是个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);

    问题解决。

  • 领主文

    2020-05-18 09:07:38 领主文 6#

    看公众号好像会专门出一期讲fence的,要不等那篇文章出来了再试一下?

柳京伯

柳京伯 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板