我有一个场景,我的驱动程序需要监听来自两条不同 IRQ 线的两个不同中断。是否可以为单个驱动程序注册两个不同的 IRQ 并安装两个不同的处理程序?实现这一目标的最佳方法是什么?
PS:这是Linux设备驱动程序,两个IRQ不共享。
答案1
注册两个不同的 IRQ 并为单个驱动程序安装两个不同的处理程序
“就是这么简单”。 “是否可能”的答案是“是”。
同一CPU上的设备中断例程不会互相中断。
根据 LDD3(现在已经很老了),可以确保单个中断例程不会同时在多个 CPU 上运行。我不确定这是什么意思 - 我无法想象它适用于计时器中断。
在你的驱动程序中,我希望不同的中断例程能够在不同的 CPU 上同时运行。
然而,在必要时实现互斥的典型“自旋锁 irqsave”在这种情况下应该仍然可以正常工作。
您可能需要仔细检查您的测试系统上是否启用了 NMI 看门狗和 lockdep :)。如果 CPU 在中断例程中陷入旋转状态,NMI 看门狗就会触发。
答案2
这是完全有可能的。注册中断处理程序时,驱动程序会向内核提供中断触发时要调用的函数的地址。驱动程序可以根据需要设置任意数量的中断,并且所有中断都可以指向相同的服务例程,或者它们都可以指向自己的中断(或某些其他事物的组合)。
看这个答案有关如何实际处理中断的更多详细信息。