linux --中断管理 -- irq的自动探测机制

irq自动探测机制

如果一个设备的驱动程序无法确定它说管理的设备的软件中断号irq,此时设备驱动程序可以使用irq的自动探测机制来获取其正在使用的irq。

使用自动探测机制的条件

  1. 内核与驱动,必须共同努力才能完成
  2. 只限于非共享中断的情况

探测前,驱动的设备关联到了某个irq,但是因为设备驱动程序还不清楚是哪个irq,因此无法调用request_irq来向该irq安装中断处理例程,所以对应irq的action为空,下面是一个设备驱动程序的使用示例:
在这里插入图片描述
probe_irq_on和probe_irq_off是内核为驱动程序员设计的两个自动探测的接口函数

irq自动探测的原理描述

在这里插入图片描述

probe_irq_on


/***	probe_irq_on	- begin an interrupt autodetect**	Commence probing for an interrupt. The interrupts are scanned*	and a mask of potential interrupt lines is returned.** 开始探测中断,扫描中断并返回潜在中断线的mask*/
unsigned long probe_irq_on(void)
{struct irq_desc *desc;unsigned long mask = 0;int i;/** quiesce the kernel, or at least the asynchronous portion*/async_synchronize_full();mutex_lock(&probing_active);/** something may have generated an irq long ago and we want to* flush such a longstanding irq before considering it as spurious.*/for_each_irq_desc_reverse(i, desc) {raw_spin_lock_irq(&desc->lock);if (!desc->action && irq_settings_can_probe(desc)) {/** Some chips need to know about probing in* progress:*/if (desc->irq_data.chip->irq_set_type)desc->irq_data.chip->irq_set_type(&desc->irq_data,IRQ_TYPE_PROBE);irq_startup(desc);}raw_spin_unlock_irq(&desc->lock);}/* Wait for longstanding interrupts to trigger. */msleep(20);/** enable any unassigned irqs* (we must startup again here because if a longstanding irq* happened in the previous stage, it may have masked itself)*/for_each_irq_desc_reverse(i, desc) {raw_spin_lock_irq(&desc->lock);if (!desc->action && irq_settings_can_probe(desc)) {desc->istate |= IRQS_AUTODETECT | IRQS_WAITING;if (irq_startup(desc))desc->istate |= IRQS_PENDING;}raw_spin_unlock_irq(&desc->lock);}/** Wait for spurious interrupts to trigger*/msleep(100);/** Now filter out any obviously spurious interrupts*/for_each_irq_desc(i, desc) {raw_spin_lock_irq(&desc->lock);if (desc->istate & IRQS_AUTODETECT) {/* It triggered already - consider it spurious. */if (!(desc->istate & IRQS_WAITING)) {desc->istate &= ~IRQS_AUTODETECT;irq_shutdown(desc);} elseif (i < 32)mask |= 1 << i;}raw_spin_unlock_irq(&desc->lock);}return mask;
}
EXPORT_SYMBOL(probe_irq_on);

probe_irq_off

/***	probe_irq_off	- end an interrupt autodetect*	@val: mask of potential interrupts (unused)**	Scans the unused interrupt lines and returns the line which*	appears to have triggered the interrupt. If no interrupt was*	found then zero is returned. If more than one interrupt is*	found then minus the first candidate is returned to indicate*	their is doubt.**	The interrupt probe logic state is returned to its previous*	value.**	BUGS: When used in a module (which arguably shouldn't happen)*	nothing prevents two IRQ probe callers from overlapping. The*	results of this are non-optimal.*/
int probe_irq_off(unsigned long val)
{int i, irq_found = 0, nr_of_irqs = 0;struct irq_desc *desc;for_each_irq_desc(i, desc) {raw_spin_lock_irq(&desc->lock);if (desc->istate & IRQS_AUTODETECT) {if (!(desc->istate & IRQS_WAITING)) {if (!nr_of_irqs)irq_found = i;nr_of_irqs++;}desc->istate &= ~IRQS_AUTODETECT;irq_shutdown(desc);}raw_spin_unlock_irq(&desc->lock);}mutex_unlock(&probing_active);if (nr_of_irqs > 1)irq_found = -irq_found;return irq_found;
}
EXPORT_SYMBOL(probe_irq_off);

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

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

相关文章

vue3前端开发框架的安全特性,非常适合现在的市场需求

vue3前端开发框架的安全特性,非常适合现在的市场需求&#xff01;现在几乎所有的前端开发&#xff0c;都是使用的vue3做了开发。下面给大家展示一下。为什么说vue3框架自带安全特性呢。 如图&#xff0c;这个是我们在浏览器内看见的&#xff0c;渲染后的数据页面信息。很齐全。…

React中文官网已经搬迁了,原网址内容将不再更新

注意1&#xff1a;React中文官网已经搬迁至-React 官方中文文档&#xff0c;原网址内容将不再更新 注意2&#xff1a;React官网已经将React的定义由“用于构建用户界面的 JavaScript 库”更改为“用于构建 Web 和原生交互界面的库”。

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-5 Canvas 绘制三角形

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>Canvas 绘制三角形</title> </head><body><canvas id"cavsElem">您的浏览器不支持Canvas&#xff0c;请升级浏览器</canvas…

最快最便捷的pytest使用allure测试报告

一、前言 最近通过群友了解到了allure这个报告&#xff0c;开始还不以为然&#xff0c;但还是逃不过真香定律。 经过试用之后&#xff0c;发现这个报告真的很好&#xff0c;很适合自动化测试结果的展示。下面说说我的探索历程吧。 选用的项目为Selenium自动化测试Pytest框架…

k8s的operator基石:controller-runtime源码解析

写在之前 今天开始开更controller-runtime的源码阅读&#xff0c;笔者建议大家在阅读前了解以下知识&#xff0c;可能会帮助大家更好的理解源码逻辑。 1.client-go的基础使用 2. 使用kubebuilder搭建一个简单的controller-runtime环境 3.informer的基本思想 1.源码环境搭建 参…

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理)

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理) 一、代理模式概述1. 生活中的代理案例2. 为什么要使用代理3. 代理模式在 Java 中的应用4. 概述5. 生活中代理图示二、代理的实现方式1. Java 中代理图示2. 静态代理2.1 案例2.2 实现案例2.3 静态代理存在的问题三、动态代理…

SpringBoot的默认组件扫描

本篇博客主要探究&#xff1a;为什么SpringBoot项目中我们没有配置组件扫描的包&#xff0c;为什么它会默认扫描启动类所在的包&#xff1f; 一、访问与启动类所在同一包下的接口 我们先来看一个简单的接口&#xff1a; 我们可以观察到&#xff0c;HelloController这个类处在…

福布斯财富增长榜前十富豪身价暴增3.5万亿!他们致富的秘诀究竟是?

按照《福布斯》最新的数据显示&#xff0c;今年全球前十位财富增长最多的富豪的身家总共增加了4900亿美元&#xff08;约3.5万人民币&#xff09;&#xff0c;大家可能对于3.5万亿没什么概念&#xff0c;但是换算一下&#xff0c;中国一共才14亿人&#xff0c;如果把这3.5万亿平…

jenkins部署(docker)

docker部署&#xff0c;避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…

BUUCTF-Real-[PHP]XXE

目录 1、原理 2、XXE漏洞产生的原因 3、开始复现 paylaod 复现 4、flag 1、原理 XML数据在传输过程中&#xff0c;攻击者强制XML解析器去访问攻击者指定的资源内容&#xff08;本地/远程&#xff09;&#xff0c;外部实体声明关键字SYSTEM会令XML解析器读取数据&#xf…

【Axure教程0基础入门】00Axure9汉化版下载、安装、汉化、注册+01制作线框图

写在前面&#xff1a;在哔哩哔哩上面找到的Axure自学教程0基础入门课程&#xff0c;播放量最高&#xff0c;5个多小时。课程主要分为4个部分&#xff0c;快速入门、动态面板、常用动效、项目设计。UP主账号【Song老师产品经理课堂】。做个有素质的白嫖er&#xff0c;一键三连必…

【C/C++】深入理解--函数重载(什么是函数重载?为什么要有函数重载?)

目录 一、前言 二、 函数重载 &#x1f34e;什么是函数重载 &#x1f350;函数重载的条件 &#x1f347;函数重载的注意点 &#x1f349;为什么要有函数重载 &#x1f353;为何C语言不支持函数重载&#xff0c;反倒C可以&#xff1f; &#x1f4a6; Linux环境下演示函数重…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统&#xff0c;完全依赖代码进行实现&#xff0c;动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标&#xff08;x,y&#xff09; //1秒时间内&#xff0c;移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

基于单片机的烟草干燥温度控制系统设计

摘 要&#xff1a;烟草干燥研究一直备受国内外烟草工作者的重视&#xff0c;在烟草干燥的方法中热风管处理法是利用热空气对流使烟草达到干燥的效果&#xff0c;这样可以控制烟草干燥时的温度&#xff0c;使烟草能够更好更快地干燥&#xff0c;因此温度的检测和控制是很重要的。…

写静态页面——浮动练习

0、效果&#xff1a; 1、html代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>浮动…

C++-类和对象(2)

目录 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 1.对象中包含类的各个成员 ​编辑 2.代码只保存一份&#xff0c;在对象中保存存放代码的地址 ​编辑 3.只保存成员变量&#xff0c;成员函数存放在公共的代码段 ​编辑…

C++进阶(八)红黑树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、红黑树的概念二、红黑树的性质三、红黑树结构四、红黑树的插入操作1、情况一2、情况二3、…

【C++】构造函数和析构函数详解

目录 前言 类中的六个默认成员函数 构造函数 概念 特性 析构函数 概念 特性&#xff1a; 前言 类中的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编…

【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

文章目录 1. 写在前面2. 请求分析3. JS反混淆4. 深度分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

字符串转换const char* , char*,QByteArray,QString,string相互转换,支持中文

文章目录 1.char * 与 const char * 的转换2.QByteArray 与 char* 的转换3.QString 与 QByteArray 的转换4.QString 与 string 的转换5.QString与const string 的转换6.QString 与 char* 的转换 在开发中&#xff0c;经常会遇到需要将数据类型进行转换的情况&#xff0c;下面依…