linux kernel irq相关函数详解
在Linux内核驱动开发中,处理中断涉及一系列关键函数,正确使用这些函数对确保驱动的稳定性和性能至关重要。以下是disable_irq、free_irq、platform_get_irq和request_irq等函数的详细解析,涵盖其功能、用法、注意事项及示例代码。
一、核心函数详解
1. request_irq:注册中断处理程序
-
功能:申请中断线并绑定中断处理函数。
-
函数原型:
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev_id); -
参数:
-
irq:中断号(通过platform_get_irq获取)。 -
handler:中断处理函数(如irq_handler_t类型)。 -
flags:中断标志(如IRQF_SHARED、IRQF_TRIGGER_RISING)。 -
name:中断名称(在/proc/interrupts中显示)。 -
dev_id:设备标识符(用于共享中断时的唯一标识)。
-
-
返回值:成功返回0,失败返回错误码。
-
示例:
ret = request_irq(irq_num, my_interrupt_handler, IRQF_SHARED, "my_device", dev); if (ret) {pr_err("Failed to request IRQ %d\n", irq_num);return ret; }
2. platform_get_irq:获取平台设备中断号
-
功能:从设备树或平台资源中提取中断号。
-
函数原型:
int platform_get_irq(struct platform_device *dev, unsigned int num); -
参数:
-
dev:平台设备结构体指针。 -
num:中断资源索引(通常为0,表示第一个中断)。
-
-
返回值:成功返回中断号,失败返回负数错误码。
-
示例:
int irq = platform_get_irq(pdev, 0); if (irq < 0) {dev_err(&pdev->dev, "Failed to get IRQ\n");return irq; }
3. free_irq:释放中断资源
-
功能:解除中断处理函数并释放中断线。
-
函数原型:
void free_irq(unsigned int irq, void *dev_id); -
参数:
-
irq:中断号。 -
dev_id:与request_irq时一致的设备标识符。
-
-
注意事项:
-
必须在驱动卸载(如
remove函数)中调用。 -
共享中断时,
dev_id必须唯一匹配。
-
-
示例:
free_irq(irq_num, dev);
4. disable_irq 与 enable_irq:禁用/启用中断
-
功能:临时禁用或重新启用中断线。
-
函数原型:
void disable_irq(unsigned int irq); void enable_irq(unsigned int irq); -
变体:
-
disable_irq_nosync:立即禁用中断,不等待当前处理完成。 -
enable_irq:需与disable_irq成对调用。
-
-
注意事项:
-
多次调用
disable_irq需对应相同次数的enable_irq。 -
避免在中断上下文中调用
disable_irq(可能导致死锁)。
-
-
示例:
disable_irq(irq_num); // 执行关键操作(如修改共享数据) enable_irq(irq_num);
二、使用场景与流程
1. 驱动初始化(Probe函数)
-
获取中断号:通过
platform_get_irq获取硬件中断号。 -
注册中断处理程序:调用
request_irq绑定处理函数。 -
可选配置:设置中断触发方式(如边沿触发)或共享标志。
2. 中断处理函数
-
典型结构:
static irqreturn_t my_interrupt_handler(int irq, void *dev_id) {struct my_device *dev = (struct my_device *)dev_id;// 处理中断逻辑return IRQ_HANDLED; } -
共享中断:需通过
dev_id区分不同设备。
3. 驱动卸载(Remove函数)
-
禁用中断:调用
disable_irq确保中断不再触发。 -
释放中断:通过
free_irq解除注册。 -
清理资源:释放与
dev_id关联的内存。
三、注意事项与最佳实践
1. 内存与资源管理
-
使用
devm_request_irq:自动管理资源,避免free_irq遗漏。int devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev_id); -
错误处理:检查
request_irq和platform_get_irq的返回值。
2. 共享中断处理
-
标志设置:必须使用
IRQF_SHARED。 -
唯一
dev_id:每个设备需提供唯一的标识符(如设备结构体指针)。
3. 中断禁用与同步
-
避免长时间禁用:可能导致中断丢失或系统延迟。
-
自旋锁保护:在中断处理函数中使用自旋锁(
spin_lock)保护共享数据。
四、完整示例代码
平台设备驱动示例
#include <linux/interrupt.h>
#include <linux/platform_device.h>struct my_device {struct device *dev;int irq;
};static irqreturn_t my_interrupt_handler(int irq, void *dev_id) {struct my_device *dev = dev_id;// 处理中断return IRQ_HANDLED;
}static int my_probe(struct platform_device *pdev) {struct my_device *dev;int irq, ret;dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);if (!dev) return -ENOMEM;irq = platform_get_irq(pdev, 0);if (irq < 0) return irq;ret = devm_request_irq(&pdev->dev, irq, my_interrupt_handler,IRQF_SHARED, "my_device", dev);if (ret) return ret;dev->irq = irq;platform_set_drvdata(pdev, dev);return 0;
}static int my_remove(struct platform_device *pdev) {struct my_device *dev = platform_get_drvdata(pdev);disable_irq(dev->irq);// free_irq 由 devm_request_irq 自动处理return 0;
}
五、常见问题解答
1. 为何free_irq需要dev_id参数?
-
唯一标识:确保释放正确的中断处理程序,尤其在共享中断时。
2. disable_irq与disable_irq_nosync的区别?
-
同步性:
disable_irq等待当前中断处理完成;disable_irq_nosync立即禁用。
3. 多次调用disable_irq的影响?
-
计数机制:内核维护禁用计数,需相同次数的
enable_irq重新启用中断。
通过合理使用上述函数,开发者能够高效管理中断资源,确保驱动程序的稳定性和响应能力。实际开发中需结合具体硬件和内核版本调整实现细节。
相关文章:
linux kernel irq相关函数详解
在Linux内核驱动开发中,处理中断涉及一系列关键函数,正确使用这些函数对确保驱动的稳定性和性能至关重要。以下是disable_irq、free_irq、platform_get_irq和request_irq等函数的详细解析,涵盖其功能、用法、注意事项及示例代码。 一、核心函…...
AI调试工具有哪些?
一、深度学习框架专用调试工具 TensorBoard • 功能:实时监控训练指标(损失值、准确率)、可视化神经网络结构、分析参数分布和梯度信息 • 适用框架:TensorFlow、PyTorch(通过插件) • 特点:支持…...
嵌入式设备网络的动态ID分配机制实现
文章目录 前言一、系统设计要点二、核心数据结构2.1 设备唯一标识(DeviceUID)2.2 节点信息(Node)2.3 节点管理器(NodeManager) 三、核心算法实现3.1 初始化与清理3.1.1 初始化节点管理器3.1.2 清理节点管理器 3.2 动态ID分配策略3.2.1 查找最小可用ID3.2.2 ID使用检查 3.3 心跳…...
交易模式革新:Eagle Trader APP上线,助力自营交易考试效率提升
近年来,金融行业随着投资者需求的日益多样化,衍生出了众多不同的交易方式。例如,为了帮助新手小白建立交易基础,诞生了各类跟单社区;而与此同时,一种备受瞩目的交易方式 —— 自营交易模式,正吸…...
健身会员管理系统(ssh+jsp+mysql8.x)含运行文档
健身会员管理系统(sshjspmysql8.x) 对健身房的健身器材、会员、教练、办卡、会员健身情况进行管理,可根据会员号或器材进行搜索,查看会员健身情况或器材使用情况。...
http、https、TLS、证书原理理解,对称加密到非对称加密问题,以及对应的大致流程
http 超文本传输协议 存在问题: 安全性、隐私性、数据完整性 易被中间人(黑客之类的)对数据进行劫持、篡改、隐私泄露 引出了 https (source) http 在网络模型中的应用层 Application > transport > inter…...
捋一遍Leetcode【hot100】的二叉树专题
二叉树专题 除了后面两个,都挺简单 二叉树的中序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int …...
[安全实战]Python程序打包为EXE的安全加固全攻略(加密+混淆+签名)
Python程序打包为EXE的安全加固全攻略 (加密+混淆+签名:三位一体的Python程序保护体系) 摘要 本文深度解析Python程序打包为EXE的全流程安全防护方案,涵盖加密算法选择、代码混淆技术、反逆向工程等核心安全策略。通过典型攻击防护方案、商业级加固方案对比,打造企业级…...
【测试文档】项目测试文档,测试管理规程,测试计划,测试文档模版,软件测试报告书(Word)
原件获取列表: 系统测试方案-2.docx B-Web安全服务渗透测试模板.docx 压力测试报告.docx安全测试用例及解析.docx 测试计划.doc 测试需求规范.doc 测试需求指南.docx 测试用例设计白皮.doc 单元测试报告模板.doc 单元测试计划模板.doc 回归测试指南.doc 集成测试报…...
Linux的联网网络管理攻略
RHEL9版本特点 在RHEL7版本中,同时支持network.service和NetworkManager.service(简称NM)。 在RHEL8上默认只能通过NM进行网络配置,包括动态ip和静态ip,若不开启NM,否则无法使用网络RHEL8依然支持network.service&am…...
Zookeeper三台服务器三节点集群部署(docker-compose方式)
1. 准备工作 - 服务器:3 台服务器,IP 地址分别为 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安装 Docker:确保每台服务器已安装 Docker 和 Docker Compose。 - 网络通信:确保三台服务器之间可以通过 IP 地址互相访问,并开放以下端口: - `2181`:Zookeeper 客户…...
ISO26262-浅谈用例导出方法和测试方法
目录 1 摘要2 测试方法3 测试用例导出方法4 测试方法与用例导出方法的差异和联系5 结论 1 摘要 ISO26262定义了测试方法和用例导出方法,共同保证产品的开发质量。但在刚开始学习ISO26262的时候,又不是非常清晰地理解它俩的区别和联系。本文主要对它俩的…...
Linux上位机开发实践(SoC和MCU的差异)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 soc一般是指跑linux的芯片,而mcu默认是跑rtos的芯片,两者在基本原理方面其实差异不大。只不过,前者由于性能的原…...
【基于Fluent+Python耦合的热管理数字孪生系统开发:新能源产品开发的硬核技术实践】
引言:热管理数字孪生的技术革命 在新能源领域(如动力电池、储能系统、光伏逆变器等),热管理是决定产品性能与安全的核心问题。传统热设计依赖实验与仿真割裂的流程,而数字孪生技术通过实时数据驱动与动态建模…...
ios app的ipa文件提交最简单的方法
ipa文件是ios的app打包后生成的二级制文件,在上架app store connect或做testflight测试的时候,它提示我们需要使用xcode、transporter或xcode命令行等方式来上传。 而xcode、transporter或xcode命令行的安装都需要使用mac电脑,假如没有mac电…...
详细解释浏览器是如何渲染页面的?
渲染流程概述 渲染的目标:将HTML文本转化为可以看到的像素点 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务࿰…...
swift-12-Error处理、关联类型、assert、泛型_
一、错误类型 开发过程常见的错误 语法错误(编译报错) 逻辑错误 运行时错误(可能会导致闪退,一般也叫做异常) 2.1 通过结构体 第一步 struct MyError : Errort { var msg: String } 第二步 func divide(_ …...
如何查看HTTP状态码?
目录 一、HTTP状态码查看方法 1. 浏览器开发者工具 2. 命令行工具 3. 服务器日志分析 二、HTTP状态码分类与核心含义 1. 信息类(1xx) 2. 成功类(2xx) 3. 重定向类(…...
下采样(Downsampling)
目录 1. 下采样的定义与作用 2. 常见下采样方法 (1) 池化(Pooling) (2) 跨步卷积(Strided Convolution) (3) 空间金字塔池化(SPP) 3. PyTorch 实现示例 …...
PostgreSQL 常用客户端工具
PostgreSQL 常用客户端工具 PostgreSQL 拥有丰富的客户端工具生态系统,以下是各类常用工具的详细分类和介绍: 一 图形化客户端工具 1.1 跨平台工具 工具名称特点适用场景许可证pgAdmin官方出品,功能全面开发/运维PostgreSQLDBeaver支持多…...
Nacos安装及数据持久化
1.Nacos安装及数据持久化 1.1下载nacos 下载地址:https://nacos.io/download/nacos-server/ 不用安装,直接解压缩即可。 1.2配置文件增加jdk环境和修改单机启动standalone 找到bin目录下的startup.cmd文件,添加以下语句(jdk路径根据自己…...
ES关系映射(数据库中的表结构)
ES常见数据类型及用途 1. 基础类型 ES类型对应MySQL类型特点示例场景textVARCHAR/TEXT全文分词搜索,默认用标准分词器商品描述、日志内容keywordCHAR/VARCHAR精确匹配,不分词订单号、标签、枚举值(如状态码)longBIGINT64位整数ID、…...
FPGA_YOLO(四)用HLS实现循环展开以及存储模块
Vivado HLS(High-Level Synthesis,高层次综合)是赛灵思(Xilinx)在其 Vivado 设计套件 中提供的一款工具,用于将 高级编程语言(如 C、C、SystemC) 直接转换为 硬件描述语言࿰…...
ASP.NET MVC 实现增删改查(CRUD)操作的完整示例
提供一个完整的 ASP.NET MVC 实现增删改查(CRUD)操作的示例。该示例使用 SQL Server 数据库,以一个简单的 Product 实体为例。 步骤 1:创建 ASP.NET MVC 项目 首先,在 Visual Studio 中创建一个新的 ASP.NET MVC 项目…...
MCP理解笔记及deepseek使用MCP案例介绍
文章目录 一、MCP介绍(1)使用MCP与之前的AI比较(2)原理(3)优点 二、deepseek使用MCP使用案例介绍 一、MCP介绍 全称 模型上下文协议 来源 由Claude母公司Anthropic于24年底开源发布 简介 AI大模型的标准化…...
# 手写数字识别:使用PyTorch构建MNIST分类器
手写数字识别:使用PyTorch构建MNIST分类器 在这篇文章中,我将引导你通过使用PyTorch框架构建一个简单的神经网络模型,用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集,包含了60,000张训练图像和10,000张…...
扩展虚拟机磁盘空间并使其在Linux系统中可用的步骤总结
VMware在虚拟机扩展空间时,若想扩展到150G,那么所在盘的空闲空间须大于150G,否则VM将不允许扩展。 1:确认新磁盘空间是否被识别 使用 lsblk 或 fdisk -l 命令检查 /dev/sda 的大小是否已经更新到新的容量(例如从原来的…...
A股周度复盘与下周策略 的deepseek提示词模板
以下是反向整理的股票大盘分析提示词模板,采用结构化框架数据占位符设计,可直接套用每周市场数据: 请根据一下markdown格式的模板,帮我检索整理并输出本周股市复盘和下周投资策略 【A股周度复盘与下周策略提示词模板】 一、市场…...
dev_set_drvdata、dev_get_drvdata使用详解
在Linux内核驱动开发中,dev_set_drvdata() 及相关函数用于管理设备驱动的私有数据,是模块化设计和数据隔离的核心工具。以下从函数定义、使用场景、示例及注意事项等方面进行详细解析: 一、函数定义与作用 核心函数 dev_set_drvdata() 和 dev…...
数据驱动未来:大数据在智能网联汽车中的深度应用
数据驱动未来:大数据在智能网联汽车中的深度应用 引言 随着智能网联汽车(Intelligent Connected Vehicles,ICV)的快速发展,数据已成为其核心驱动力。从实时交通数据到车辆传感器信息,大数据的深度应用正在让智能汽车更安全、更高效、更智能化。那么,大数据如何赋能智能…...
