有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
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)
复制代码
|