Linux 注册线程化的中断处理程序

1. 注册线程化中断处理函数

devmem_request_threaded_irq 是 Linux 内核中的一个函数,用于请求并注册一个线程化的中断处理程序。这个函数允许开发者注册一个中断处理函数,这个函数会在中断发生时被调用,从而实现相应的中断处理逻辑。它通过 devm 机制分配资源,这意味着在设备的生命周期结束时,资源会自动释放,无需手动进行释放,这有助于避免资源泄漏问题。

函数原型如下:

int devm_request_threaded_irq(struct device *dev, unsigned int irq,irq_handler_t handler, irq_handler_t thread_fn,unsigned long irqflags, const char *devname,void *dev_id);static inline int __must_check
devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)
{return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags,devname, dev_id);
}

参数说明:

  • dev: 指向表示设备的 struct device 结构体的指针。
  • irq: 中断号,表示要请求和注册的中断线路。
  • handler: 中断处理程序的主处理函数,它在中断发生时执行。
  • thread_fn: 线程处理函数,它在中断上下文之外以线程化的方式执行,通常用于执行一些比较耗时的操作。
  • irqflags: 中断标志,用于指定中断处理的属性和行为。
  • devname: 设备名称,用于标识中断请求的设备。
  • dev_id: 设备标识符,可以是设备结构体或其他设备特定的标识符。

使用 devmem_request_threaded_irq 可以提高中断处理的效率,特别是在处理高频率中断时,因为它允许将耗时的中断处理逻辑移到一个线程中执行,而不是在中断上下文中直接处理,这样可以减少中断处理时间,提高系统响应速度。

2.为什么要注册一个线程化的中断处理函数?

注册一个线程化的中断处理函数主要是为了提高系统的实时性能和响应性,特别是在实时或嵌入式系统中。线程化中断处理函数与普通中断处理函数的主要区别在于它们的执行环境和处理方式。

  1. 执行环境:普通中断处理函数(也称为中断服务例程,ISR)在中断上下文中执行,这个上下文是不可抢占的,意味着一旦中断发生,CPU会立即暂停当前执行的任务去处理中断,直到ISR执行完毕。这种方式虽然响应速度快,但如果ISR执行时间过长,会阻塞其他中断和任务的执行,影响系统实时性。

  2. 处理方式:线程化的中断处理函数将中断处理分为两部分:快速的硬件中断处理程序(Fast hardware ISR)和线程中断处理程序(Threaded IRQ handler)。硬件ISR负责快速响应中断,执行必要的硬件操作,如确认中断源、禁用中断源等,然后唤醒线程化的中断处理函数。线程化的中断处理函数在独立的线程上下文中运行,可以被抢占,允许其他高优先级任务在必要时抢占执行,从而减少对系统实时性的影响。

  3. 优势:线程化中断处理程序的主要优势在于它们可以被抢占,允许系统在必要时调度其他任务,从而提高系统的响应性和实时性能。此外,线程化中断处理程序可以在线程上下文中使用内核API,如互斥锁等,简化了驱动程序的设计和同步。

  4. 适用场景:线程化中断处理程序适用于那些需要快速响应但处理过程可能较长的中断,如网络数据包处理。通过将耗时的处理逻辑移到线程中,可以减少中断上下文的执行时间,降低对系统实时性的影响。

  5. 实现方式:在Linux内核中,可以通过request_threaded_irq函数来注册线程化的中断处理函数。这个函数允许指定一个硬件ISR和一个线程化的中断处理函数,硬件ISR在中断发生时快速响应,而线程化的中断处理函数在独立的线程中执行。

总的来说,线程化中断处理函数通过将中断处理逻辑分散到不同的执行环境,有助于提高系统的实时性能和响应性,特别是在需要处理大量或复杂中断任务的场景中。

3. request_irq 申请中断

request_irq 是 Linux 内核中用于注册中断处理程序的函数。它允许设备驱动程序请求一个中断号(IRQ),并提供一个中断处理函数(handler),当指定的中断发生时,内核将调用这个处理函数。这个函数通常用于需要处理硬件中断的设备驱动程序中。

函数原型如下:

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id);

参数说明:

  • irq: 指定要分配的中断号。
  • handler: 中断处理函数指针,当中断发生时,系统将调用这个函数。
  • irqflags: 中断处理的属性,可以指定快速中断、中断共享等属性。
  • devname: 设备名称,用于标识中断请求的设备。
  • dev_id: 设备标识符,可以是设备结构体或其他设备特定的标识符,用于在共享中断中区分不同的设备。

使用 request_irq 时,如果返回值是0,则表示申请成功;如果申请不成功,则返回的值非零,一般为负数,可能的取值包括 -EINVAL 表示中断号无效或处理函数指针为NULL,-EBUSY 表示中断已经被占用且不能共享。

此外,request_irq 函数在 2.4 内核和 2.6 内核中都使用,但在 2.6 内核中,需要包含的头文件是 #include <linux/interrupt.h>。在 2.4 内核中,需要包含的头文件是 #include <linux/sched.h>

request_irq 函数的作用是申请使用 IRQ 并注册中断处理程序。当 CPU 接收到中断请求后,可以根据中断号通过 irq_desc[] 找到该设备的中断服务程序。

在共享中断的情况下,dev_id 参数是必需的,并且 dev_id 的值必须唯一。这有助于在共享中断线上区分不同的设备。

request_irq()函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 。

与request_irq() 函数相比request_threaded_irq() 函数仅多了一个入参thread_fn ,thread_fn()为在线程中运行的函数。

Appendix.
irqflags:中断标志,可以在文件 include/linux/interrupt.h 里面查看所有的中断标志,这里我们介绍几个常用的中断标志。

标志描述
IRQF_SHARED多个设备共享一个中断线,共享的所有中断都必须指定此标志。如果使用共享中断的话,request_irq 函数的 dev 参数就是唯一区分他们的标志
IRQF_ONESHOT单次中断,中断执行一次就结束
IRQF_TRIGGER_NONE无触发
IRQF_TRIGGER_RISING上升沿触发
IRQF_TRIGGER_FALLING下降沿触发
IRQF_TRIGGER_HIGH高电平触发
IRQF_TRIGGER_LOW低电平触发
返回值:0 中断申请成功,其他负值 中断申请失败,如果返回-EBUSY 的话表示中断已经被申请了。

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

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

相关文章

MySQL 数据表与索引设计艺术:打造高效数据存取架构

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《MySQL技术精粹》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是MySQL 2、MySQL适用场景 二、MySQL的数据存储与检索 1、数据表…

安卓硬件加速hwui

安卓硬件加速 本文基于安卓11。 从 Android 3.0 (API 级别 11) 开始&#xff0c;Android 2D 渲染管道支持硬件加速&#xff0c;这意味着在 View 的画布上执行的所有绘图操作都使用 GPU。由于启用硬件加速所需的资源增加&#xff0c;你的应用程序将消耗更多内存。 软件绘制&am…

海信116英寸RGB-Mini LED:一朵绽放在科技穹顶的中国花火

东方古镇的打铁花&#xff0c;拉斯维加斯的烟花秀&#xff0c;盛大的花火表演总会在岁末年初的时候&#xff0c;吸引世界各地人们的目光。一年一度的科技展会&#xff0c;也起到烟花秀一样的作用&#xff0c;让人们提前望见未知的精彩。 CES还没开始&#xff0c;CES 2025展会的…

超简单,使用Kube-Vip实现K8s高可用VIP详细教程

具体步骤如下&#xff1a; 以下步骤在其中一个 master 上操作即可&#xff0c; 1、参数配置 export VIP192.168.0.110 export INTERFACEens33 export KVVERSIONv0.8.7VIP 是虚拟IP地址&#xff0c;和主机同一个网段&#xff0c;且未被占用。INTERFACE 是你当前主机的网络接口…

积分漏斗模型中5个指标统计

缘起 最近遇到一个积分漏斗模型的设计&#xff0c;这里记录一下。以防止以后忘记了。其中毕竟关键的属性是&#xff1a; 获得积分可用积分已有积分 积分漏斗模型 这里随着【当前日期】也就是今天日期。随着时间一天天过去&#xff0c;积分也一天天过去。上面那个【填报时间】…

Ubuntu挂载Windows 磁盘,双系统

首先我们需要在终端输入这个命令&#xff0c;来查看磁盘分配情况 lsblk -f 找到需要挂载的磁盘&#xff0c;检查其类型&#xff08; 我的/dev/nvme2n1p1类型是ntfs&#xff0c;名字叫3500winData&#xff09; 然后新建一个挂载磁盘的目录&#xff0c;我的是/media/zeqi/3500wi…

程序血缘分析技术在工商银行软件工程中的应用

当前,随着软件领域技术更新换代速度的日益加快,市场需求也变得更加多样化和个性化,业界普遍通过加速产品迭代来满足客户需求,但在此过程中也暴露出一些研发管理痛点问题,如服务和程序类资产信息分散于各个不同的应用和系统中,信息归集费时费力;设计、开发和测试人员无法…

微信小程序中 隐藏scroll-view 滚动条 网页中隐藏滚动条

在微信小程序中隐藏scroll-view的滚动条可以通过以下几种方法实现&#xff1a; 方法一&#xff1a;使用CSS隐藏滚动条 在小程序的样式文件中&#xff08;如app.wxss或页面的.wxss文件&#xff09;&#xff0c;添加以下CSS代码来隐藏滚动条&#xff1a; scroll-view ::-webkit…

服务器证书不受信任是什么问题?

用户在访问某些网站时&#xff0c;可能会遇到“服务器证书不受信任”的警告。这一问题不仅影响用户的浏览体验&#xff0c;更可能对网站的信誉和安全性产生深远影响。那么服务器证书不受信任是什么问题呢&#xff1f; 服务器证书的基本概念 服务器证书是由证书颁发机构(CA)签…

【AI游戏】使用强化学习玩 Flappy Bird:从零实现 Q-Learning 算法(附完整资源)

1. 引言 Flappy Bird 是一款经典的休闲游戏&#xff0c;玩家需要控制小鸟穿过管道&#xff0c;避免碰撞。虽然游戏规则简单&#xff0c;但实现一个 AI 来自动玩 Flappy Bird 却是一个有趣的挑战。本文将介绍如何使用 Q-Learning 强化学习算法来训练一个 AI&#xff0c;使其能够…

Web渗透测试之XSS跨站脚本攻击 跨域是什么?同源机制又是什么? cors以及Jsonp是什么 一篇文章给你说明白

目录 Cookie的Httponly属性和逃过方式 浏览器同源机制 cors跨域和jsonp跨域和跨域标签 Cors跨域 - 跨源 Jsonp 跨域 jsonp跨域原理&#xff1a; 说明: Cookie的Httponly属性和逃过方式 Xss攻击手段 最常用的目的获取cookie Cookie中设置了 httponlyTrue 方式js操作获…

【C++】字符串的 += 和 + 运算详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;1. 字符串的 和 基本用法1.1 的用法1.2 的用法 &#x1f4af;2. 示例代码的剖析与解释代码分析 &#x1f4af;3. 底层实现与性能分析3.1 的实现原理3.2 的实现原理3.…

CCLINK转MODBUS-TCP协议转换网关模块应用案例

大家好&#xff0c;今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议&#xff0c;它们的不同使得数据互通比较困难&#xff0c;但捷米特JM-CCLK-TCP网关的出现改变了这一切。 为了实现整个生产线的协同工作&#xff0c;需要这些设备之间能够进行有效的数据交换和指令传…

Go学习:多重赋值与匿名变量

1. 变量的多重赋值 1.1 基本语法格式 go语言中&#xff0c;可以将多个赋值语句 合并成 一句&#xff0c;比如&#xff1a; a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以简练成以下格式a, b, c : 10, 20, 30 1.2 交换变量值 当需要交换两个变量的值时&#…

Spring——依赖注入之p命名空间和c命名空间

p命名空间 其实就是Set注入 只不过p命名空间写法更简洁 p可以理解为 property标签的首字母p p命名空间依赖于set方法 依赖引入 使用前需要再配置文件头文件中引入p命名空间的依赖&#xff1a; ** xmlns:p“http://www.springframework.org/schema/p” ** 用法 在bean标签…

HTML-多媒体标签

除了图像&#xff0c;网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素&#xff0c;用于放置视频。如果浏览器支持加载的视频格式&#xff0c;就会显示一个播放器&#xff0c;否则显示<video>内部的子元素。 <video src"example.…

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…

Golang环境配置on Macbook Air M2

Golang环境配置on Macbook Air M2 你好Go配置环境变量验证vscode插件安装将文件夹添加到工作区并保存go包管理 你好Go 去官网下载go的对应版本 配置环境变量 新建配置文件 vim &#xff5e;/.bash_profile #注意号前后不能有空格 export GOPATH/Users/xxxx/xxxxx/Go_Works/…

【Arthas命令实践】heapdump实现原理

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …