RISC-V 使能、禁止、恢復全局中斷

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章