一:概述
虽然有时候只需使用I/O端口就能控制设备了,但大多数实际的设备都要更复杂一些。设备必须与外界交互,通常包括磁盘旋转、磁带移动、跨电缆的远距离数据传输等。很多外界交互需要花费多个处理器周期才能完成,速度要比处理器慢得多。让处理器等待外部事件完成几乎总是不可取的,因此必须有一种方式,让设备在发生事件时,或事件处理完成时通知处理器。 而这种通知的方式就是中断。
中断是设备给处理器发送的一个信号,以便让处理器留意和处理。Linux处理中断的方式与其用户空间处理信号的方式基本相同。对于大多数驱动程序来说,只需为其设备的中断注册一个处理程序,并在中断到达时正确地处理它们即可。当然,在这个简单的逻辑之下,还隐藏一些复杂性;特别是,由于中断处理程序的运行方式不用,中断处理程序所能执行的操作也有一定的限制。
如果没有真正的硬件设备来产生中断,就很难演示中断的使用。因此,本文中使用的示例代码是与并口(parallel port)一起工作的。在现代硬件中,这种端口已经开始变得稀缺,但幸运的是,大多数人在他们的系统上仍然能够获得可用的端口(实际上在现在电脑上,并口已被USB接口所取代,没有并口的情况下,可以用一根USB转并口线代替)。我们将用一个称为"short"的示例;来演示并口中断的产生和处理。示例名字之所以叫 "short", 实际上不是 short int 的意思,它是(Simple Hardware Operations and Raw Tests)的简写, 以提醒我们它可以处理中断。
不过,在进入主题之前,我需要提醒大家注意一点。中断处理程序的本质是与其他代码同时运行。因此,它们不可避免地会引发并发问题以及数据结构和硬件的争用问题。如果不熟悉Linux并发技术的朋友,我建议你回头查下并发的相关资料。因为在中断工作时,对并发控制技术的理解至关重要。
二:准备并口
为了演示本文示例,在没有并口的机器上,需要准备一根USB转并口的线。