[IMX6ULL驱动开发]-Linux对中断的处理(二)

上一篇文章中,引入了Linux对于中断的一些简略流程以及中断抽象为具体实际形象。此文章主要是继续加深对Linux对中断的处理流程以及一些相应的数据结构。

目录

Linux对中断的扩展:硬件中断、软件中断

多中断处理

中断上下部处理流程

发生中断A,并被中断A打断

发生中断A,并被中断B打断

下半部处理时间过长

Linux中断系统重要的数据结构

irq_desc

irqaction结构体

irq_data结构体

irq_domain 结构体

irq_chip 结构体


Linux对中断的扩展:硬件中断、软件中断

对于像按键等硬件所产生的中断称之为硬件中断,Linux中每一个硬件中断都有一个对应的中断号以及处理函数。可以这么简单的理解,有一个硬件中断函数数组,数组中第几个数据对应第几个中断号,以及对应的中断处理函数。

相应的,也有软件中断,相比于硬件中断,软件中断多了一个flag标志位,用来表示中断是否发生了 。

对于软件中断,只要flag标志位被置为1,那么就表示发生了该软件中断。同时,相比于硬件中断,软件中断的优先级会更低,优先处理的是硬件中断。如下是软件中断的枚举。

那么如何触发软件中断呢,最核心的函数是raise_softirq,它的形参是软件中断号,当设置后,系统会设置改软件中断为待处理状态,等到硬件中断处理完成后,会处理这个软件中断。

void raise_softirq(unsigned int nr);

那如何注册软件中断的处理函数呢,系统使用open_softirq函数,这个函数可以给对应的软件中断注册处理函数。

void open_softirq(int nr, void (*action) (struct soft_action*));

多中断处理

如果一个中断需要消耗过多的时间来处理,那么我们可以把中断分为中断上部和中断下部,中断上部用来处理紧急的中断,下部用来处理非紧急的中断。当我们在中断上部处理紧急的中断的时候,是关闭中断的,当处理完紧急的中断,来到中断下部,此时重新打开中断,处理比较不紧急的中断。

中断上下部处理流程

发生中断A,并被中断A打断

假如发生中断A,中断上半部优先级高首先执行,count首先++,执行完中断后--,此时count为0,进入中断下半部,此时count++,开启中断,此时再次发生中断A打断中断下半部,继续走到步骤1这里,count++,执行中断,count--,此时count等于1,并不会进入中断下半部,而是直接完成处理,此时恢复现场,到步骤7,执行完中断A的下半部,count--,此时count为0。完成完整的中断流程。可见,不管多少个中断,中断上半部和中断下半部是N对1的关系,也就是中断下半部只会执行一次

发生中断A,并被中断B打断

假如发生中断A,中断上半部优先级高首先执行,count首先++,执行完中断后--,此时count为0,进入中断下半部,此时count++,开启中断,此时,B中断打断了A中断的中断下半部,回到步骤1,此时执行的是中断B的中断上半部,count++,执行中断B,count--,此时count等于1,并不会进入中断下半部,而是直接完成处理,此时恢复现场,到步骤7,执行完中断A以及中断B的下半部,count--,此时count为0。完成完整的中断流程。可见,中断下半部的处理是多个中断下半部一起进行处理的,而不是单独处理


下半部处理时间过长

一般来说,中断下半部是用来处理那些比较不重要的软件中断,那么假如中断下半部处理的中断也需要占用非常久的时间怎么办呢。

毕竟还是在中断中,其他进程线程是无法执行的,假如存在GUI的进程,会导致页面卡死。所以,假如中断所需要的时间实在是太耗时了,我们就不使用软件中断来处理,而是使用内核线程来处理,此时中断下半部就是内核线程,和进程一样都有竞争执行的机会

如下为一些系统的内核线程

kworker线程是内核线程的一种,它要去工作队列(work queue)上取出一个个工作(work)来执行,那么我们该怎么把一个个work放在work queue上面呢。

、创建work,先写一个处理函数,在调用函数把这个处理函数填充进work结构体中。

、结构体创建完成了,我们需要把该结构体提交给work queue,一般在中断上半部,调用schedule_work 函数把work交给work queue

、放进后,只需要等线程抢占运行即可,这样中断下半部就可以和其他进程抢占CPU执行,这样就不存在因为中断时间过久导致其他进程过久无法相应

总的来说,对于那些很耗时的中断,我们可以交给内核线程来进行处理,内核线程我们可以看成线程,不当成中断来看待,那对应可以抢占运行,也会休眠


Linux中断系统重要的数据结构

irq_desc

irq_desc结构体的主要内容如下:

每一个 irq_desc 数组项中都有一个函数:handle_irq,还有一个 action 链表。handle_irq为中断处理函数,action链表主要存放各个中断控制器上下级中断的中断处理函数。

外部中断1、中断n共享了B号中断,多个GPIO控制器的中断汇集到GIC的A号中断。当发生了中断,是从左到右依次中断,最后中断掉CPU。

CPU处理的时候,则是从右到左依次进行处理,CPU会首先读取GIC,获取中断号A,调用中断A的handle_irq(irq_desc[A].handle_irq 中断处理函数,BSP工程师提供),获取到发生中断的中断号B,此时调用irq_desc[B]. handle_irq,中断B为共享中断,irq_desc[B]存在一个action链表,里面记录了各个共享中断的外部设备中断函数,一旦确定了中断来自中断B,此时会一一执行中断B中(irq_desc[B])的action链表,把各个B号中断下的外接设备的中断函数一一执行,以此确定到底是哪个外部设备发生了中断。

irqaction结构体

irqaction 结构体存在于irq_desc结构体下,主要的内容如下:

当调用 request_irq、request_threaded_irq 注册中断处理函数时,内核就会构造一个 irqaction 结构体。在里面保存 name、dev_id 等,最重要的 是 handler、thread_fn、thread。

handler 是中断处理的上半部函数,用来处理紧急的事情。 thread_fn 对应一个内核线程 thread,当 handler 执行完毕,Linux内核会唤醒对应的内核线程。在内核线程里,会调用 thread_fn 函数。

irq_data结构体

它就是个中转站,里面有 irq_chip 指针 irq_domain 指针,都是指向别的 结构体。

还有两个成员: irq、hwirq,irq 是软件中断号,hwirq 是硬件中断号。 比如上面我们举的例子,在 GPIO 中断 B 是软件中断号,可以找到 irq_desc[B] 这个数组项;GPIO 里的第 x 号中断,这就是 hwirq。比如说GPIO3的5号引脚中断和GPIO4的5号引脚中断,两个的软件中断号是不同的。

irq_domain结构体中的函数会把hwirq映射为软件中断号irq。

irq_domain 结构体

interrupt-parent = <&gpio1>;

interrupts = <5 IRO_TYPE_EDGE_RISING>;

如上表示 GPIO1的5号引脚,通过上升沿触发中断。此时,hwirq就是5,但是它属于的domain属于GPIO1。

irq_domain 结构体中的如下两个函数用来解析设备树中得到的中断数据:

 xlate :用来解析设备树的中断属性,提取出 hwirq、type 等信息。比如上面举例的,hwirq就是5,type 就是IRO_TYPE_EDGE_RISING

 map :把 hwirq 转换为 irq。

irq_chip 结构体

irq_chip 结构体的主要成员如下:

在 request_irq 创建中断后,并不需要手工去使能中断,原因就是系统调用对 应的 irq_chip 里的函数帮我们使能了中断。

我们提供的中断处理函数中,也不需要执行主芯片相关的清中断操作,也是 系统帮我们调用 irq_chip 中的相关函数。 但是对于外部设备相关的清中断操作,还是需要我们自己做的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Liunx学习随笔

Linux学习随笔 Linux学习随笔一.前期准备1.安装Vmware Workstation软件2.下载linux镜像3.安装操作系统4.配置静态ip5.下载安装远程连接工具 二.语法2.1 linux哲学思想(原则)2.2 小命令 夕阳无限好&#xff0c;只是近黄昏&#xff0c;时隔一年&#xff0c;重新提笔 没有比脚更远…

vue3+arco design通过动态表单方式实现自定义筛选

目录 1.说明 2.示例 3.运行截图 ​编辑 4.总结 1.说明 (1) 本文主要实现通过动态表单的方式实现自定义筛选的功能&#xff0c;用户可以自己添加筛选的项目&#xff0c;筛选条件及筛选内容。 (2) 每个项目的筛选包含筛选项目&#xff0c;筛选条件&#xff0c;筛选方式及筛选…

【算法】位运算算法——只出现一次的数字Ⅱ

题解&#xff1a;只出现一次的数字Ⅱ(位运算算法) 目录 1.题目2.题解&#xff1a;3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 要求&#xff1a;时间复杂度&#xff1a;O(N)&#xff0c;空间复杂度&#xff1a;O(1) 2.题解&#xff1a; 3.代码示例 class Solution {…

20212313 2023-2024-2 《移动平台开发与实践》第6次作业

20212313 2023-2024-2 《移动平台开发与实践》第6次作业 1.实验内容 设计并开发一个语音识别应用系统。 通过使用RecognizerIntent实现语音识别功能&#xff0c;开发一个Android语音识别系统。 2.实验过程 2.1下载语音识别的SDK 这里我们选择的是科大讯飞的语音识别&#…

2024年4月—马克思主义基本原理概论真题及答案解析(上海自考)

目录 1.选择题 2.简答题 3.论述题 1.选择题 2.简答题

aws glue配置读取本地kafka数据源

创建连接时填写本地私有ip地址&#xff0c;选择网络配置 配置任务选择kafka作为数据源 但是执行任务时日志显示连接失败 文档提到只能用加密通信 如果您希望与 Kafka 数据源建立安全连接&#xff0c;请选择 Require SSL connection (需要 SSL 连接)&#xff0c;并在 Kafka priv…

text-embedding 嵌入模型

为什么使用embedding 计算机只能处理数字&#xff0c;但我们希望它能够理解文字、图片或其他形式的数据。这就是embedding的作用。它将这些复杂的数据转换成数字表示&#xff0c;就像给它们贴上了标签一样。这些数字表示不仅保留了原始数据的重要信息&#xff0c;还能在计算机…

【OpenGL手册14】实例化

目录 一、说明 二、实例化 三、实例化数组 四、小行星带 五、完整代码 六、结论 一、说明 实例化渲染&#xff0c;是用少数数据做模板&#xff0c;实现海量物体渲染的手段方法。用实例化渲染&#xff0c;需要对每个实例产生一定描述数据。如何实现&#xff1f;请看本文下…

Vue3实战笔记(36)—粒子特效完成炫酷的404

文章目录 前言404特效总结 前言 昨天介绍了一个粒子特效小例子&#xff0c;不够直观&#xff0c;下面直接实战在自己的项目中实现一个好玩滴。 404特效 更改之前创建好的404.vue: <template><div class"container"><vue-particles id"tspartic…

EXCEL如何自动根据上行内容填充到空格

接上篇文章&#xff0c;经过宏命令后会有空格出现&#xff0c;那么如何自动根据上行内容填充到空格呢&#xff1f; 请看步骤~ ctrl G 选择空值–》定位 -》 按 -》然后等于上一行 -》ctrl enter 一。全选表格&#xff0c; ctrl G 调出界面&#xff0c;选择空值按下定位 …

二分答案思想下的二进制问题

序列合并 题目描述 给定一个长度为 n n n 的非负整数序列 { a n } \{a_n\} {an​}&#xff0c;你可以进行 k k k 次操作&#xff0c;每次操作你选择两个相邻的数&#xff0c;把它们合并成它们的按位或。 形式化地&#xff0c;一次操作中&#xff0c;你选择一个下标 i i …

Transformer模型架构笔记

0. 简介 Transformer是一种用于自然语言处理&#xff08;NLP&#xff09;和其他序列到序列&#xff08;sequence-to-sequence&#xff09;任务的深度学习模型架构&#xff0c;它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制&#xff08;self-attention …

windows中每日定时执行python脚本,解决问题

由于需要一个每天定时执行的任务&#xff0c;所以需要定时启动&#xff0c;网上看了很多方法&#xff0c;感觉不能在python脚本种写个while true 定时执行&#xff0c;占资源不说还不可靠。 最后考虑通过系统工具定时启动&#xff0c;发现linux中有crontab&#xff0c;windows…

JMH304-剑侠情缘2网络版+2017纹饰端+翅膀+单机+外网整理+各种副本

资源介绍&#xff1a; 藏剑-太虚-梁山-杀手堂种树地宫师门纹饰装备长流云阳套等等———– 做登录器联系站长 资源截图&#xff1a; 下载地址

2023、2024国赛web复现wp

2023 Unzip 类型&#xff1a;任意文件上传漏洞 主要知识点&#xff1a;软链接 随便上传一个一句话木马文件&#xff0c;得到一串php代码 根据代码上传zip文件发现进入后还是此页面 代码审计&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);$finfo fin…

Mac免费软件推荐

1. iTerm2 - 功能强大的终端 iTerm2 是一个功能强大且灵活的终端仿真器&#xff08;可替代系统默认终端&#xff09;&#xff0c;适合需要在 macOS 上进行大量终端操作的用户。其丰富的功能和高可定制性使得 iTerm2 成为许多开发者和系统管理员的首选工具。无论是处理多个会话…

基于MyBatisPlus表结构维护工具

SuperTable表结构维护工具 一、简述 用于同步表实体与数据库表结构&#xff0c;同步建表、删改字段、索引&#xff0c;种子数据的工具… 一、开发环境 JDK&#xff1a;JDK8SpringBoot&#xff1a;2.7.2MyBatisPlus: 3.5.6MySQL: 5.7其他依赖&#xff1a;略 二、特性 表结…

5G工业数采网关的功能及工业应用-天拓四方

随着5G技术的不断发展&#xff0c;其在工业领域的应用日益广泛。5G工业数采网关作为连接工业设备与网络的重要枢纽&#xff0c;具备多种功能&#xff0c;为工业自动化、智能制造和智慧工厂提供了强大的支持。本文将详细解析5G工业数采网关的功能&#xff0c;并探讨其在工业领域…

【调试笔记-20240528-Linux-用 OpenWrt-23.05 SDK 编译 frp 软件包】

调试笔记-系列文章目录 调试笔记-20240528-Linux-用 OpenWrt-23.05 SDK 编译 frp 软件包 文章目录 调试笔记-系列文章目录调试笔记-20240528-Linux-用 OpenWrt-23.05 SDK 编译 frp 软件包 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、调试步…

剖析【C++】——类与对象(中)——小白篇—超详解

目录 1.类的6个默认成员函数&#xff1a; 1. 默认构造函数&#xff08;Default Constructor&#xff09; 2. 析构函数&#xff08;Destructor&#xff09; 3. 拷贝构造函数&#xff08;Copy Constructor&#xff09; 4. 拷贝赋值运算符&#xff08;Copy Assignment Operato…