【问题标题】:Linux device driver - Threaded IRQ handlerLinux 设备驱动程序 - 线程 IRQ 处理程序
【发布时间】:2013-01-14 05:36:39
【问题描述】:

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

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

据我了解,每次出现IRQ 时,都会唤醒IRQ 处理程序线程。所以,如果我按KEY A,它会唤醒线程并运行到完成。现在,当处理程序线程仍在运行同时为来自KEY AIRQ 提供服务时,我应该按KEY B 的行为是什么... 来自KEY BIRQ 会被忽略吗?

预期的行为是什么?

【问题讨论】:

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


    【解决方案1】:

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

    但是,为了确认某个键被按下,系统必须在每个键被按下时执行一些操作,即当键盘中断发生时 - 至少它必须记录按键,也许在一个队列中。

    而且从单处理器的角度来看,它一次只能做一件事,所以如果它在录制按键A的过程中,那么它不能同时录制按键B。 它要么必须放弃 A 并记录 B,要么必须忽略 B。

    因此,中断处理的目标是尽量减少处理器在确认任何给定中断所需的最少时间上所花费的时间。

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

    即便如此,理论上仍然无法保证处理器不必丢弃或忽略中断,但在实践中确实不太可能发生这种情况。

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

    【讨论】:

      【解决方案2】:

      它处理中断的方式是处理器将一遍又一遍地调用启用的中断,直到应用程序清除相应的中断标志。所以你要做的是禁用硬件处理程序中的特定中断并唤醒你的线程。当硬件处理程序退出时,将设置中断标志但不会再次调用中断。所以你然后在你的线程中检查每个标志并在你去的时候清除它。当您检测到设置了按键标志时,您会读出该键,然后将其清除。如果在读取数据寄存器后按下了新键并且硬件中没有 fifo,则该键按下将丢失。然后清除中断标志并再次启用硬件中断。这个想法是这个过程发生得如此之快以至于没有办法丢失一个键,因为你的线程总是会比人类按下另一个键更快地运行。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 2013-10-29
        • 2017-03-02
        • 1970-01-01
        • 2013-04-13
        • 2013-07-08
        相关资源
        最近更新 更多