您尚未登录。

楼主 # 2024-04-12 13:51:39

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 238
积分: 299.5

RISC-V 如何实现 __disable_irq()?

之前一直以为 mstatus.MIE 可以用作中断的全局总开关,,仔细看了 spec 才发现并不能

根据下面这说法,,如果程序正在用户模式执行,,然后来了中断,,即使 mstatus.MIE == 0,也会切换到机器模式去执行中断处理函数。。

mstatus.MIE.jpg

所以 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) );
}

离线

楼主 #1 2024-04-15 19:03:58

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 238
积分: 299.5

Re: RISC-V 如何实现 __disable_irq()?

在 spec 上找到一个对此问题更清晰的描述

trap_to_M-mode.jpg

离线

#2 2024-04-15 19:35:24

xiaorui
会员
所在地: 深圳
注册时间: 2022-06-11
已发帖子: 6
积分: 107
个人网站

Re: RISC-V 如何实现 __disable_irq()?

大神能帮解读下吗?下面这个是哪个文档中的?

离线

楼主 #3 2024-04-16 08:56:23

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 238
积分: 299.5

Re: RISC-V 如何实现 __disable_irq()?

xiaorui 说:

大神能帮解读下吗?下面这个是哪个文档中的?

两个截图都是《The RISC-V Instruction Set Manual Volume II: Privileged Architecture》中的内容

离线

#4 2024-04-16 11:55:21

506826164@qq.com
会员
注册时间: 2022-08-07
已发帖子: 46
积分: 71

Re: RISC-V 如何实现 __disable_irq()?

沁恒这个全局中断实际还是mstatus中MIE和MPIE的映射,能在用户模式下操作

离线

楼主 #5 2024-04-16 12:38:56

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 238
积分: 299.5

Re: RISC-V 如何实现 __disable_irq()?

506826164@qq.com 说:

沁恒这个全局中断实际还是mstatus中MIE和MPIE的映射,能在用户模式下操作

那看来在这点上沁恒没有严格遵照规范。。

不过也没啥,,也不一定非要严格遵照规范,,只要最终用起来方便、不会产生逻辑错误就OK

离线

#6 昨天 15:29:05

yl2024
会员
注册时间: 昨天
已发帖子: 2
积分: 2

Re: RISC-V 如何实现 __disable_irq()?

RISC-V 如何实现 __disable_irq()?
https://whycan.com/t_10847.html#p97371

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn