嵌入式知识点总结 Linux驱动 (四)-中断-软硬中断-上下半部-中断响应
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。
目录
1.硬中断,软中断是什么?有什么区别?
2.中断为什么要区分上半部和下半部?
3.中断下半部一般如何实现?
4.linux中断的响应执行流程?中断的申请何时执行(何时执行中断处理函数)?

1.硬中断,软中断是什么?有什么区别?
硬中断:由硬件设备触发,响应时间要求非常快,通常用于紧急事件的处理。
软中断:由软件(操作系统)触发,通常用于延迟执行较为复杂的任务,响应时间不如硬中断紧急。

硬中断是由硬件设备触发的中断信号。硬件设备(如定时器、外设、I/O 设备等)在需要 CPU 处理时通过发送中断信号来打断 CPU 正常的指令执行流程。
工作原理
- 当外部硬件设备发生特定事件(如数据到达、硬件状态变化等),硬件会向 CPU 发出中断请求。
- CPU 在执行完当前指令后,会停止当前任务,跳转到相应的中断处理程序(ISR,Interrupt Service Routine)来处理中断请求。
- 中断服务程序(ISR)通常是高优先级的,必须尽可能短小快速地执行,避免占用过多的 CPU 时间。
- 一旦 ISR 执行完成,CPU 会返回到被中断的任务继续执行。
特性
- 由外部硬件触发,属于硬件事件。
- 通常是实时的,必须迅速响应硬件事件。
- 执行时,操作系统无法进行任务调度,因为 CPU 被打断并立即处理中断。
- 硬中断一般是不可预期的,必须确保中断处理的实时性。
常见的硬中断例子
- 外部传感器的数据变化
- 定时器中断
- 外部按钮或输入信号的变化
- 网络接口卡(NIC)数据接收中断

软中断是由软件程序触发的中断,不依赖硬件设备,而是由操作系统或应用程序通过软件指令触发,用来执行某些特定的操作。软中断机制用于延迟处理硬中断后的某些任务,或者用于执行一些高优先级的操作。
工作原理
- 软中断通常是在硬中断处理程序中通过内核代码触发的。在硬中断响应完成后,操作系统会通过软中断将一些较为复杂的任务推迟到稍后的合适时机执行。
- 软中断并不是立即执行的,它依赖操作系统的调度,通常是以工作队列、定时器或其他机制的形式延迟执行。
- 软中断的处理通常发生在内核态,当硬中断处理程序完成后,软中断可能会被执行。
- 软中断的执行优先级通常低于硬中断,但比普通进程的优先级要高。
特性
- 由软件触发,通常是内核或操作系统中的事件。
- 用于延迟处理一些任务,或者处理高优先级的系统工作。
- 不需要硬件支持,完全由软件控制。
- 软中断可以在硬中断处理完成后执行,但不能打断硬中断本身。
常见的软中断例子
- 网络包的处理(网络协议栈的处理)
- 软中断用于管理定时器事件
- 内存管理相关的操作,如虚拟内存分页
- 调度任务(如 Linux 中的任务切换)
| 特性 | 硬中断(Hardware Interrupt) | 软中断(Software Interrupt) |
|---|---|---|
| 触发源 | 外部硬件设备(如传感器、I/O设备、定时器等) | 由内核或操作系统软件触发 |
| 触发方式 | 硬件通过中断信号触发中断 | 通过软件指令或内核操作触发软中断 |
| 优先级 | 高,实时性要求强 | 低于硬中断,但通常比普通进程的优先级高 |
| 执行时间 | 中断处理程序通常需要快速执行,避免占用过多时间 | 软中断可以执行更复杂的操作,不需要立即响应,通常是延迟处理 |
| 响应时机 | 即时响应硬件事件,执行的任务非常紧急 | 在硬中断响应后执行,通常用于处理延迟的操作 |
| 控制方式 | 由硬件和 CPU 控制,通常不能被轻易禁止或改变 | 由操作系统控制,内核可以控制软中断的触发和执行 |
| 中断服务程序(ISR) | 由硬件中断触发的服务程序,通常必须尽可能短小和高效 | 由软件中断触发的服务程序,可能更复杂,处理时间更长 |
| 上下文切换 | 在硬中断处理期间,操作系统无法进行进程调度和上下文切换 | 软中断是在内核模式下执行,操作系统可进行上下文切换 |
| 中断嵌套 | 可以嵌套其他硬中断,但会受到优先级和硬件支持的限制 | 软中断通常无法直接嵌套硬中断,但可以在软中断中调用其他软中断 |

在嵌入式 Linux 中,硬中断和软中断常常是结合使用的。硬中断通常用来快速响应外部硬件事件,而软中断则用于推迟一些复杂的任务,以便在稍后的时间处理,避免阻塞实时的硬中断处理。例如:
- 硬中断:当外部设备(如网络接口卡)接收到数据时,它会触发硬中断,CPU 跳转到中断处理程序,快速处理中断。
- 软中断:硬中断处理完成后,操作系统可能会使用软中断来处理接收到的数据包(例如网络协议栈的处理),因为数据包的处理较为复杂,不能立即进行。
通过这种方式,系统能够保证实时的硬件事件响应,同时又能通过软中断来处理一些相对复杂但又重要的任务。
2.中断为什么要区分上半部和下半部?
Linux中断分为硬件中断和内部中断(异常),调用过程:外部中断产生->发送中断信号到中断控制器->通知处理器产生中断的中断号,让其进一步处理。
对于中断上半部和下半部的产生,为了中断处理过程中被新的中断打断,将中断处理一分为二,上半部登记新的中断,快速处理简单的任务,剩余复杂耗时的处理留给下半部处理,下半部处理过程中可以被中断,上半部处理时不可被中断。
-
上半部(Top Half):
- 上半部是中断的立即响应部分,通常在硬中断发生时会被调用。
- 处理程序在这部分应该尽量简短、高效,避免长时间占用 CPU 和影响其他任务的执行。
- 上半部的主要任务是捕捉并记录中断源,执行一些必要的硬件操作,并尽快返回。它的目标是让中断的响应尽可能快,防止丢失重要的事件或数据。
-
下半部(Bottom Half):
- 下半部是中断的延迟处理部分,它通常在中断处理完毕后,在合适的时机(例如操作系统调度时)被执行。
- 这部分可以执行较为复杂的操作,如数据的处理、任务的调度等。与上半部不同,它可以使用系统调用和进程调度。
- 下半部的处理不需要立刻执行,因此可以延迟执行,以避免长时间占用中断上下文。
| 特性 | 上半部(Top Half) | 下半部(Bottom Half) |
|---|---|---|
| 触发时机 | 由硬中断触发,立即响应硬件事件 | 在上半部处理完成后,由操作系统调度触发 |
| 执行环境 | 在中断上下文中执行,不能进行进程调度、内存分配等 | 在进程上下文中执行,允许进行内存分配、进程调度等复杂操作 |
| 执行任务 | 简单且高效的硬件相关处理,如记录中断源、清除中断标志等 | 复杂的任务处理,如数据处理、协议栈处理等 |
| 优先级 | 高优先级,实时性要求强 | 低于上半部优先级,通常需要在稍后的调度周期中处理 |
| 时间限制 | 必须尽量快速执行,以避免影响其他中断的响应和任务的执行 | 可以较长时间执行,不需要立即响应 |
| 任务内容 | 捕获硬件事件,清除中断标志,快速更新硬件状态,极少操作系统资源 | 数据的进一步处理、内存分配、进程调度、复杂算法等 |
| 中断嵌套 | 不能嵌套处理其他硬中断 | 可能会被其他软中断或工作队列触发 |
| 中断禁用 | 执行期间通常会禁用其他中断,防止中断嵌套 | 不需要禁用其他中断,允许并发执行 |
| 处理方式 | 硬中断处理程序(ISR),必须简短和高效 | 软中断或任务队列,允许较长时间的处理 |
| 处理方式的复杂度 | 较低,主要处理硬件相关的直接操作 | 较高,处理系统级的复杂任务,如内存分配、调度等 |
| 例子 | 网络中断接收数据、定时器中断、外设输入信号处理等 | 网络协议栈处理、内存管理、数据缓冲区清理等 |
3.中断下半部一般如何实现?
在嵌入式 Linux 中,中断的下半部通常用于延迟执行较为复杂的任务,例如数据处理、协议栈处理或其他不适合在硬中断上下文中执行的操作。为了有效地实现下半部的处理,Linux 内核提供了几种常用的机制:软中断(Soft IRQ)、任务队列(Tasklets) 和 工作队列(Work Queues)。这些机制可以让延迟的任务在合适的时机得到执行,从而不影响中断的实时性。想·
1. 软中断(Soft IRQ)
软中断是 Linux 内核中的一种机制,旨在推迟某些中断相关的工作。它是在硬中断处理之后,由内核调度器根据优先级执行的。
使用场景:适用于需要在较高优先级下执行,但又不需要占用过多时间的任务,例如网络协议栈的处理、定时任务的更新等。
实现方式:内核中定义了一些常用的软中断类型,例如网络处理(NET_RX)、定时器处理(TIMER)等。内核根据软中断的类型自动安排其执行。
特点:
软中断在内核上下文中执行,但可以并发执行。
由于软中断是由内核调度的,因此它的执行不需要立刻发生,而是可以推迟到合适的时机。
void my_softirq_handler(struct softirq_action *action)
{// 处理一些延迟任务
}void my_init_softirq(void)
{open_softirq(MY_SOFTIRQ, my_softirq_handler);
}
2. 任务队列(Tasklets)
任务队列是 Linux 中一种轻量级的软中断机制,用于处理比软中断更简单的延迟任务。它本质上是一个与中断相关联的延迟执行函数。
使用场景:适用于需要在中断上下文中执行的复杂任务,但这些任务的执行时间不能过长,且不依赖于系统调度。
实现方式:任务队列是由内核提供的一个高效的机制,用于在软中断上下文中延迟执行任务。
特点:
任务队列函数执行时,不会进行进程上下文的切换,且执行时不会阻塞其他任务。
它是单线程的,一个任务队列的任务执行期间,不会被其他任务打断。
任务队列是按优先级执行的,可以通过 tasklet_schedule() 和 tasklet_hi_schedule() 来调度任务。
static void my_tasklet_func(unsigned long data)
{// 处理延迟任务
}DECLARE_TASKLET(my_tasklet, my_tasklet_func, 0);void my_interrupt_handler(int irq, void *dev_id)
{// 在中断中调度任务tasklet_schedule(&my_tasklet);
}
3. 工作队列(Work Queues)
工作队列是内核提供的机制,它允许在进程上下文中执行任务。工作队列比任务队列更灵活,可以执行复杂的任务,比如内存分配、文件系统操作或其他系统调用。
使用场景:适用于需要执行较长时间的任务,并且这些任务涉及到进程上下文的操作,例如内存分配、文件系统访问等。
实现方式:工作队列可以将任务延迟到调度程序的上下文中执行,因此可以进行较复杂的操作。工作队列有两种形式:普通工作队列和高优先级工作队列,后者通常用于需要快速响应的任务。
特点:
工作队列允许执行阻塞操作,因此适用于需要进程上下文的任务。
可以在进程上下文中执行,可以执行进程调度、内存分配等操作。
工作队列的调度是由内核调度器进行管理,支持多任务并发执行。
struct work_struct my_work;void my_work_function(struct work_struct *work)
{// 处理复杂任务
}INIT_WORK(&my_work, my_work_function);void my_interrupt_handler(int irq, void *dev_id)
{// 在中断中调度工作队列schedule_work(&my_work);
}
| 机制 | 描述 | 适用场景 | 特点 |
|---|---|---|---|
| 软中断(Soft IRQ) | 在硬中断之后由内核调度执行,适用于中断后需要处理的简单任务。 | 网络协议处理、定时任务等 | 实时性较高,但任务较为简单,不涉及进程上下文。 |
| 任务队列(Tasklet) | 延迟执行的中断任务,用于硬中断后的延迟任务处理,具有优先级。 | 需要在中断上下文中执行的复杂任务,不能过长。 | 轻量级、中断上下文执行、任务队列具有较高优先级。 |
| 工作队列(Work Queue) | 延迟执行的任务,在进程上下文中执行,可以进行进程调度和阻塞操作。 | 复杂任务、涉及内存分配、文件系统操作等 | 支持阻塞操作、进程上下文、适合长时间运行的任务。 |
4.linux中断的响应执行流程?中断的申请何时执行(何时执行中断处理函数)?
中断的响应流程:cpu接受中断->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文。
中断的申请request irq的正确位置:应该是在第一次打开、硬件被告知终端之前。
相关文章:
嵌入式知识点总结 Linux驱动 (四)-中断-软硬中断-上下半部-中断响应
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.硬中断,软中断是什么?有什么区别? 2.中断为什么要区分上半部和下半部? 3.中断下半部一般如何实现? 4.linux中断的…...
在ubuntu下一键安装 Open WebUI
该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...
c语言网 1127 尼科彻斯定理
原题 题目描述 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 #include<ios…...
Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析
第一部分:问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…...
吴恩达深度学习——如何实现神经网络
来自吴恩达深度学习,仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归,使用如下的计算图。 如果是多个神经元…...
《STL基础之vector、list、deque》
【vector、list、deque导读】vector、list、deque这三种序列式的容器,算是比较的基础容器,也是大家在日常开发中常用到的容器,因为底层用到的数据结构比较简单,笔者就将他们三者放到一起做下对比分析,介绍下基本用法&a…...
LockSupport概述、阻塞方法park、唤醒方法unpark(thread)、解决的痛点、带来的面试题
目录 ①. 什么是LockSupport? ②. 阻塞方法 ③. 唤醒方法(注意这个permit最多只能为1) ④. LockSupport它的解决的痛点 ⑤. LockSupport 面试题目 ①. 什么是LockSupport? ①. 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作 ②. LockSupport是一个线程阻塞…...
Android开发基础知识
1 什么是Android? Android(读音:英:[ndrɔɪd],美:[ˈnˌdrɔɪd]),常见的非官方中文名称为安卓,是一个基于Linux内核的开放源代码移动操作系统,由Google成立…...
C++ Lambda 表达式的本质及原理分析
目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数,最早在 C11 引入,用于简化函数对象的…...
《多线程基础之条件变量》
【条件变量导读】条件变量是多线程中比较灵活而且容易出错的线程同步手段,比如:虚假唤醒、为啥条件变量要和互斥锁结合使用?windows和linux双平台下,初始化、等待条件变量的api一样吗? 本文将分别为您介绍条件变量在w…...
21款炫酷烟花合集
系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码:Python动漫烟花(完整代码) Python烟花② 完整…...
智能风控 数据分析 groupby、apply、reset_index组合拳
目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum(一个列名) 2. groupby对象…...
Python网络自动化运维---用户交互模块
文章目录 目录 文章目录 前言 实验环境准备 一.input函数 代码分段解析 二.getpass模块 前言 在前面的SSH模块章节中,我们都是将提供SSH服务的设备的账户/密码直接写入到python代码中,这样很容易导致账户/密码泄露,而使用Python中的用户交…...
【JVM】调优
目的: 减少minor gc、full gc的次数,也就是减少STW的时间,因为java虚拟机在做后台垃圾收集线程的时候,会停掉其他线程,专门做垃圾收集,这样会影响网站的性能,以及用户的体验。 调优位置&#x…...
软件测试 —— jmeter(2)
软件测试 —— jmeter(2) HTTP默认请求头(元件)元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组(Stepping Thread Group)参数解析总结 Response Times over TimeActive Thre…...
为什么LabVIEW适合软硬件结合的项目?
LabVIEW是一种基于图形化编程的开发平台,广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面,使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...
【机器学习】自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
一、使用tensorflow框架实现逻辑回归 1. 数据部分: 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。tensorflow框架不需要numpy 数组转换为相应的张量࿰…...
.NET Core缓存
目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存(In-memory cache) 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法: 两种过期时间策略: 绝对过期时间 滑动过期时间 两…...
GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比
GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-LST…...
git Bash通过SSH key 登录github的详细步骤
1 问题 通过在windows 终端中的通过git登录github 不再是通过密码登录了,需要本地生成一个密钥,配置到gihub中才能使用 2 步骤 (1)首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
