[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 中的相关函数。 但是对于外部设备相关的清中断操作,还是需要我们自己做的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合SpringSecurit,实现ajax的登录、退出、权限校验

1、本文章中SpringBoot整合SpringSecurity&#xff0c;只是基于session方式&#xff0c;并且没有使用到redis。 2、登录、登出都是通过ajax的方式进行。 项目目录&#xff1a; 1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…

FastReport 主子表关系

代码中只需要绑定主表的数据就可以&#xff0c;子表的数据会通过报表中的关连关系自动到数据库中带出。 using CloudSaaS.DB.Handler; using CloudSaaS.Model; using CloudSaaS.DAL; using FastReport; using FastReport.Web; using System; using System.Collections.Generic;…

(2020|ICML PMLR,线性 Transformer,核函数,RNN)Transformer 是 RNN

Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 线性 Transformers 3.1. Transformer 3.2.…

2023、2024国赛web复现wp

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

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL

今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影&#xff0c;顾名思义&#xff0c;该大模型主要是面向写实摄影&#xff0c;一方面生成的图片人物皮肤纹理细节超级逼真&#xff0c;另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…

揭秘Tensor Core黑科技:如何让AI计算速度飞跃

揭秘 Tensor Core 底层&#xff1a;如何让AI计算速度飞跃 Tensor Core&#xff0c;加速深度学习计算的利器&#xff0c;专用于高效执行深度神经网络中的矩阵乘法和卷积运算&#xff0c;提升计算效率。 Tensor Core凭借混合精度计算与张量核心操作&#xff0c;大幅加速深度学习…

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 今天&#xff0c;我们继续了解下来自清华大学发布的两种参数高效微调方法P-Tuning和P-Tuning v2。可以简单的将P-Tuning是认为针对Prompt Tuning的改进…

零基础小白本地部署大疆上云api(个人记录供参考)

文章目录 运行前准备前后端项目运行1.前端项目&#xff1a; 后端项目运行必须先依靠emqx运行必须先依靠redis运行修改后端项目的application.yml文件 运行前准备 1.保证电脑又node.js环境&#xff0c;可以正常使用npm 2.Java的jdk必须是11及以上版本否则无效 3.下载好emqx,red…

《java数据结构》--队列详解

一.认识队列&#x1f431; 初识队列&#x1f638; 队列和栈类似都对数据的存取有着严格的要求&#xff0c;不同的是栈遵循先进后出的原则&#xff0c;而队列遵循先进先出的原则&#xff0c;栈是只有一端可以存取&#xff0c;队列是一端存&#xff0c;一端取。这里我来画一个图…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接开发指南(Android)BridgePlugin】

BridgePlugin (平台桥接) 本模块提供ArkUI端和Android平台端消息通信的功能&#xff0c;包括数据传输、方法调用和事件调用。需配套ArkUI端API使用&#xff0c;ArkUI侧具体用法请参考[Bridge API]。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-…

“2024 亚马逊云科技中国峰会,挑战俱乐部 Hands On 动手实验课程正在直播中,点击链接畅享生成式AI建构之旅,赢心动好礼

只看不过瘾&#xff1f;别急&#xff01;我们为您准备了【生成式AI助手 Amazon Q 初体验】动手实验&#xff0c;一款生成式人工智能 (AI) 支持的对话助理&#xff0c;可以帮助您理解、构建、扩展和操作 Amazon 应用程序&#xff0c;您可以询问有关 Amazon 架构、最佳实践、文档…

马斯克开启军备竞赛,xAI筹集60亿美元

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

ai智能写作怎么样,5款ai写作软件创作文章太棒了

ai智能写作究竟怎么样呢&#xff1f;在当今数字化的时代&#xff0c;AI智能写作正逐渐成为一种引人瞩目的趋势。AI智能写作是指利用人工智能技术来辅助或代替人类进行文本创作的过程。随着人工智能技术的不断发展&#xff0c;AI智能写作在各个领域都呈现出越来越广泛的应用。本…

微服务架构下的‘黑带’安全大师:Spring Cloud Security全攻略!

深入探讨了微服务间的安全通信、安全策略设计以及面对经典安全问题的应对策略。无论你是微服务的新手还是资深开发者&#xff0c;都能在本文中找到提升安全功力的秘籍。让我们一起成为微服务架构下的‘黑带’安全大师&#xff01; 文章目录 1. 引言微服务安全挑战与重要性Sprin…

SHELL编程(三)网络基础命令 Makefile

目标 一、网络基础及相关命令&#xff08;一&#xff09;网络相关命令&#xff08;二&#xff09;重启网络服务 二、Makefile&#xff08;一&#xff09;标签式语法&#xff08;二&#xff09;目标:依赖 式语法1. 格式2. 编译流程&#xff1a;预处理 编译 汇编 链接3. 目标和伪…

Java入门基础学习笔记50——ATM系统

1、项目演示&#xff1b; 2、项目技术实现&#xff1b; 1&#xff09;面向对象编程&#xff1a; 每个账户都是一个对象&#xff0c;所以要设计账户类Account&#xff0c;用于创建账户对象封装账户信息。ATM同样是一个对象&#xff0c;需要设计ATM类&#xff0c;代表ATM管理系…

windows tomcat服务注册和卸载

首页解压tomcat压缩包&#xff0c;然后进入tomcat bin目录&#xff0c;在此目录通过cmd进入窗口&#xff0c; 1&#xff1a;tomcat服务注册 执行命令&#xff1a;service.bat install tomcat8.5.100 命令执行成功后&#xff0c;会在注册服务列表出现这个服务&#xff0c;如果…

基于ssm+vue图书管理系统

基于ssmvue图书管理系统 ssm477图书管理系统 相关技术 javassmmysqlvueelementui

索引下推详情-简单入手

一.概念 索引下推&#xff08;Index Pushdown&#xff09;MySQL5.6添加的&#xff0c;是一种优化技术&#xff0c;用于在查询执行时将部分计算移动到存储引擎层&#xff0c;从而减少数据传输和计算的开销&#xff08;减少回表查询次数&#xff09;&#xff0c;提高查询性能。 …

14、类与对象(采用图解方式分析内存结构)①

在idea中创建一个新文件&#xff0c;名称为Hello.java 其中&#xff0c;Hello就是一个类&#xff0c;main是这个类里面的方法&#xff0c;这意味着我们在学习的时候已经在使用类了。 对象和类 一、概念二、⭐内存分配机制分析Ⅰ、基本内存结构⭐⭐Ⅱ、调用类方法的内存分析&am…