3

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

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

据我了解,每次IRQ发生时IRQ都会唤醒处理程序线程。所以,如果我按下KEY A,它会唤醒线程并运行到完成。现在,当处理程序线程在为fromKEY B提供服务时仍在运行时,我应该按什么行为...... from会被忽略吗?IRQKEY AIRQKEY B

预期的行为是什么?

4

2 回答 2

4

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

然而,为了确认一个键被按下,系统必须在每个键被按下的时候做一些事情,即当键盘中断发生时——至少它必须记录按键,也许在一个队列中。

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

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

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

即使那样,仍然没有理论上的保证处理器不必丢弃或忽略中断,但它确实使它在实践中不太可能发生。

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

于 2013-01-14T06:18:51.310 回答
0

它处理中断的方式是处理器将一遍又一遍地调用启用的中断,直到应用程序清除相应的中断标志。所以你要做的是禁用硬件处理程序中的特定中断并唤醒你的线程。当硬件处理程序退出时,将设置中断标志但不会再次调用中断。所以你然后在你的线程中检查每个标志并在你去的时候清除它。当您检测到设置了按键标志时,您会读出该键,然后将其清除。如果在读取数据寄存器后按下了一个新键并且硬件中没有 fifo,那么该键按下将丢失。然后清除中断标志并再次启用硬件中断。

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

于 2018-08-09T06:57:15.407 回答