Linux设备驱动程序 - 线程IRQ处理程序

时间:2013-01-14 05:36:40

标签: linux-kernel linux-device-driver drivers interrupt-handling

最近,我遇到了一种情况,我想使用线程IRQ's作为键盘驱动程序。有关线程IRQ处理程序的一些背景知识:

http://lwn.net/Articles/302043/

根据我的理解,每次IRQ发生时,IRQ处理程序线程都会被唤醒。所以,如果我按KEY A,它会唤醒线程并且它会一直运行完成。现在,当KEY BIRQ服务KEY A时处理程序线程仍在运行时,我应该按IRQ的行为是什么... KEY B来自{{{1}} 1}}被忽略?

预期的行为是什么?

2 个答案:

答案 0 :(得分:3)

理想情况下,系统将始终确认密钥A->密钥B的序列。

然而,为了确认按下了一个键,系统必须在按下每个键的位置执行某些操作,即。当键盘中断发生时 - 至少它必须记录按键,可能在队列中。

从单个处理器的角度来看,它一次只能做一件事,所以如果它在录音键的中间按A键,那么它就不能同时记录按键B. 它要么必须放弃A而要记录B,否则它将不得不忽略B.

因此,中断处理的目标是最大限度地减少处理器花费的时间来确定任何给定中断所需的最小值。

线程中断的目标是将更多工作推送到单独的线程,以便减少确认中断所需的最小时间,从而减少处理中断所花费的时间(在此处无法处理任何其他中断)同时)减少了。

即便如此,仍然没有理论保证处理器不必丢弃或忽略中断,但它确实使实际上不太可能。

对于你按键的具体例子,如果你能够以某种方式足够快地在处理器完成A的最小处理之前按B,那么因为两个中断来自同一个源,因此具有相同的优先级,B将被忽略,并且在你看来好像B从未被按下过。

答案 1 :(得分:0)

处理中断的方式是,处理器将一遍又一遍地调用已启用的中断,直到应用程序清除相应的中断标志为止。因此,您要做的是在硬件处理程序中禁用该特定中断并唤醒线程。当硬件处理程序退出时,将设置中断标志,但不会再次调用该中断。这样,您就可以在线程中checkeach标志,并在进行操作时将其清除。当您检测到设置了按键标志时,您将读出按键,然后将其清除。如果在读取数据寄存器后按下了新键,并且硬件中没有FIFO,那么该键将丢失。然后,您清除中断标志并再次启用硬件中断。想法是此过程发生得如此之快,以至于无法丢失任何键,因为您的线程将始终比人类按下另一个键的运行时间早。

在诸如USB之类的情况下(即,如果您编写了一个与PC进行通信的USB驱动程序),您可以选择在完成读取数据后告诉USB外设,以便它可以告诉主机它可以接受更多数据。在这种情况下,您永远不会丢失数据,因为您将读出数据并清除标志,然后告诉外围设备您已经准备好。在此之前,外设始终会告诉主机它尚未准备好,因此不会通过USB总线输入任何数据。