1

我正在编写一个简单的按键记录器,作为了解 linux 驱动程序的中断和 IO 端口的一种方式。现在从我读过的内容来看,我需要通过...注册中断处理程序

int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);

但是,从我也读到的内容来看,如果我在 module_init() 期间调用 request_irq,我将占用中断。我的问题是我想与其他资源共享中断,但我不确定如何调用此中断。我希望我可以使用 module_init() 调用该函数并将我的标志设置为 SA_SHIRQ。我被告知最好的做法是在打开文件期间调用它允许我设置中断,但我不想依赖编写一个调用 open“my_dev”的用户空间程序,以便我可以运行中断处理程序。

谢谢

4

2 回答 2

2

不用担心。 request_irq不会“占用”中断。它将处理程序放在回调列表中,并在发出中断信号时调用所有处理程序(针对该 IRQ)。

如果您在中断期间所做的工作繁重,您可能希望仅在驱动程序打开时启用处理 IRQ,以最大限度地减少不使用驱动程序时的系统中断。为此,实现驱动程序打开和关闭调用,并保持引用计数:只有当引用计数 > 0 时才应注册 ISR

于 2012-04-04T05:01:13.800 回答
1

先让它工作,然后再考虑最佳实践。请求 IRQmodule_init没什么大不了的——只要中断处理程序需要的所有资源都可以用于立即调用它...

于 2012-04-04T05:04:40.063 回答