。函数原型如下:

2.4 内核

int request_irq (unsignedintirq,void (*handler)(int,void*,structpt_regs*),unsignedlongfrags,constchar*device,void*dev_id);

2.6 内核

request_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev);

参数说明:

在发生对应于第 1个参数 irq 的中断时,则调用第 2 个参数handler 为要注册的中断服务函数(也就是把 handler() 中断服务函数注册到内核中 )。

第 3 个参数 flags 指定了快速中断或中断共享等中断处理属性。在 2.6 教新的内核里(我的是 2.6.27 ~ 2.6.31 ),在 linux/interrupt.h 中定义操作这个参数的宏如下:

引用

/*

* These correspond to the IORESOURCE_IRQ_* defines in

* linux/ioport.h to select the interrupt line behaviour.  When

* requesting an interrupt without specifying a IRQF_TRIGGER, the

* setting should be assumed to be "as already configured", which

* may be as per machine or firmware initialisation.

#define IRQF_TRIGGER_NONE0x00000000

#define IRQF_TRIGGER_RISING0x00000001

#define IRQF_TRIGGER_FALLING0x00000002

#define IRQF_TRIGGER_HIGH0x00000004指定中断触发类型:高电平有效。新增加的标志#define IRQF_TRIGGER_LOW0x00000008

#define IRQF_TRIGGER_MASK(IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \

IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)

#define IRQF_TRIGGER_PROBE0x00000010

/*

* These flags used only by the kernel as part of the irq handling routines.

*registered first in an shared interrupt is considered for

*                performance reasons)

*/#define IRQF_DISABLED           0x00000020* IRQF_DISABLED - keep irqs disabled when calling the action handler

#define IRQF_SAMPLE_RANDOM      0x00000040* IRQF_SAMPLE_RANDOM - irq is used to feed the random generator

#define IRQF_SHARED             0x00000080* IRQF_SHARED - allow sharing the irq among several devices

#define IRQF_PROBE_SHARED       0x00000100* IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur#define IRQF_TIMER              0x00000200* IRQF_TIMER - Flag to mark this interrupt as timer interrupt

#define IRQF_PERCPU             0x00000400* IRQF_PERCPU - Interrupt is per cpu#define IRQF_NOBALANCING        0x00000800* IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing#define IRQF_IRQPOLL            0x00001000* IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is

早期一点的 2.6 内核这里一般以 SA_ 前缀开头,如:

SA_INTERRUPT   表示禁止其他中断;(对应于 IRQF_DISABLED )

SA_SHIRQ             表示共享相同的中断号 (对应于 IRQF_SHARED )

SA_SAMPLE_RANDOM   此宏会影响到 RANDOM 的处理( 对应于 IRQF_SAMPLE_RANDOM )。

第 4 个参数 name,通常是设备驱动程序的名称。改值用在 /proc/interrupt 系统 (虚拟) 文件上,或内核发生中断错误时使用。

第 5 个参数 dev_id 中断名称 可作为共享中断时的中断区别参数,也可以用来指定中断服务函数需要参考的数据地址。建议将设备结构指针作为dev_id参数

int request_irq(unsigned int irq, irq_handler_t handler,IRQF_SHARED, const char *devname, void *dev_id)

中断共享注册时的注册函数中的dev_id参数

什么是中断共享?

有时候会有这样的情况,如果开发板上中断已经被另外的驱动程序注册中断了,而我现在又想再注册一次这个中断,这就出现了一个中断号不止对应一个中断函数的情况。注意,这里与硬件上的共享中断不一样,这里是指,当一个中断信号来了,基于操作系统,一个中断的到来可以调用多个中断处理程序,与硬件无关。这就需要中断共享。就是一个中断设置成共享,在多个驱动中均设置成共享,中断触发后可以调用到多个中断处理程序。

很多权威资料中都提到,中断共享注册时的注册函数中的dev_id参数是必不可少的,并且dev_id的值必须唯一。那么这里提供唯一的dev_id值的究竟是做什么用的?

根据我们前面中断模型的知识,可以看出发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环

执行所有该中断线上注册的中断处理函数(即irqaction->handler函数)。因此irqaction->handler函数有责

任识别出是否是自己的硬件设备产生了中断,然后再执行该中断处理函数。通常是通过读取该硬件设备提供的中断flag标志位进行判断。那既然kernel循

环执行该中断线上注册的所有irqaction->handler函数,把识别究竟是哪个硬件设备产生了中断这件事交给中断处理函数本身去做,那

request_irq的dev_id参数究竟是做什么用的?

很多资料中都建议将设备结构指针作为dev_id参数。在中断到来时,迅速地根据硬件寄存器中的信息比照传入的dev_id参数判断是否是本设备的中断,若不是,应迅速返回。这样的说法没有问题,也是我们编程时都遵循的方法。但事实上并不能够说明为什么中断共享必须要设置dev_id。

下面解释一下dev_id参数为什么必须的,而且是必须唯一的。

当调用free_irq注销中断处理函数时(通常卸载驱动时其中断处理函数也会被注销掉),因为dev_id是唯一

的,所以可以通过它来判断从共享中断线上的多个中断处理程序中删除指定的一个。如果没有这个参数,那么kernel不可能知道给定的中断线上到底要删除哪

一个处理程序。

注销函数定义在Kernel/irq/manage.c中定义: void free_irq(unsigned int irq, void *dev_id)

返回值:

函数运行正常时返回 0 ,否则返回对应错误的负值。

示例代码片段:

引用

irqreturn_t xxx_interrupt (intirq,void*dev_id)

{

...

return (IRQ_HANDLED);

}

int xxx_open (struct inode *inode,structfile*filp)

{

if (!request_irq (XXX_IRQ,xxx_interruppt,IRQF_DISABLED,"xxx",NULL)){

/*正常注册*/

}

return (0);

}

linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决相关推荐

  1. Linux下zip格式文件的解压缩与压缩操作命令详解

    < Linux下zip格式文件的解压缩与压缩操作命令详解 > * 声明:网上找来比较凌乱,整理了一下,方便自己查看 zip格式文件的解压缩与压缩操作: 1.把/home目录下面的huaza ...

  2. Linux C try 头文件,linux c 头文件

    //1.Linux中一些头文件的作用: #include //ANSI C.提供断言,assert(表达式) #include //GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构 ...

  3. linux非标准头文件,Linux学习:unix的标准化的实现(Linux中各种限制-数据类型-各种标准化头文件介绍)...

    作为Linux的前身,unix标准化是十分重要的.我在这里挑几个重要的点说明. 1:Linux中各种限制.Linux中限制有编译时限制和运行时限制,另外有一些限制是由于我们的实现不同而不同,因此我们需 ...

  4. linux memcpy需要头文件,Linux编程中中各种头文件

    1.unistd.h 是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数.write函数和getpid函数 2.stdlib.h stdl ...

  5. linux c memset 头文件,linux下的memset函数

    起因]希望对各种类型的数组进行初始化,避免野值 memset函数将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化 ...

  6. linux子线程运行的函数_Linux中线程使用详解

    4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...

  7. C++头文件<bits/stdc++.h>详解

    文章目录 前言 基本用法 内容 优点和缺点 优点 缺点 适用环境 前言 最近学了几节c++编程课,发现老师经常在代码第一行敲上一句: #include <bits/c++std.h> 后来 ...

  8. linux默认头文件,Linux安装合适内核头文件的方法

    摘要 腾兴网为您分享:Linux安装合适内核头文件的方法,桌面时钟,中建在线,圆通金刚,西餐菜谱等软件知识,以及万象,我不信表情包,兔子洞,服你网,电商直播app,网络工具箱,ffu文件,电脑功率计算 ...

  9. linux的头文件下载,Linux内核头文件(linux headers)

    更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...

最新文章

  1. 剑指offer_第7题_斐波那契数列
  2. R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来、Overlay two ggplot2 stat_density2d plots
  3. DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)...
  4. 使用next_permutation()的坑,你中招了么?
  5. 第十七节:易混淆的概念(静态和非静态、拆箱和装箱)
  6. 软件测试人员的核心竞争力
  7. 【kafka】produce response correlation id xxx on topic-partition retrying Error: NETWORK_EXCEPTION
  8. android设置自动开关机,Android开发之设置开机自动启动的几种方法
  9. Foxmail添加微软最新outlook.com邮箱解决方案
  10. MySql计算百分比
  11. c++歌手类代码_安卓资源ID修改-游戏发行-切包过程中的R类和Public.xml
  12. win10录屏_不为人知的win10隐藏功能,一键录屏,你还不知道?
  13. 模2除法怎么计算,模2除法最简单的理解
  14. 芯鼎盛LED恒流驱动芯片TX6128设计的DC-DC开关电源降压恒流DEMO说明
  15. 基于深度学习的图像修复
  16. (实测)天猫商城抢购茅台脚本
  17. matlab 线透明度,matlab 曲线填充 透明度
  18. 常见latch闩锁等待
  19. 啊哈添柴挑战Java1016. 反向输出一个三位数
  20. Linux下的打包和解压缩命令

热门文章

  1. 上传本地项目到gitee_用git上传本地文件到码云gitee的方法
  2. action无法传参数给html页面,HTML 解决form表单提交时,action url中参数无效问题
  3. php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案
  4. java null错误事例_java – aspectJ示例中的nullpointer异常
  5. v210 启动脚本分析
  6. res_config_mysql和chan_sip模块的加载分析
  7. 在虚拟机上运行vxWorks
  8. java载屁股针_以前常打的“屁股针”,为何现在很少见了?医生告诉你真实原因...
  9. json返回页面读取data里的值都是object_【一】尤大神都说Vite香,让我来手把手分析Vite原理...
  10. 软件测试需求分析录音,谈一谈软件测试需求分析