美文网首页
标准库里关闭总中断 2021-05-03

标准库里关闭总中断 2021-05-03

作者: 宜居远控 | 来源:发表于2021-05-03 09:44 被阅读0次

    第一种方法,:操作PRIMASK寄存器

    __set_PRIMASK(0)  /*  使能全局中断 */

    __set_PRIMASK(1)  /* 禁止全局中断*/

    或者

    __enable_irq();    /*  使能全局中断 */

    __disable_irq();  /* 禁止全局中断*/

    (在core_cm3.h和core_cmFunc.h)

    该函数操作的是PRIMASK寄存器,PRIMASK 用于除能在 NMI 和硬 fault 之外的所有异常,它有效地把当前优先级改为 0 (可编程优先级中的最高优先级)。该寄存器可以通过 MRS 和 MSR 以下例方式访问

    1. 关中断

    MOV R0, #1

    MSR PRIMASK, R0

    2. 开中断

    MOV R0, #0

    MSR PRIMASK, R0  

    第二种方法:操作FAULTMASK寄存器

    __set_FAULTMASK(0); /* 使能全局中断*/

    __set_FAULTMASK(1)  /* 禁止全局中断*/

    该函数操作FAULTMASK寄存器,FAULTMASK更绝,它把当前优先级改为‐1。这么一来,连硬fault都被掩蔽了。使用方案

    与PRIMASK的相似。但要注意的是, FAULTMASK会在异常退出时自动清零。

    第三种方法:操作BASEPRI寄存器

    __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)

    该函数操作的是BASEPRI寄存器,在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——只掩蔽优先级低于某一阈值的中断——它们的优先级在数字上大于等于某个数。那么这个数存储在哪里?就存储在BASEPRI中。不过,如果往BASEPRI中写0,则另当别论——BASEPRI将停止掩蔽任何中断。例如,如果你需要掩蔽所有优先级不高于0x60的中断,则可以如下编程:

    __set_BASEPRI(0x60);

    ————————————————

    版权声明:本文为CSDN博主「lanzhounoddles2011」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/working24hours/article/details/88323241

    相关文章

      网友评论

          本文标题:标准库里关闭总中断 2021-05-03

          本文链接:https://www.haomeiwen.com/subject/ynhfdltx.html