由于处理器的速度和计算机外围设备的速度往往不在一个数量级上,因此要想更好地使用外围设备,同时又充分发挥处理器的能力,中断无疑是首选。然而中断和异常又密切相关,但异常与中断不同,它由软件产生,在产生时必须考虑处理器时钟同步。实际上,异常也常常称为同步中断;硬件中断响应被称为异步中断。
由于中断可能随时发生,因此中断处理程序也就随时可能执行。所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快地恢复中断代码的执行,但是中断处理程序往往还要完成大量其他的工作。这就与中断的快速性矛盾了,为了解决此问题,一个完整的中断处理流程需要拆分成两部分:中断处理程序(俗称上半部)、下半部以及推迟执行的工作。当中断发生时,仅仅执行中断处理程序,它仅仅告知硬件它发送中断已经被接受以及一些重要、紧迫而又与硬件相关的工作,而后面大部分工作将留在下半部分完成。
中断处理程序使用前是需要注册的。LINUX内核中的中断处理程序注册函数为:
Intrequest_irq(unsigned int irq, //中断号
Irq_handler_t handler,//中断处理程序的指针
Unsigned long flags,//指定中断处理程序的行为
Const char *name,//中断相关设备ASCII文本表示
Void *dev)//用于中断线共享
这样当硬件发生中断时就可以调用相应的处理程序进行处理了。
中断处理流程的下半部分。下半部分的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。下半部工作可以使用五种机制来实现:BH、任务队列、软中断、tasklet以及工作队列。但BH、任务队列在2.5版本中就已经去除了,目前可以使用的只有后面三种机制。未完待续….