我已经编写了一个简单的字符驱动程序,并在gpio引脚上请求了IRQ,并为其编写了处理程序。
err = request_irq(irq,irq_handler,IRQF_SHARED | IRQF_TRIGGER_RISING,INTERRUPT_DEVICE_NAME,raspi_gpio_devp);
静态irqreturn_t irq_handler(int irq,void * arg);
现在从理论上我知道,在中断时,中断控制器会告诉处理器调用do_IRQ(),这将检查IDT并为此行调用我的中断处理程序。
内核如何知道中断处理程序是用于此特定设备文件的
我也知道中断处理程序不会在任何进程上下文中运行。但是,可以说我正在访问在处理程序范围外声明的任何变量,静态全局标志= 0,在处理程序中,我将标志= 1指示发生了中断。该变量在过程上下文中。因此,我很困惑,该处理程序如何不在任何流程上下文中修改流程上下文中的变量。
谢谢
内核不知道此特定中断是针对特定设备的。
它唯一知道的是必须irq_handler
使用raspi_gpio_devp
作为参数进行调用。(例如:)irq_handler(irq, raspi_gpio_devp)
。
如果您的irq行是共享的,则应检查设备是否生成了IRQ。代码:
int irq_handler(int irq, void* dev_id) {
struct raspi_gpio_dev *raspi_gpio_devp = (struct raspi_gpio_dev *) dev_id;
if (!my_gpio_irq_occured(raspi_gpio_devp))
return IRQ_NONE;
/* do stuff here */
return IRQ_HANDLED;
}
中断处理程序在中断上下文中运行。但是您可以访问在中断范围之外声明的静态变量。
通常,中断处理程序的作用是:
wake_up()
等待该信息的内核进程如果您想对中断处理的做与不做有信心,那么最好阅读的内容是内核的处理过程。
罗伯特·洛夫(Robert Love)出版的《Linux Kernel Developpement》就是一本很好的书。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句