何时可以禁用驱动程序中的中断

时间:2014-11-25 17:22:03

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

我一直在阅读LDD并在RPI上为GPIO编写驱动程序。我设法检测到GPIO引脚上的中断并读取该中断后的8位。

本书中的一个常见建议是很少禁用中断。但是,只要禁用它们并完成所有工作然后重新启用它们就会很有吸引力,因为它很容易使用。

那么,是否真的存在禁用中断的任何情况。

跟进问题:如果没有禁用中断,并且使用了让工作队列使用的工作队列,则请指出使用此方法进行学习的linux内核中的任何现有驱动程序。我想知道实际的方法,即编码方式如何完成。

由于

1 个答案:

答案 0 :(得分:2)

在任何驱动程序中,全局禁用中断不是一个好习惯。让内核处理它。您可以随时禁用硬件中特定GPIO线的硬件中断(通过主要编写一些寄存器)。确保您有可能在需要时重新启用它们。在编写驱动程序时,您根本不需要使用local_irq_disable()。如果那就是你要问的问题。

如果已为特定IRQ注册了中断处理程序,则在发生中断时将调用该处理程序。将在已禁用中断的情况下调用该处理程序。并且将处于原子环境中。您需要尽快完成工作并从处理程序返回。如果需要安排工作队列,则需要在返回之前使用schedule_work()。 Tasklet很旧,工作队列是首选。如果你在drivers / char下使用schedule_work(char驱动程序很简单),你可以使用这种机制找到其中一些。 drivers / char / sonypi.c就是一个例子。 sonypi_report_input_event()从sonypi_irq()调用,这是一个中断处理程序调用schedule_work()。

相关问题