关中断

简介: 关中断

local_irq_enable和local_irq_disable

在单处理器不可抢占系统中,使用local_irq_enable与local_irq_disable是消除异步并发源的有效方式,虽然驱动程序中应该避免使用这两个宏(理山将在本章稍后的内容中给出),但是在spinlock等互斥机制中常常用到这两个宏,所以在此用一节的篇幅来对它们进行介绍。local_irq_enable宏用来打开本地处理器的中断,而local_irq_disable则正好相反,用来关闭处理器的中断。这两个宏的定义如下:

#define local_irq_enable() \
  do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
#define local_irq_disable() \
  do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)

其中trace_hardirqs_on()和trace_hardirqs_off()用做调试,这里重点关注raw_local_irq_enable()和raw_local_irq_disable()。这两个宏的具体实现都依赖于处理器体系架构,不同处理器有不同的指令来启用或者关闭处理器响应外部中断的能力,比如在x86平台上,会最终利用sti和cli指令来分别设置和清除x86处理器中的FLAGS寄存器的IF标志,这样处理器就可以响应或者不响应外部的中断。ARM平台则使用CPSIE指令。

在单处理器不可抢占系统中,如果某段代码要访问某共享资源,那么在进入临界区前使用local_irq_disable来关闭中断,这样在临界区中可保证系统不会出现异步并发源,访问完共享数据在出临界区时,再调用local_irq_enable来启用中断。

local_irq_save与local_irq_restore

local_irq_enable与local_irq_disable还有一种变体,是local_irq_save与local_irq_restore宏定义如下:

#define local_irq_save(flags)       \
  do {            \
    raw_local_irq_save(flags);    \
    trace_hardirqs_off();     \
  } while (0)
#define local_irq_restore(flags)      \
  do {            \
    if (raw_irqs_disabled_flags(flags)) { \
      raw_local_irq_restore(flags); \
      trace_hardirqs_off();   \
    } else {        \
      trace_hardirqs_on();    \
      raw_local_irq_restore(flags); \
    }         \
  } while (0)

这两个宏相对于local_irq_enable与local_irq_disable最大的不同在于,local_irq_save会在关闭中断前,将处理器当前的标志位保存在一个unsigned long flags中,在调用local_irq_restore的时候,再将保存的fla恢复到处理器的FLAGS寄存器中。这样做的目的是,防止在一个中断关闭的环境中因为调用local_irq_disable与local_irq_enable将之前的中断响应状态破坏掉。

在单处理器不可抢占系统中,使用local_irq_enable与local_irq_disable及其变体来对共享数据保护是种简单而有效的方法。但在使用时应该注意,因为local_irq_enable与local_irq_disable是通过关中断的方式进行互斥保护,所以必须确保处于两者之间的代码执行时间不能太长,否则将影响到系统的性能。

目录
相关文章
|
芯片 开发者 SoC
E906的中断系统|学习笔记
快速学习 E906的中断系统
535 0
E906的中断系统|学习笔记
|
4月前
|
6月前
|
存储 传感器
单片机的中断系统
单片机的中断系统
51 1
|
传感器 调度
什么是中断系统?
一、什么是中断系统 中断系统是计算机系统中的一种机制,它允许外部设备和程序请求处理器的注意力,以便进行特定的操作。当一个中断请求被触发时,处理器会暂停当前正在执行的程序,转而执行与中断相关的程序或服务例程。中断系统可以提高计算机系统的效率和响应速度,因为它允许处理器在等待某些事件的同时执行其他任务。常见的中断包括硬件中断(例如键盘输入、鼠标移动、网络数据传输等)和软件中断(例如操作系统调度、系统调用等)。 二、中断系统的特点 中断系统具有以下特点: 1. 实时性:中断系统能够及时响应外部设备的请求,提高计算机系统的响应速度和效率。 2. 可靠性:中断系统能够保证中断请求的可靠性,确保外部设备的
282 0
C中得到4号错误(中断),怎么办
C中得到4号错误(中断),怎么办
86 0
详解中断系统
本文针对地详解了中断系统
265 0
|
芯片
中断系统结构及中断控制详解
本文详解了中断系统结构及中断控制。
508 0
|
芯片
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(一)
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(一)
822 0
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(一)
|
Java
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)
654 0
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)
非中断方式实现按键中断2
非中断方式实现按键中断(二) 宏定义 初始化 按键处理 延迟 主函数
114 0