中断处理函数

来源:互联网 发布:淘宝哪家茶叶店好 编辑:程序博客网 时间:2024/06/06 05:41

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

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。

 以下是在linux/irqreturn.h中的内容:

#ifndef _LINUX_IRQRETURN_H

#define _LINUX_IRQRETURN_H

typedef int irqreturn_t;

 

#define IRQ_NONE       (0)

#define IRQ_HANDLED       (1)

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

 #endif


原创粉丝点击