11.5 中断编程
前面所讲述的驱动程序中都没有涉及中断处理,而实际上,有很多 Linux的驱动
都是通过中断的方式来进行内核和硬件的交互。中断机制提供了硬件和软件之间异步
传递信息的方式。硬件设备在发生某个事件时通过中断通知软件进行处理。中断实现
了硬件设备按需获得处理器关注的机制,与查询方式相比可以大大节省 CPU 资源的
开销。
在此将介绍在驱动程序中用于申请中断的 request_irq()调用,和用于释放中断的
free_irq()调用。request_irq()函数调用的格式如下所示:
int request_irq(unsigned int irq,
void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
unsigned long irqflags, const char * devname, oid *dev_id);
其中 irq是要申请的硬件中断号。在 Intel平台,范围是 0~15。
参数 handler 为将要向系统注册的中断处理函数。这是一个回调函数,中断发生
时,系统调用这个函数,传入的参数包括硬件中断号、设备 id以及寄存器值。设备 id
就是在调用 request_irq()时传递给系统的参数 dev_id。
参数 irqflags是中断处理的一些属性,其中比较重要的有 SA_INTERRUPT。这个
参数用于标明中断处理程序是快速处理程序(设置 SA_INTERRUPT)还是慢速处理
程序(不设置 SA_INTERRUPT)。快速处理程序被调用时屏蔽所有中断。慢速处理程
序只屏蔽正在处理的中断。还有一个 SA_SHIRQ属性,设置了以后运行多个设备共享
中断,在中断处理程序中根据 dev_id区分不同设备产生的中断。
参数 devname为设备名,会在/dev/interrupts中显示。
参数 dev_id 在中断共享时会用到。一般设置为这个设备的 device 结构本身或者
NULL。中断处理程序可以用 dev_id 找到相应的控制这个中断的设备,或者用
irq2dev_map()找到中断对应的设备。
释放中断的 free_irq()函数调用的格式如下所示。该函数的参数与 request_irq()相
同。
1