原文网址:http://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086100.html

1.Linux中断的注册与释放:

在<linux/interrupt.h>, , 实现中断注册接口:

int request_irq(unsigned int irq,

irqreturn_t (*handler)(int, void *,

struct pt_regs *),

unsigned long flags,

const char *dev_name,

void *dev_id);

void free_irq(unsigned int irq, void *dev_id);

函数参数说明

unsigned int irq:所要注册的中断号

irqreturn_t (*handler)(int, void *, struct pt_regs *):中断服务程序的入口地址。

unsigned long flags:与中断管理有关的位掩码选项,有三组值:

1. SA_INTERRUPT :快速中断处理程序,当使用它的是后处理器上所有的其他中断都被禁用。

2. SA_SHIRQ :该中断是在设备之间可共享的

3. SA_SAMPLE_RANDOM :这个位表示产生的中断能够有贡献给 /dev/random

和 /dev/urandom 使用的加密池.(此处不理解)

const char *dev_name:设备描述,表示那一个设备在使用这个中断。

void *dev_id:用作共享中断线的指针. 它是一个独特的标识, 用在当释放中断线时以及可能还被驱动用来指向它自己的私有数据区(来标识哪个设备在中断) 。这个参数在真正的驱动程序中一般是指向设备数据结构的指针.在调用中断处理程序的时候它就会传递给中断处理程序的void *dev_id。(这是我的理解)如果中断没有被共享, dev_id 可以设置为 NULL, 但是使用这个项指向设备结构不管如何是个好主意. 我们将在"实现一个处理"一节中看到 dev_id 的一个实际应用。

中断号的查看可以使用下面的命令:“cat /proc/interrupts”。

/proc/stat 记录了几个关于系统活动的低级统计量, 包括(但是不限于)自系统启动以来收到的中断数. stat 的每一行以一个文本字串开始, 是该行的关键词; intr 标志是我们在找的.

第一个数是所有中断的总数, 而其他每一个代表一个单个 IRQ 线, 从中断 0 开始. 所有的计数跨系统中所有处理器而汇总的. 这个快照显示, 中断号 4 已使用 1 次, 尽管当前没有安装处理. 如果你在测试的驱动请求并释放中断在每个打开和关闭循环, 你可能发现 /proc/stat 比 /proc/interrupts 更加有用.

以下是一个统计中断时间间隔的中断服务程序。

irqreturn_t short_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

static long mytime=0;

static int i=0;

struct net_device *dev=(struct net_device *)dev_id;

if(i==0){

mytime=jiffies;

}else

if(i<20){

mytime =jiffies- mytime;

printk("Request on IRQ %d time %d\n",irq , mytime);

mytime=jiffies;

printk("Interrupt on %s -----%d \n",dev->name,dev->irq);

}

i ;

return IRQ_HANDLED;

}

这个函数实现的只是对两次发生中断的时间间隔的统计,时间单位是毫秒

函数参数说明:int irq :在这里很明显传递过来的是中断号

void *dev_id :这个传递来的是设备的id号,可以根据这个设备id号得到相应设备的数据结构,进而的到相应设备的信息和相关数据。下面以提取网路数据为例来说明一下。

struct net_device *dev=( struct net_device *)dev_id; (这里的dev_id的值是注册中断的时候宏传递过来的,是注册中断函数的最后一个参数。特别说明)

在这之后就可以用dev->name; dev->irq;等得到网络设备的信息了,当然提取ip数据报还得进行一些其它的工作。

struct pt_regs *regs :它指向一个数据结构,此结构保存的是中断之前处理器的寄存器和状态。主要用在程序调试。

关于中断处理函数的返回值:中断程序的返回值是一个特殊类型—irqreturn_t。但是中断程序的返回值却只有两个—IRQ_NONE和IRQ_HANDLED。

/* irqreturn.h */

#ifndef _Linux_IRQRETURN_H

#define _Linux_IRQRETURN_H

typedef int irqreturn_t;

/*

* For 2.4.x compatibility, 2.4.x can use

*

* typedef void irqreturn_t;

* #define IRQ_NONE

* #define IRQ_HANDLED

* #define IRQ_RETVAL(x)

*……此处我删去了部分关紧要的内容

* To mix old-style and new-style irq handler returns.

*

* IRQ_NONE means we didn't handle it.

* 中断程序接收到中断信号后发现这并不是注册时指定的中断原发出的中断信号.

*此时返回次值

* IRQ_HANDLED means that we did have a valid interrupt and handled it.

* 接收到了准确的中断信号,并且作了相应正确的处理

* IRQ_RETVAL(x) selects on the two depending on x being non-zero (for handled)

*/

#define IRQ_NONE (0)

#define IRQ_HANDLED (1)

#define IRQ_RETVAL(x) ((x) != 0) //这个宏只是返回0或非0

#endif

以上是在Linux/irqreturn.h中的内容,我加了一定的注释.我想是可以说明问题的

转载于:https://www.cnblogs.com/wi100sh/p/4875080.html

【转】Linux中断处理学习笔记相关推荐

  1. 【转载】Linux中断处理学习笔记

    1.Linux中断的注册与释放: 在<linux/interrupt.h>, , 实现中断注册接口: int request_irq(unsigned int irq, irqreturn ...

  2. linux系统管理学习笔记之三----软件的安装

    linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02 标签:linux 系统管理 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  3. linux系统管理学习笔记之一-------linux解压缩命令

    linux系统管理学习笔记之一-------linux解压缩命令 2009-12-29 11:52:55 标签:linux tar [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接 ...

  4. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

  5. linux系统管理学习笔记之八---进程与作业的管理

    linux系统管理学习笔记之八---进程与作业的管理 2010-01-05 13:00:42 标签:linux 进程 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  6. linux系统管理学习笔记之八---linux文件与目录的管理及权限

    linux系统管理学习笔记之八---linux文件与目录的管理及权限 2010-01-05 09:00:49 标签:权限 管理 文件目录 linx [推送到技术圈] 版权声明:原创作品,允许转载,转载 ...

  7. 韩顺平Linux教程学习笔记

    Linux系统学习笔记   新装了deepin v23系统,结果磁盘没设置好,玩崩了,百度半天修复不了,看看韩顺平老师的Linux操作课程,做做笔记(只记录对自己有用的).   B站网址 基础篇·Li ...

  8. Linux操作系统学习笔记【入门必备】

    Linux操作系统学习笔记[入门必备] 文章目录 Linux操作系统学习笔记[入门必备] 1.Linux入门 2.Linux目录结构 3.远程登录 3.1 远程登录Linux-Xshell5 3.2 ...

  9. 【韩顺平Linux】学习笔记1

    [韩顺平Linux]学习笔记1 一.网络连接的三种方式 二.虚拟机克隆 三.虚拟机快照 四.虚拟机迁移和删除 五.VMtools 六.Linux目录结构 七.远程登录和文件传输 一.网络连接的三种方式 ...

最新文章

  1. 设计模式————单例模式
  2. mysql数据库任务驱动教程答案_MySQL数据库任务驱动式教程
  3. 休眠事实:集成测试策略
  4. “Transaction rolled back because it has been marked as rollback-only”
  5. 最最基础的Android倒计时应用
  6. 64位centos下QQ无法输入中文只能输入英文
  7. python匿名函数 与 内置函数
  8. Jsp Layout 布局页
  9. DAV 转 AVI 软件 dav2avi
  10. 问题1:编译内核出现错误‘debian/stamp/build/kernel‘及解决方案
  11. 初学vue,模仿个静态网站
  12. RenderTexture实现小地图和炫酷的传送门!(干货收藏)
  13. 【自适应波束形成】MVDR(Minimum Variance Distortionless Response )笔记
  14. 逆商助你回顾2019年迎面2020年
  15. 【数量称谓】祖宗十八代
  16. 外贸人常用的几种客户开发渠道
  17. C#开发Active控件
  18. EventBus源码分析 1
  19. Java实现Mysql数据库备份与还原(Linux 和Windows 包含单张表备份)
  20. flutter国内镜像

热门文章

  1. 最详细的Mac下安装nacos教程来了
  2. RocketMQ集成SpringBoot
  3. linux环境下用docker安装rabbitmq
  4. MYSQL多字段分组having子句
  5. 网络知识:分享几个路由器设置小技巧,欢迎收藏!
  6. 一篇文章,了解清楚路由器的各种组网
  7. 前端:JS操作数字类库
  8. 100+ 值得收藏的 Web 开发资源
  9. TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理
  10. 永不示弱_永不过时的网页设计:今天和2000年的在线投资组合