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

。函数原型如下:

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);

}

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

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

相关文章

linux缓存文件用户权限错误,Laravel运行缓存权限问题

Laravel 开发中遇到权限问题 failed to open stream: Permission denied错误现象:messg:"file_put_contents(.../storage/framework/cache/data/03/8c/03xxxxxx):failed to open stream: Permission denied"status: 500经过搜索发现网络上大量的解决方案是…

linux误删表空间文件,UNDO表空间下的数据文件被误删除后的处理方法

UNDO表空间下的数据文件被误删除后的处理方法:操作前备份数据库,以避免更大的损失。思路:1、把误删除的数据文件offline2、正常打开数据库后创建新的UNDO表空间及数据文件3、修改相应参数指向新的UNDO表空间4、重新启动数据库验证5、删除旧的…

linux内核有ebpf吗,聊聊很重要的内核技术eBPF

在2018年的 Linux Plumber 大会上,eBPF成了亮点,有24个议题提到了 eBPF,可以预计eBPF会成为一大技术热点。eBPF(Extended Berkeley Packet Filter) 的核心是驻留在 kernel 的高效虚拟机。最初的目的是高效网络过滤框架,前身是 BPF…

linux 访问日志ip排序,Linux通过日志文件统计IP访问次数排序

假设我的日志文件内容如下:218.92.217.53 - - [22/Nov/2017:17:26:27 0800] "GET /images/rand HTTP/1.0" 200 1785 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC…

Linux系统自动备份脚本,供参考的Linux系统中自动执行分段备份脚本

供参考的Linux系统中自动执行分段备份脚本发布时间:2014-04-21 15:49:00来源:红联作者:tioced以下脚本仅做学习参考,需加到/etc/crontab文件,每天执行一次的脚本自动执行分段备份/www/users下的网页文件夹。[code]#!/usr/bin/perl$all_day date;chdir &…

linux+last命令菜鸟,Linux基本命令。。。菜鸟保留

以下命令都是以root身份输入的1.从图形界面进入问文本界面:init 32.从文本界面进入图形界面:startx3.从普通用户进入root用户:su4.进入文件夹:cd /文件路径5.返回上一个文件夹:cd ..6.查看当前位置的文件以及文件夹&am…

嵌入式linux tftp rpm,嵌入式linux的tftp配置

tftp是用来下载远程文件的最简单网络协议,它其于UDP协议而实现。嵌入式linux的 tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。因为u- boot本身内置支持tftp-client,所以嵌…

oom linux 导致ssh,Linux OOM

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?某个机器看到一条日志:Out of Memory: Kill process xxx (xxx) score 707 or sacrifice child并且syslog, ssh等进程都被kill掉了.简单了解了下OOM(Out of Memory)…

linux c 禁止对外通信,Linux C套接字:在recv调用时被阻止

在我的应用程序中,我为简单的http服务器创建了一个线程,然后从我的应用程序中尝试连接到http服务器,但是在recv调用中控件被阻止/挂起.但是,如果尝试使用linux GET命令连接到应用程序的http服务器,则我将成功连接到http服务器.据我对谷歌搜索的了解,我发现这不是正确的方法.但是…

linux 深度v15,[转载]深度Linux发布 V15.9

新增的功能多种手势,轻触即发,针对支持触摸屏设备,支持单击、双击、唤出右键菜单、上下滑动等多种触摸屏手势。搭配屏幕键盘,让您随心所欲,手指点到即得到。随机应变,识变从宜,推出智能镜像源概…

linux arch 包管理,Archlinux使用包管理方式安装MyEclipse

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼PKGBUILD:# Maintainer: alex-no1 # Contributor: alex-no1 pkgnamemyeclipse_realnameeclipsepkgver11.0.1_internal_pkgver3.8.2pkgrel1_date201301310800pkgdesc"An IDE for Java and other languages - 3.8 - simultaneou…

c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...

4.2核心代码/**************************************************************************函数功能:增量PI控制器入口参数:编码器测量值,目标速度返回 值:电机PWM根据增量式离散PID公式pwmKp[e(k)-e(k-1)]Ki*e(k)Kd[e(k)-2e(k-…

c语言编写modbus程序,C语言编写modbus协议

《C语言编写modbus协议》由会员分享,可在线阅读,更多相关《C语言编写modbus协议(23页珍藏版)》请在人人文库网上搜索。1、include / 字地址 0 - 255 (只取低 8位) / 位地址 0 - 255 (只取低 8位)/* CRC 高位字节值表 */ const uint8 code auchCRCHi 0x0…

c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

深度优先搜索算法(Depth First Search)DFS是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还…

c语言 子进程,子Shell和子进程

Shell 中有很多方法产生子进程,比如以新进程的方式运行 Shell 脚本,使用组命令、管道、命令替换等,但是这些子进程是有区别的。子进程的概念是由父进程的概念引申而来的。在 Linux 系统中,系统运行的应用程序几乎都是从 init(pid为…

学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...

原标题:为什么不建议买游戏本?入手前须知,别只看中游戏作为一名游戏本用户,我自己在用的游戏本已经用了四五年的时间了,从最初的大学生到毕业工作2年时间,这一游戏本给我带来了不少麻烦。最大的麻烦就是“笨…

LL1文法的判别c语言,编译原理实验七:LL1文法的判断

《编译原理实验七:LL1文法的判断》由会员分享,可在线阅读,更多相关《编译原理实验七:LL1文法的判断(11页珍藏版)》请在人人文库网上搜索。1、实验七:LL(1)文法的判断 一:要求输入:任意的上下文无…

如何用c语言倒序输出字母,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include void fun (char *ch1, char *ch2){int i, n(0), k;int length;bool judge(true);for (length 0; *(ch1 length) ! \0; length );// 计算ch1长度for (i length - 1; i > 0; i --){if (*(ch1 (length - 1))…

AVR单片机计算器C语言源程序,AVR单片机简单计算器的Proteus仿真实现+源码

#include "mega16.h"#include "1602.h"#include "key.h"float k1,k2; //记录最终输入运算的两个数uint one,two,three,four; //记录每次输入的数字uint flag; //计数标志位uint flag1,flag2; //第一个数 第二…

android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...

本文已授权「刘望舒」微信公众号独家原创发布前言本文将直接使用RxHttp库实现文件上传、下载、断点下载、进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步本文目的在于让更多的读者知道RxHttp库,如果您已阅读上面4篇文…