之前一直以为 mstatus.MIE 可以用作中断的全局总开关,,仔细看了 spec 才发现并不能
根据下面这说法,,如果程序正在用户模式执行,,然后来了中断,,即使 mstatus.MIE == 0,也会切换到机器模式去执行中断处理函数。。
所以 RISC-V spec 里面并没有一个全局关闭中断的方法,,
查看沁恒驱动库中的 __disable_irq() 实现可以看到,,它是通过地址为 0x800 的 CSR 寄存器实现的,,而这个地址属于“User-Level Custom read/write”区,,也就是说,这是一个芯片厂商自定义的寄存器
RV_STATIC_INLINE void __disable_irq()
{
__asm volatile ("csrw 0x800, %0" : : "r" (0x6000) );
}
离线
在 spec 上找到一个对此问题更清晰的描述
离线
大神能帮解读下吗?下面这个是哪个文档中的?
两个截图都是《The RISC-V Instruction Set Manual Volume II: Privileged Architecture》中的内容
离线
沁恒这个全局中断实际还是mstatus中MIE和MPIE的映射,能在用户模式下操作
那看来在这点上沁恒没有严格遵照规范。。
不过也没啥,,也不一定非要严格遵照规范,,只要最终用起来方便、不会产生逻辑错误就OK
离线