当前位置: 首页 > 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…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...