设备驱动程序中的中断处理

哈斯韦尔

我已经编写了一个简单的字符驱动程序,并在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;
}

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

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

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

如果您想对中断处理的做与不做有信心,那么最好阅读的内容是内核的处理过程。

罗伯特·洛夫(Robert Love)出版的《Linux Kernel Developpement》就是一本很好的书

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Linux内核驱动程序模块:使用单个驱动程序处理多个设备文件

来自分类Dev

什么时候可以禁用驱动程序中的中断

来自分类Dev

Windows设备驱动程序

来自分类Dev

设备驱动程序分类

来自分类Dev

在Linux设备驱动程序中针对多线程应用程序的读/写和释放处理

来自分类Dev

Linux设备驱动程序中针对多线程应用程序的读/写和释放处理

来自分类Dev

如何在Linux设备驱动程序中设置errno?

来自分类Dev

在linux设备驱动程序中读取配置文件

来自分类Dev

设备驱动程序是否集成在内核中?

来自分类Dev

内核中内置了哪些设备驱动程序?

来自分类Dev

“其他驱动程序”中的此设备是什么?

来自分类Dev

Linux内核中的WS2812设备驱动程序

来自分类Dev

设备管理器中缺少驱动程序

来自分类Dev

使用自旋锁在内核驱动程序和中断处理程序之间同步

来自分类Dev

键盘驱动程序是字符设备驱动程序吗?

来自分类Dev

在Linux驱动程序中处理IRQ延迟

来自分类Dev

在Linux驱动程序中处理IRQ延迟

来自分类Dev

使用设备树的驱动程序绑定,而驱动程序中没有兼容的字符串

来自分类Dev

设备树和驱动程序探测

来自分类Dev

Linux设备驱动程序基础

来自分类Dev

覆盖内核的重复设备驱动程序

来自分类Dev

从ROM获取设备驱动程序

来自分类Dev

如何更新设备驱动程序?

来自分类Dev

“神奇”价值的设备驱动程序

来自分类Dev

Linux字符设备驱动程序问题

来自分类Dev

设备驱动程序与 /dev + glibc 接口

来自分类Dev

如何更新设备驱动程序?

来自分类Dev

在用户写入的设备驱动程序中添加所有USB设备

来自分类Dev

为什么设备驱动程序不存储在设备本身中?

Related 相关文章

热门标签

归档