现在的位置: 首页 > 综合 > 正文

Linux内核设计与实现——7 中断与中断处理(5)——注册中断处理程序

2013年07月27日 ⁄ 综合 ⁄ 共 1184字 ⁄ 字号 评论关闭
文章目录

5.注册中断处理程序

1)驱动程序可以通过request_irq()函数注册一个中断处理程序,并激活给定的中断线。函数原型如下:

int request_irq( unsigned  int  irq , irq_handler_t  handler,

                unsinged  long flags,  const  char * name,

               void *dev )

返回值:成功返回0,失败返回非0。通常返回非0最常见的错误是-BUSY,它表示给定的中断线已经在使用,或没有指定共享。

 

第一个参数:要分配的中断号。

 

第二个参数:一个函数指针,指向该驱动程序的中断处理函数。中断处理函数的原型我们已经在前面讲过了。

 

第三个参数:可以为0,也可以使是以下几个取值.

IRQF_DISABLED:表示内核在处理此中断处理程序本身期间,要禁止所有其它中断。多数中断处理程序不应该这么做。

IRQF_SAMPLE_RANDOM:表示该设备产生的中断会对内核熵池(entropy pool)有贡献。内核熵池是用来产生随机数的。所以,一般来说,只有中断产生时机不可预测的中断源才会如此设置,否则,会使得产生的随机数不是真正的随机。像时钟中断这种有规律的中断是坚决不应该这样设置的。

IRQF_TIMER:系统定时器专用。即时钟中断。

IRQF_SHARED:表示允许多个中断处理程序共享同一个中断线。只有此中断线上的所有设备都设置了此标志位,该中断线才是共享的。只要有一个中断处理程序表示自己不共享,那么这条中断线就无法共享。

       注意,第三个参数可以是以上几个选项中一个或多个的组合,如:IRQF_SAMPLE_RANDOM| IRQF_SHARED

 

第四个参数:是与该中断处理程序相关联的设备名。

 

第五个参数:指向该设备的一个可以唯一区分的指针。当该中断线是非共享的时候,可以是NULL。如果中断线是共享的,它上面有多个中断源,就无法通过中断号唯一确定一个设备,所以就需要这样一个指针来唯一定位一个设备。

 

2)注意:request_irq()函数可能会睡眠,所以,不能在中断上下文或其它不允许睡眠的代码中调用此函数。

 

3)硬件的初始化和注册中断处理程序的顺序要正确,应先初始化设备,然后再注册中断处理程序。以防止出现中断处理程序在设备初始化完成之前就开始执行,这种情况下,中断处理程序根本无法正确指定完成。

 

4)释放中断处理程序。有生就有死,有注册就要有释放。当中断处理程序不需要再使用的时候就需要进行释放,释放函数如下:

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

第一个参数是终端号,第二个参数是指向该设备的唯一确定的指针。

删除中断处理程序后,如果该中断线上已经没有其他中断处理程序,那么,该函数以会将这个中断线禁止掉。

抱歉!评论已关闭.