以下是一个统计中断时间间隔的中断服务程序:
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