大家好,有个问题想请教一下:
如题,硬件平台为arty a7,用prebuilt的system.mcs文件,在芯来的IDE中调试demogpio程序,可是发现,每次用button1进入中断后,都是连续进入两次。昨天看公众号,有提到访问device乱序的问题。尝试加了fence的内嵌汇编:
__asm__ __volatile__(
"fence"
:
:
:"memory"
);可是还是会连续进入两次。有人遇到同样的问题吗?望解答。
这应该是个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同时出现
请问你改了之后解决了吗
这应该是个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);
问题解决。
改了还是会进两次中断啊,怎么办
这应该是个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同时出现
这应该是个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);
问题解决。