request_threaded_irq()在驱动程序中使用为什么不request_irq()?两者有什么不同?

iSe*_*ult 4 kernel irq

我发布这是讨论request_threaded_irq的线程,但我没有得到任何答复.所以我刚刚发布它.

我正在研究用于电容式触摸屏的触摸屏驱动程序.它使用request_threaded_irq()调用而不是request_irq().我无法理解两者之间的基本差异.它说 :-

名称

request_threaded_irq - 分配中断线

概要

int request_threaded_irq(unsigned int irq,irq_handler_t handler,irq_handler_t thread_fn,unsigned long irqflags,const char*devname,void*dev_id);

参数

  1. irq - 要分配的中断线
  2. handler - IRQ发生时要调用的函数.线程中断的主处理程序如果为NULL且thread_fn!= NULL,则安装默认的主处理程序
  3. thread_fn - 从irq处理程序线程调用的函数如果为NULL,则不会创建irq线程
  4. irqflags - 中断类型标志
  5. devname - 声明设备的ascii名称
  6. dev_id - 传递回处理函数的cookie

Handler和Thread_fn参数是令人困惑的.此外,驱动程序中没有定义工作功能.

这是我所指的司机.

有人可以帮我理解这个吗?

Ala*_*n H 7

添加了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);
Run Code Online (Sandbox Code Playgroud)

通过为第二个arg传递NULL,"handler",thread_fn的参数或函数cy8ctmg110_irq_thread()将在检测到中断时被调用.

对于您来说,选择哪个请求irq函数将取决于您的驱动程序在中断上下文中需要做什么.

  • Alan,如果在线程已经运行时再次发生中断会发生什么?是否会启动该线程的新实例?或者忽略中断? (2认同)