我正在编写一个简单的密钥记录器,作为了解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。我被告知最佳做法是在打开文件期间调用,允许我设置中断,但我不想依赖于编写一个用户空间程序调用打开“my_dev”,以便我可以运行中断处理程序。
谢谢
答案 0 :(得分:2)
别担心。 request_irq
不会“占用”中断。它将处理程序放在一个回调列表上,并在发出中断信号时调用所有处理程序(用于该IRQ)。
如果您在中断过程中所做的事情繁重,您可能只想在驱动程序打开时启用处理IRQ,以便在不使用驱动程序时最大限度地减少系统中断。为此,请执行驱动程序打开和关闭调用,并保持引用计数:仅当引用计数> 0应该注册ISR
答案 1 :(得分:1)
让它先工作,并担心以后的最佳做法。在module_init
中请求IRQ并不是什么大问题 - 只要中断处理程序需要的所有资源都可以立即调用它......