0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是全局中断?

CHANBAEK 来源:硬件工程师技术干货 作者:硬件工程师技术干 2023-06-14 18:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

什么是全局中断?全局中断使能位控制着“所有”中断,它如果关闭的话会屏蔽其它中断,有人经常关闭它,防止其它中断带来干扰,比如在使用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
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    华大单片机如何开启或关闭全局中断

    华大单片机如何开启或关闭全局中断
    发表于 03-25 13:38

    如何利用STM32CubeMX生成的keil项目如何关闭全局中断

    利用STM32CubeMX生成的keil项目如何关闭全局中断中断相关的函数在哪个头文件里? 如何关闭系统滴答定时器中断
    发表于 05-16 07:52

    ucos3移植到arm上,如何关掉全局中断

    ucos3系统移植到arm-cortex4上,怎么关掉全局中断
    发表于 12-07 20:43

    硬件操作关全局中断

    当对芯片硬件寄存器操作时,关闭全局中断,执行完程序后,再打开全局中断,是否是通用方法,适用于所有微处理器
    发表于 09-05 16:12

    中断向量表里全局中断是什么意思,能解释下吗

    中断向量表里全局中断是什么意思,能解释下吗
    发表于 04-07 21:36

    请问STM32F303VCT6如何关闭全局中断

    STM32F303VCT6如何关闭全局中断
    发表于 02-22 08:12

    在和解nvm驱动程序中禁用全局中断

    通过SYS_INT_.ble()函数禁用全局中断。我的设备有一个LCD显示器,它通过EBI连接,并且通过DMA进程不断更新。此时,当执行NVM块写入操作时,LCD闪烁(一次)。我们希望避免在显示器上出现
    发表于 09-24 13:36

    UCOSiii中断管理中关闭全局中断是什么意思?

    理解这个全局中断时什么意思,[size=13.3333px]包括哪些?另外,在这个图片中,第一个宏定义教程中说,是关闭全局中断,第二个宏定义是不是恢复
    发表于 05-08 03:05

    STM32关全局中断和开全局中断有多种方法

    STM32关全局中断和开全局中断有多种方法,分别操作PRIMASK、FAULTMASK和BASEPRI寄存器。注:完整资料请查看Cortex-M3权威指南中的NVIC与
    发表于 08-13 09:22

    STM32 BootLoader关闭全局中断的过程

    // 关闭全局中断 DISABLE_INT(); // 关闭滴答定时器,复位到默认值 SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->
    发表于 01-18 06:06

    请问ch32v103如何使用全局中断

    在使用arm芯片时有叫做__disable_irq();和__enable_irq();的全局中断方法,请问riscv里面要如何使用这种全局中断
    发表于 06-02 07:14

    中断-CH32V103如何关闭全局中断

    文章来源:https://www.cnblogs.com/wchmcu/p/17717350.html CH32V103相较于其他RISCV芯片,无法关闭全局中断。目前EVT源码工程中只预留了关闭
    发表于 09-26 11:13

    STM32关全局中断的方法 STM32中断类型

    。 STM32中断类型: 系统异常:内核水平 10个 外部中断:外设水平 60个 STM32关全局中断有多种方法,分别操作PRIMASK、FAULTMASK和BASEPRI寄存器。 第
    的头像 发表于 07-22 10:52 2.9w次阅读

    stm8中断中不能随意关闭或使能全局中断

    调试STM8遇到的问题在调试STM8L051的单片机时,使用的多个外部中断,当进入某外部中断中断服务函数后,原来是想进入这个中断时,不再响应其他
    发表于 11-23 17:51 10次下载
    stm8<b class='flag-5'>中断</b>中不能随意关闭或使能<b class='flag-5'>全局</b><b class='flag-5'>中断</b>

    RT-Thread入门学习笔记-熟悉全局中断的操作

    在RT-Thread中,全局中断的操作很多,大家都知道全局中断的【disable】与【enable】
    的头像 发表于 06-07 14:58 3366次阅读
    RT-Thread入门学习笔记-熟悉<b class='flag-5'>全局</b><b class='flag-5'>中断</b>的操作