linux-kernel – 设备驱动程序中的中断处理

linux-kernel – 设备驱动程序中的中断处理,第1张

概述我写了一个简单的字符驱动程序,并在gpio引脚上请求了IRQ,并为它添加了一个处理程序. err = request_irq(irq,irq_handler,IRQF_SHARED | IRQF_TRIGGER_RISING,INTERRUPT_DEVICE_NAME,raspi_gpio_devp); static irqreturn_t irq_handler(int irq,void * a 我写了一个简单的字符驱动程序,并在gpio引脚上请求了IRQ,并为它添加了一个处理程序.

err = request_irq(irq,irq_handler,IRQF_SHARED | IRQF_TRIGGER_RISING,INTERRUPT_DEVICE_name,raspi_gpio_devp);

static irqreturn_t irq_handler(int irq,voID * arg);

现在从理论上我知道,在中断中断控制器时告诉处理器调用do_IRQ(),它将检查IDT并为此线路调用我的中断处理程序.

内核如何知道中断处理程序是针对这个特定的设备文件的

我也知道Interrupt处理程序不能在任何进程上下文中运行.但是,我要说我正在访问任何声明在处理程序的边范围内的变量,一个静态全局标志= 0,在处理程序中我使flag = 1表示发生了中断.该变量处于流程上下文中.所以我很困惑这个处理程序不在任何进程上下文中修改进程上下文中的变量.

谢谢

解决方法 内核不知道这个特定的中断是针对特定设备的.

它唯一知道的是它必须使用raspi_gpio_devp作为参数调用irq_handler. (像这样: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;}

中断处理程序在中断上下文中运行.但是您可以访问在中断范围之外声明的静态变量.

通常,中断处理程序的作用是:

>检查中断状态
>从硬件中检索信息并将其存储在某处(例如缓冲区/ fifo)
> wake_up()等待该信息的内核进程

如果你想对中断处理的执行和不执行充满信心,那么最好阅读的内容是内核的进程.

一本很好的书就是Linux Kernel Developpement by Robert Love.

总结

以上是内存溢出为你收集整理的linux-kernel – 设备驱动程序中的中断处理全部内容,希望文章能够帮你解决linux-kernel – 设备驱动程序中的中断处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1031914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存