什么是全局中断?全局中断使能位控制着“所有”中断,它如果关闭的话会屏蔽其它中断,有人经常关闭它,防止其它中断带来干扰,比如在使用GPIO模拟某个时序时,在GPIO传输数据过程中,如果被某个中断干扰,会导致时序不准确问题,通常的做法是关闭全局中断,数据传输完成后打开全局中断,同样在RTOS中对全局变量的保护基本上都使用了全局中断。
;汇编代码如下:
cpsie i ;使能全局中断
cpsid i ;关闭全局中断
为了方便使用,在KEIL编译器中经常使用如下C代码,作用一样的。
__disable_irq();
__enable_irq();
结合一个BUG来解释一下全局中断带来的问题,我们的硬件设计方案是两个处理器UART通讯,由于设计需要传输比较大的数据,必须要提高通讯速率,期望通讯速率能到1.5M,可是速率提上来了,BUG也出来了,表现是两个处理器偶尔通信异常,有数据丢失问题。研究来研究去,确定最终原因就是全局中断惹的祸,在擦写内部Flash中使用了开关全局中断,由于关中断时间较长,导致串口接收FIFO溢出,数据丢失,可是擦写Flash又必须开关中断保护,这可咋整,解决办法:由于我们的通讯协议是一问一答方式,于是把擦写Flash操作移到收到指令之后,发送应答之前,解决了这个通讯问题。
uint8_t FLASH_EraseSector(uint32_t sectorAddress)
{
uint8_t ret;
__disable_irq();
__disable_fault_irq();
ret = EraseSector(NULL, sectorAddress);
__enable_fault_irq();
__enable_irq();
return ret;
}
有朋友说了,RTOS中对全局变量的保护都是用开关总中断,怎么没有问题?可以注意观察一下,在RTOS中,全局中断关闭时间都不是太长,而且严禁出现长时间关中断,严禁出现关中断时间不可控,这样会影响实时性。来说一下什么是时间不可控,其实这种情况有很多种,比如,长链表操作、环形缓冲区操作、循环操作等等。代码举例说一下。
__disable_irq();
//这里的时间不能太长,否则会有潜在风险
__enable_irq();
//例如下面代码:
__disable_irq();
for(i=0;i< Cnt;i++)
{
//太多的循环或者不定次数循环
//这里的时间不能确定
}
__enable_irq();
-
中断
+关注
关注
5文章
912浏览量
43560 -
时序
+关注
关注
5文章
402浏览量
38626 -
keil
+关注
关注
69文章
1224浏览量
171798 -
编译器
+关注
关注
1文章
1669浏览量
51078 -
GPIO
+关注
关注
16文章
1313浏览量
55720
发布评论请先 登录
如何利用STM32CubeMX生成的keil项目如何关闭全局中断?
在和解nvm驱动程序中禁用全局中断
UCOSiii中断管理中关闭全局中断是什么意思?
STM32关全局中断和开全局中断有多种方法
STM32 BootLoader关闭全局中断的过程
请问ch32v103如何使用全局中断?
中断-CH32V103如何关闭全局中断
STM32关全局中断的方法 STM32中断类型
stm8中断中不能随意关闭或使能全局中断

什么是全局中断?
评论