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

原文网址: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

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

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

相关文章

Jenkins入门系列之——03PDF文档下载

啥都不说了&#xff0c;网页看着蛋疼的&#xff0c;自己下载pdf文档吧。 点击下载文档 http://files.cnblogs.com/zz0412/jenkins%E5%85%A5%E9%97%A8%E6%89%8B%E5%86%8C.pdf &#xff08;一直有人说下载不了&#xff0c;把连接单独发出来&#xff09; 好记性不如烂笔头&#x…

Android之ndk之用arm-linux-androideabi工具通过地址找到具体哪里崩溃

1、配置环境 1)、找到ndk目录,如果不记得我们到bashrc文件里找到 vim ~/.bashrc 2)、配置ndk目录下的arm-linux-androideabi的bin到bashrc文件里面去 vim ~/.bashrc 然后配置路径,这里是我的 export PATH=$PATH:******/android-ndk-r10e…

composer切换源_Composer具体安装方法

composer 作为依赖管理工具&#xff0c;使用频率还是挺高的。特别是对于我这种比较懒的程序猿&#xff0c;有现成轮子的时候坚决不自己重复造轮子。它主要有三部分构成&#xff1a;命令行工具&#xff0c;包仓库&#xff0c;代码库。包仓库就是我们常说的 composer 源&#xff…

C# 操作FireBird 附源码

写了一个C#操作firebird数据库的小Demo&#xff0c;有需要的可以研究研究, 步骤&#xff1a; 1.创建数据库 2.建数据表&#xff0c;插入数据&#xff0c;并读取、 写的时候碰到N多奇葩问题&#xff0c;记录了一些 解决方案&#xff1a; 程序集-生成-目标平台 改成 x86 源码地址…

UILabel的高度自适应

_content [UILabel new]; _content.text "日落时分&#xff0c;沏上一杯山茶&#xff0c;听一曲意境空远的《禅》&#xff0c;心神随此天籁&#xff0c;沉溺于玄妙的幻境里。仿佛我就是那穿梭于葳蕤山林中的一只飞鸟&#xff0c;时而盘旋穿梭&#xff0c;时而引吭高歌&a…

.NET 6 攻略大全(三)

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;15分钟).NET 6 继续与大家相约周日啦。本篇文章将介绍&#xff1a;单文件应用、IL 修整、System.Text.Json、源代码构建、库AIP的相关攻略。 单文件应用 在 .NET 6中&#xff0c;已为 Windows 和 macOS 启用内存中单文…

从如何优化SQL入手,提高数据仓库的ETL效率

1 引言数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程&#xff0c;整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作&#xff0c;SQL语句的效率将直接影响到数据仓库后台的性能。 目前&#xff0c…

C和指针之动态内存分配(读取范围在1和标准输入读取的size之前每个数据出现的次数)

1、问题 读取范围在1和标准输入读取的size之前每个数据出现的次数 2、代码实现 #include <stdio.h> #include <stdlib.h> #include <string.h>//读取范围在1和标准输入读取的size之前每个数据出现的次数 int *count(int size) {if (size <= 0)return NUL…

测试眉形的有哪个软件_这五款自动化软件测试工具,你最喜欢用哪个?

对测试自动化的依赖性增加导致大量自动化软件测试工具的出现&#xff0c;使得很难确定哪些是最好的。为了帮助您完成自动化工作&#xff0c;我们根据自己和他人的经验创建了五大最佳自动化软件测试工具列表。1. SeleniumSelenium可以说是web开发人员和测试人员中最受欢迎的自动…

本科 8年经验,20k的Offer,接还是不接?

伴随着疫情的此起彼伏&#xff0c;今年的金三银四跳槽季比往年要低沉很多&#xff0c;近日一条朋友圈火遍社区&#xff0c;“坐标一线城市&#xff0c;本科毕业&#xff0c;8年经验&#xff0c;15天仅5场面试&#xff0c;最终接了20k的offer&#xff0c;今年真难&#xff01;”…

CAD中批量打印

同事在网上找各种软件来实现CAD图的批量打印&#xff0c;总是问题多多。于是&#xff0c;我想到一个更方便的解决方法&#xff0c;即只要我将一个打印出来&#xff0c;然后就可以用批量处理来实现。 1.在CAD中输入plot命令&#xff08;或快捷键CtrlP&#xff09;&#xff0c;即…

java里面的文件上传与下载

java里面的文件上传与下载 文件的上传与下载主要用到两种方法&#xff1a;1、方法一&#xff1a;commons-fileupload.jar commons-io.jarapache的commons-fileupload实现文件上传&#xff0c;下载 【upload】package com.handson.bbs.servlet; import java.io.File;import java…

Photoshop脚本 使用ExtendScript编写Ps脚本

源自&#xff1a;http://coolketang.com/tutorials/menu1lesson3.php本节课程将演示如何使用ExtendScript编写脚本&#xff0c;它是由Adobe公司开发的一款脚本语言工具包。以后的所有课程也将使用这款工具编写脚本。您可以在开始菜单(Windows电脑)或Application目录(Mac电脑)上…

C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)

1、问题 编写calloc函数,函数内部使用malloc函数来获取内存 2、代码实现 #include <stdio.h> #include <stdlib.h>void *my_calloc(size_t nums, size_t element_size) {int i, all_size;all_size = nums * element_size;char *p = NULL;p = malloc…

CentOS6.4安装Vbox增强包

2019独角兽企业重金招聘Python工程师标准>>> 1、升级#yum update2、安装gcc #yum install gcc安装编译系统3、安装外置核心模块#yum install kernel-devel4、添加一个连接 ln -s /usr/src/kernels/2.6.18- 164.15.1.el5-i686(内核版本) /usr/src/linux 5、重启以…

eltree ref什么时候有_Vue3响应式系统源码解析-Ref篇

文章转载自&#xff1a;https://zhuanlan.zhihu.com/p/85978064我们阅读源码的原因是什么&#xff1f;无非是1&#xff1a;学习&#xff1b;2&#xff1a;更好的使用这个库。如果只是想大致的了解下原理&#xff0c;倒不必花时间阅读源码&#xff0c;几句话&#xff0c;几张图就…

揭秘.NET Core剪裁器背后的技术

十天前&#xff0c;我发布了对.NET Core程序进行瘦身的开源软件Zack.DotNetTrimmer&#xff0c;与.NET Core内置的剪裁器相比&#xff0c;Zack.DotNetTrimmer不仅对程序的剪裁效果更好&#xff0c;而且还支持WPF、WinForm程序。很多朋友对于这个开源项目的原理很感兴趣&#xf…

C和指针之动态内存分配之编程练习3

1、问题 编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制! 2、代码实现 #include <stdio.h> #include <stdlib.h>#define OFFSET 5char *my_strcpy…

freetds 移植

移植freetds主要是为了能够在linux下&#xff0c;使用C语言访问微软的sqlserver数据库。 参考连接 http://blog.csdn.net/neighbor1000/article/details/8824084 http://blog.csdn.net/lovehere33/article/details/41118405 在ubuntu上安装 从官网下载最新的稳定版本。 http://…

优秀程序员的 18 大法则【转载】

DRY原则 不要重复&#xff08;Don’t repeat yourself&#xff09;——程序设计中一个最根本的原则就是要避免重复。许多编程结构&#xff08;比如循环、函数、类等&#xff09;的存在就是为了避免重复。一旦重复&#xff08;例如&#xff0c;一个长表达式&#xff0c;一系列语…