RISC-V 使能、禁止、恢复全局中断

RISC-V的全局中断标志是在mstatus的MIE字段中。所以对全局中断进行操作时,配置MIE字段即可。
RISC-V 使能、禁止、恢复全局中断_第1张图片

禁止中断

#define disable_irq()	do {asm volatile ("csrr mstatus, 0x0");} while(0)

使能中断:

0x8表示mstatus的第3bit,即MIE字段,设置为1表示使能全局中断

#define enable_irq() do {asm volatile ("csrr mstatus, 0x8");} while(0)

不过这种简单粗暴的方法,把MIE之外的其它字段的值也修改了,比如CPU模式等。在支持多种CPU模式的系统中可能存在问题。由于我们目前仅仅支持机器模式(不支持特权模式和用户模式),所以问题倒是不大。MPIE等字段也不受影响。

但是有时候程序进入一段代码的时候我们希望它要关闭中断,但是退出的时候不不希望直接开启中断,而是希望保持之前的状态。比如进入这段程序之前中断是关闭的,进入这段程序之后我们不管它之前是什么状态都要关闭中断,但是退出这段程序之后,我们希望它中断还是保持原来的样子(继续关闭)。
这时我们需要在关闭之前先保存一下中断状态。

保存中断:

#define save_irq() do {asm volatile ("csrr t0, mstatus");} while(0)

保存中断状态并禁止中断:

#define save_and_disable_irq() do {asm volatile ("csrr t0, mstatus"); asm volatile ("csrr mstatus, 0x0");} while(0)

恢复中断:

#define restore_irq() do {asm volatile ("csrr mstatus, t0");} while(0)

你可能感兴趣的:(C,语言,RISC-V,linux)