查看: 811|回复: 0
收起左侧

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

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2020-8-24 11:46:45 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    RISC-V的全局中断标志是在mstatus的MIE字段中。所以对全局中断进行操作时,配置MIE字段即可。
    国内芯片技术交流-RISC-V 使能、禁止、恢复全局中断risc-v单片机中文社区(1)

    禁止中断
    1. #define disable_irq()        do {asm volatile ("csrr mstatus, 0x0");} while(0)
    复制代码
    使能中断:

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

    1. #define enable_irq() do {asm volatile ("csrr mstatus, 0x8");} while(0)
    复制代码

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

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

    保存中断:
    1. #define save_irq() do {asm volatile ("csrr t0, mstatus");} while(0)
    复制代码
    保存中断状态并禁止中断:
    1. #define save_and_disable_irq() do {asm volatile ("csrr t0, mstatus"); asm volatile ("csrr mstatus, 0x0");} while(0)
    复制代码
    恢复中断:
    1. #define restore_irq() do {asm volatile ("csrr mstatus, t0");} while(0)
    复制代码







    上一篇:risc-v 汇编函数与C语言函数相互调用
    下一篇:risc-v 支持spike和qemu虚拟器的一些例程的编译和运行
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-25 11:43 , Processed in 0.713836 second(s), 41 queries .

    快速回复 返回顶部 返回列表