当前位置: 首页 > news >正文

嵌入式知识点总结 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 尼科彻斯定理

原题 题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 ​ #include<ios…...

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 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…...

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习&#xff0c;仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归&#xff0c;使用如下的计算图。 如果是多个神经元…...

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…...

LockSupport概述、阻塞方法park、唤醒方法unpark(thread)、解决的痛点、带来的面试题

目录 ①. 什么是LockSupport? ②. 阻塞方法 ③. 唤醒方法(注意这个permit最多只能为1) ④. LockSupport它的解决的痛点 ⑤. LockSupport 面试题目 ①. 什么是LockSupport? ①. 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作 ②. LockSupport是一个线程阻塞…...

Android开发基础知识

1 什么是Android&#xff1f; Android&#xff08;读音&#xff1a;英&#xff1a;[ndrɔɪd]&#xff0c;美&#xff1a;[ˈnˌdrɔɪd]&#xff09;&#xff0c;常见的非官方中文名称为安卓&#xff0c;是一个基于Linux内核的开放源代码移动操作系统&#xff0c;由Google成立…...

C++ Lambda 表达式的本质及原理分析

目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数&#xff0c;最早在 C11 引入&#xff0c;用于简化函数对象的…...

《多线程基础之条件变量》

【条件变量导读】条件变量是多线程中比较灵活而且容易出错的线程同步手段&#xff0c;比如&#xff1a;虚假唤醒、为啥条件变量要和互斥锁结合使用&#xff1f;windows和linux双平台下&#xff0c;初始化、等待条件变量的api一样吗&#xff1f; 本文将分别为您介绍条件变量在w…...

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…...

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…...

Python网络自动化运维---用户交互模块

文章目录 目录 文章目录 前言 实验环境准备 一.input函数 代码分段解析 二.getpass模块 前言 在前面的SSH模块章节中&#xff0c;我们都是将提供SSH服务的设备的账户/密码直接写入到python代码中&#xff0c;这样很容易导致账户/密码泄露&#xff0c;而使用Python中的用户交…...

【JVM】调优

目的&#xff1a; 减少minor gc、full gc的次数&#xff0c;也就是减少STW的时间&#xff0c;因为java虚拟机在做后台垃圾收集线程的时候&#xff0c;会停掉其他线程&#xff0c;专门做垃圾收集&#xff0c;这样会影响网站的性能&#xff0c;以及用户的体验。 调优位置&#x…...

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…...

为什么LabVIEW适合软硬件结合的项目?

LabVIEW是一种基于图形化编程的开发平台&#xff0c;广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面&#xff0c;使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...

【机器学习】自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

一、使用tensorflow框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。tensorflow框架不需要numpy 数组转换为相应的张量&#xff0…...

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存&#xff08;In-memory cache&#xff09; 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法&#xff1a; 两种过期时间策略&#xff1a; 绝对过期时间 滑动过期时间 两…...

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 不再是通过密码登录了&#xff0c;需要本地生成一个密钥&#xff0c;配置到gihub中才能使用 2 步骤 &#xff08;1&#xff09;首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…...

《企业应用架构模式》笔记

领域逻辑 表模块和数据集一起工作-> 先查询出一个记录集&#xff0c;再根据数据集生成一个&#xff08;如合同&#xff09;对象&#xff0c;然后调用合同对象的方法。 这看起来很想service查询出一个对象&#xff0c;但调用的是对象的方法&#xff0c;这看起来像是充血模型…...

深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile

深入理解 C 语言函数指针的高级用法 函数指针是 C 语言中极具威力的特性&#xff0c;广泛用于实现回调、动态函数调用以及灵活的程序设计。然而&#xff0c;复杂的函数指针声明常常让即使是有经验的开发者也感到困惑。本文将从函数指针的基本概念出发&#xff0c;逐步解析复杂…...

【JavaSE】图书管理系统

前言&#xff1a;为了巩固之前学习的java知识点&#xff0c;我们用之前学习的java知识点&#xff08;方法&#xff0c;数组&#xff0c;类和对象&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff0c;抽象类&#xff0c;接口&#xff09;来实现一个简单的图书管理系统…...

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时&#xff0c;从编码字符串中 每次读取一个字符 &#xff0c;并采取以下步骤&#xff1a; 如果所读的字符是…...

C++/stack_queue

目录 1.stack 1.1stack的介绍 1.2stack的使用 练习题&#xff1a; 1.3stack的模拟实现 2.queue的介绍和使用 2.1queue的介绍 2.2queue的使用 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2priority_queue的使用 欢迎 1.stack 1.1stack…...

浅谈APP之历史股票通过echarts绘图

浅谈APP之历史股票通过echarts绘图 需求描述 今天我们需要做一个简单的历史股票收盘价格通过echarts进行绘图&#xff0c;效果如下&#xff1a; 业务实现 代码框架 代码框架如下&#xff1a; . 依赖包下载 我们通过网站下载自己需要的涉及的图标&#xff0c;勾选之后进…...

Ubuntu 20.04 x64下 编译安装ffmpeg

试验的ffmpeg版本 4.1.3 本文使用的config命令 ./configure --prefixhost --enable-shared --disable-static --disable-doc --enable-postproc --enable-gpl --enable-swscale --enable-nonfree --enable-libfdk-aac --enable-decoderh264 --enable-libx265 --enable-libx…...

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…...

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验&#xff0c;我自身也在不断的学习当中&#xff0c;如果文章有写的不对的地方&#xff0c;欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…...

三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗

三星手机的人脸识别解锁功能默认需要滑动或点击屏幕来解锁。这是为了增强安全性&#xff0c;防止误解锁的情况。如果希望在检测到人脸后直接进入主界面&#xff0c;可以通过以下设置调整&#xff1a; 打开设置&#xff1a; 进入三星手机的【设置】应用。 进入生物识别和安全&a…...