各位朋友大家好,我最近在使用蜂鸟的板子进行开发时,遇到了这样的问题:我的程序每次运行到使能全局中断的时候,就像进入了死循环一样,出不去了,如上图,首先先打印“GI_EN begin!”这里是可以正常打印的,然后后面那句“GI_EN end!”却打印不出来,我不知道set_csr的代码在哪里,而且书上给的demo_gpio例程中也是直接这么写的,请高人指点一下,非常感谢大家!
在PLIC模块发现了一个bug,不知道是不是你这个问题的原因。可以作如下修改尝试下。
找到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);
谢谢,我等试试
你用的不是Eclipse的编译环境吗? 我用的是Eclipse,这里虽然是条件编译,不过是被编译的。 刚才查了一下编译结果,有点奇怪,编译出来的指令跟这个宏定义不一样,不过功能是对的。可能确实不是在这儿定义的。 我没用过蜂鸟的开发板,是用某品牌国产FPGA的开发板做的,所以有些情况不太了解。水平有限,只能建议你仿真一下看看了>_
好的,谢谢你
你好,我发现虽然encoding.h中对他有定义,但是他是在一个条件编译里面的,并未被编译(请看上图),但是官方给的例程里面却用到了这个宏,不知道他是怎么工作的呢。如果用您的第3点来做的话,直接用那句代码就可以吗,谢谢您的回答。
1,set_csr是encoding.h中的宏定义。
2,这个写法应该没什么问题,至于为什么会卡住,我不能确定,可以仿真一下看看。
3,也可以试试其他指令,比如 __asm__ __volatile__("csrrwi t5, mstatus, 8"); 看看这样能不能写进去。
您好,我试了一下,用汇编也不太行...感觉好莫名其妙啊