嵌入式操作系统进入临界区是否影响中断的接受?

空扰寡人 提交于 2019-12-21 05:52:15

 

在ucos,Freertos中常常会有进入临界区,以保证当前的操作不可被打断,确保操作关键代码的安全。

进入临界区

关键代码操作

假设发生A类型中断

退出临界区

那么A中断还能够接受到吗?
进入临界区,关闭中断,中断发生,打开中断,这个过程中会发生什么呢?

显然,关闭中断期间,CPU不可能去响应中断,再次打开中断的时候,如果在关闭中断期间,发生了中断,发生的中断被记录下来,开启中断时候,中断控制器会再次响应这些被记录的中断。

 

STM32在使用时有时需要禁用全局中断,比如MCU在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。

ARM MDK中提供了如下两个接口来禁用和开启总中断:

__disable_irq();   // 关闭总中断

__enable_irq();    // 开启总中断

但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。所以要想禁止所有中断,必须对逐个模块的中断进行Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在__enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。

引用@http://news.eeworld.com.cn/mcu/2018/ic-news122942734.html

                                                                                                     

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!