皋陶 发表于 2020-8-24 11:46:45

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

RISC-V的全局中断标志是在mstatus的MIE字段中。所以对全局中断进行操作时,配置MIE字段即可。
https://img-blog.csdnimg.cn/20200615145537527.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbW9uamll,size_16,color_FFFFFF,t_70禁止中断#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)


页: [1]
查看完整版本: RISC-V 使能、禁止、恢复全局中断