kernel - 在驱动程序中使用request_threaded_irq()为什么不使用request_irq()?两者之间有什么区别?

标签 kernel irq

我发布了这是讨论request_threaded_irq的主题,但没有得到任何答复。因此,我正在重新发布它。

我正在开发用于电容式触摸屏的触摸屏驱动程序。它使用request_threaded_irq()调用而不是request_irq()。我无法理解两者之间的基本区别。它说 :-

名称

request_threaded_irq —分配中断行

简介

int request_threaded_irq(无符号的int irq,irq_handler_t处理程序,irq_handler_t thread_fn,无符号的长irqflags,const char * devname,void * dev_id);

参数

  • irq-分配
  • 的中断线
  • handler-发生IRQ时要调用的函数。线程中断的主处理程序如果NULL和thread_fn!= NULL,则安装默认的主处理程序
  • thread_fn-从irq处理程序线程调用的函数如果为NULL,则不创建任何irq线程
  • irqflags-中断类型标志
  • devname-声明设备的ASCII名称
  • dev_id-将Cookie传递回处理程序函数

  • Handler和Thread_fn参数令人困惑。此外,驱动程序中未定义任何工作功能。

    Here is the driver which I am refering to.

    有人可以帮助我理解这一点吗?

    最佳答案

    添加了request_threaded_irq()函数,以允许开发人员将中断处理代码分为两部分。一部分将在中断被阻止的情况下执行,另一部分可以由内核线程在不中断被阻止的情况下完成。有关原因的详细信息,您可以阅读以下内容:

    http://lwn.net/Articles/302043/

    对于您而言,链接到的驱动程序可以执行以下操作:

    err = request_threaded_irq(client->irq, NULL, cy8ctmg110_irq_thread,
                               IRQF_TRIGGER_RISING, "touch_reset_key", ts);
    

    在检测到中断时,将为第二个arg(处理程序)传递NULL,从而调用thread_fn的参数或函数cy8ctmg110_irq_thread()。

    对于您来说,选择哪个请求irq函数将取决于您的驱动程序在中断上下文中需要执行的操作。

    关于kernel - 在驱动程序中使用request_threaded_irq()为什么不使用request_irq()?两者之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7685294/

    相关文章:

    c++ - 切割字符串的字符串安全方式(Windows 内核)

    c - 使用 cat 读取字符设备驱动程序时参数无效

    c - ARM单核简单高效的调度实现

    c - 如何提高 LPC1788 微 Controller 调用 CAN IRQ 的速率?

    c# - WMI 硬件地址和 IRQ

    linux - 关于 ftrace 的很好的解释/文档

    c - 解释一下下面的程序是如何工作的?

    linux - Debian 操作系统内核版本差异 : 3. 16.51-3 vs 3.16.51-3+deb8u1

    c - 为什么Linux内核中没有wait_event_..._irqsave()函数或宏?

    c - 如何在c中的32位操作系统中制作scanf()类型的函数?