RISC-V的全局中斷標誌是在mstatus的MIE字段中。所以對全局中斷進行操作時,配置MIE字段即可。
禁止中斷
#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)