禁用中断时的中断处理机制:执行ecall切换模式后中断触发的问题
关于RISC-V中断处理的两个问题解答
1. 当中断被禁用时,中断是如何被处理的?
- 当中断被禁用(比如
sstatus寄存器的SIE位被置0)时,CPU会直接忽略当前触发的中断请求,不会触发中断服务程序(ISR)。 - 未被响应的中断会被硬件中断控制器暂存在挂起寄存器中,保持"待处理"状态。
- 直到中断被重新启用(SIE位被置1),CPU才会在指令执行的间隙检查挂起的中断,按照优先级依次处理。
2. 执行ecall切换至系统模式后触发中断的行为
- 执行
ecall从用户模式进入系统模式时,硬件会自动将sstatus.SIE置0,此时系统模式下中断处于禁用状态。 - 若此时有中断触发,该中断会被标记为挂起,不会打断当前系统模式下的代码执行流程。
- 只有当后续通过
csrs sstatus, 0x00000002这类指令重新置位SIE启用中断后,CPU才会响应这个挂起的中断,进入对应的中断处理流程。 - 如果期间有多个中断触发,硬件会依据预设的中断优先级,在启用后优先处理优先级高的中断。
内容的提问来源于stack exchange,提问作者mdjukan
相关产品推荐
相关产品推荐

