request_irq()、free_irq()

Linux中断——request_irq 目录 linux 中断之irq 前言 中断注册与释放 irq相关 查看/proc/interrupts 查看/proc/stat IRQ Number问题 Handler相关 flag相关 linux 中断之irq 前言 前面一篇文章已经对中断做了一些简单介绍《关于Linux中断一些思考》,但是中断是怎么告诉内核(kernel)的呢?这里我们带着问题去了解一下irq的调用。 所谓中断它其实是硬件产生了一个信号,然后告诉内核要去处理它。Linux处理中断很像用户空间(user . 阅读详情
这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。 
request_irq()调用的定义: 
int request_irq(unsigned int irq, 
void (*handler)(int irq, void *dev_id, struct pt_regs *regs 
),
unsigned long irqflags, 
const char * devname, 
void *dev_id); 

.irq是要申请的硬件中断号。在Intel平台,范围0--15。
.handler是向系统登记的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参数包括硬件中断号,device id,寄存器值。dev_id就是下面的request_irq时传递给系统的参数dev_id。
.irqflags是中断处理的一些属性。比较重要的有SA_INTERRUPT,标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT)。快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有一个SA_SHIRQ属性,设置了以后运行多个设备共享中断。
.
devname 是一个字符串,与该中断相关联的名称,在/proc/interrupt中可看到
.dev_id在中断共享时会用到。一般设置为这个设备的 device结构本身或者NULL,但在注册共享中断时,此参数不能为NULL。中断处理程序可以用dev_id找到相应的控制这个中断的设备,或者用irq2dev_map找到中断对应的设备。 
void free_irq(unsigned int irq,void *dev_id);
arch/*/kernel/irq.c request_irq() enable_irq() and disable_irq() 
PC 体系结构为了方便把一些中断固定下来,所以驱动程序在初始化的时候只 需要简单地请求它的中断。软盘设备驱动程序就是这样:它总是请求中断 6 。但是也可能一个设备驱动程序不知道设备会使用什么中断。对于 PCI 设备驱动程序 
这不是问题,因为它们总是知道它们的中断编号。不幸的是对于 ISA 设备没有什么简单的办法找到它们的中断号码, Linux 允许设备驱动程序探查它们的中断来解决这个问题。首先,设备驱动程序让设备产生中断,然后系统中所有没有分配的中断都允许 
了。这意味着设备等待处理的中断现在会通过可编程中断控制器传递。 Linux 读取中断状态寄存器然后把它的内容返回到设备驱动程序。非 0 的结果表示在探查中发生了一或多个中断。驱动程序现在关闭探查,并禁止所有位分配的中断。如果 
ISA 设备驱动程序成功地找到了它的 IRQ 号,它就可以想平常一样地请求控制它。
Request_irq( ) kmalloc( ) 等要注意的是:在这里申请的资源在注销设备的时候要释放,因为驱动程序是内核的一部分,内核的资源是比较短缺的。注销设备是个反过程,释放资源,撤销映射,总之就是使内核恢复到没有安装过这个设备的状态
诸如以下函数: 
request_irq()/*给给定的中断源安装中断处理程序*/; 
free_irq() /*释放分配给已定中断的内存*/; 
enable_irq() /*调用中断控制函数使给定中断链有效*/ ; 
disable_irq()/*使定义中断链失效*/ 

目标平台中这些函数是必不可少的

notes:据网上资料摘录如下:

request_irq() 函数原型的变化


Linux-2.6.22 中request_irq() 函数原型与之前版本略有改动:

/********************************/
Linux-2.6.22.6
include/linux/irqreturn.h:typedef int irqreturn_t;
include/linux/interrupt.h:typedef irqreturn_t (*irq_handler_t)(int, void *);
kernel/irq/manage.c:int request_irq(
        unsigned int irq,
        irq_handler_t handler,
        unsigned long irqflags, 
        const char *devname,
        void *dev_id)

/********************************/
Linux-2.6.13
include/linux/interrupt.h:typedef int irqreturn_t;
kernel/irq/manage.c:int request_irq(
        unsigned int irq,
        irqreturn_t (*handler)(int, void *, struct pt_regs *),
        unsigned long irqflags, 
        const char * devname, 
        void *dev_id)

/********************************/

onst char *name:与该中断相关联的名称

onst char *name:与该中断相关联的名称,在/proc/interrupt中可看到。

    void *dev:中断服务程序的参数,可以为NULL,但在注册共享中断时,此参数不能为NULL。

,在/proc/interrupt中可看到。

    void *dev:中断服务程序的参数,可以为NULL,但在注册共享中断时,此参数不能为NULL。

11_linux内核中断 一、linux中断简介 1、中断API函数 1)request_irq函数 ​ 在 linux 内核中要想使用某个中断是需要申请的, request_irq 函数用于申请中断, request_irq 函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 request_irq 函数。 request_irq函数会激活 (使能 )中断,所以不需要我们手动去使能中断,函数原型如下: int request_irq(unsigned int irq, irq_handler_t handle 阅读详情

相关推荐

Linux 中断实验

中断:CPU在正常运行期间,由外部或者内部引起的事件,让CPU停下当前正在运行的程序,转而去执行触发其他中断所对应的程序,这就是中断。中断上下文:中断的存在可以极大的提高CPU的运行效率,但是中断会打断内核进程中正常的调度和运行,所以为了保证系统的实时性,中断服务程序必须足够简短,但实际应用中某些中断必须要处理大量的事物,如果这些都在中断服务中完成,则会严重降低中断的实时性,基于这个原因,Linux系统提出把中断服务程序分为两个部分,即中断上文和中断下文。

m0_69211839的博客 937

嵌入式Linux开发26——Linux 中断(万字总结)

文章目录Linux中断简介:1. Linux 中断 API 函数1.1 中断号1.2 request_irq 函数1.3 free_irq 函数1.4 中断处理函数1.5 中断使能与禁止函数2.上半部与下半部2.1 软中断   不管是裸机实验还是 Linux 下的驱动实验,中断都是频繁使用的功能,在裸机中使用中断我们需要做一大堆的工作,比如配置寄存器,使能 IRQ 等等。 Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。 Li

贾贾的博客 8518

[笔记分享] [中断] 中断申请释放以及上下半部

1.1 介绍 Linux将中断分为中断上半部和下半部。上半部用来处理紧急的和硬件操作相关的,此时所有当前中断线都被禁止,包括其它CPU。下半部用来处理能够被允许推迟完成的中断处理部分,此时中断是开启的。上下半部之间的界限依情况划分。 而异常和中断不同,必须考虑时钟的同步,也称同步中断,如除0、缺页等。这里我们只讨论异步中断。 1.2 中断注册/释放 1.2.1 注册函数 request_

Kris Fei's blog 2026

request_irqfree_irq的使用

static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) { return request_threaded_irq(irq, handler, NULL, flags, na...

To_run_away的博客 8883

linux 内核 清中断,Linux内核中ARM中断实现详解request_irq()free_irq()

Request_irq()调用的定义:int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);本文引用地址:http://www.eepw.com.cn...

weixin_31063029的博客 423

中断/IO/DMA

一.中断操作 与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()free_irq()request_irq()的原型为: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long i

快乐的小鸟 3294

中断API之free_irq

const void *free_irq(unsigned int irq, void *dev_id)用于释放一个之前被request_irq申请的中断. static int el3_close(struct net_device *dev) { int ioaddr = dev->base_addr; struct el3_private *lp = netdev_priv(dev);

jason的笔记 2395

Linux(内核剖析):20---中断之中断处理程序(request_irqfree_irq

一、中断处理程序概述 在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序(interrupt handler) 或中断服务例程(interrupt service routine, ISR) 产生中断的每个设备都有一个相应的中断处理程序(本质上中断处理程序通常不是和特定设备关联,而是和特定中断关联,也就是说,如果一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理...

董哥的黑板报 3710

注册注销中断request_irq函数和free_irq函数

在上一篇文章中我们分析了中断的三个结构体irq_desc、irq_chip、irqaction,并且简单分析了中断发生的流程,实际上上述的操作我们是不需要自己实现的,内核已经实现了,我们需要做的是如何去注册一个中断,编写相应的中断处理函数,当中断发生时,内核会自动执行中断处理函数。 当我们想自己写个中断处理程序,去执行自己的代码,就需要写irq_desc->action->handle...

qq_42230338的博客 1294

Linux驱动——中断

在 Linux 内核中要想使用某个中断是需要申请的,request_irq 函数用于申请中断request_irq函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 request_irq 函数。disable_irq函数要等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中断,并且确保所有已经开始执行的中断处理程序已经全部退出。和 tasklet 一样,工作也是需要调度才能运行的,工作的调度函数为 schedule_work,函数原。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3041

Linux驱动开发之Linux内核中的中断处理与等待队列以及相关API和例程分析

中断机制和等待队列在Linux内核中发挥着重要作用,它们的合理利用可以构建出高实时性和高效性的系统。中断编程涉及内核低层操作,需要谨慎处理,但掌握后可以大大提升系统的异步处理能力。

qq_58288010的博客 1724

Linux中断子系统---中断申请request_irq()与中断线程化request_threaded_irq()

一、申请中断request_irq() Linux中使用中断需要先进行申请,申请中断的API函数如下: int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) irq:要申请中断的中断号。 handler:中断处理函数。 name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字。

lihuan680680的博客 1万+
上一篇: Linux内核驱动之GPIO子系统(一)GPIO的使用
下一篇: 完全解析input子系统设备模型之mini2440按键驱动程序
小艾的01
博客等级 码龄14年 121粉丝 33原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值