我已经在网上搜索过,但是对于我遇到的几个相关问题,关于“request_threaded_irq”功能,还没有找到令人信服的答案。
问题1: 首先,我正在阅读这篇关于线程IRQ的文章:
http://lwn.net/Articles/302043/
我不清楚这一行:
“只有当处理程序代码通过集成 tasklet/softirq 功能并简化锁定来利用它时,将中断转换为线程才有意义。”
我知道如果我们继续采用“传统”的上半部/下半部方法,我们将需要自旋锁或禁用本地 IRQ 来干预共享数据。但是,我不明白的是,线程中断如何通过集成 tasklet/softirq 功能来简化锁定需求。
问题2: 其次,request_threaded_handler 方法比基于 work_queue 的下半部分方法有什么优势(如果有的话)?在这两种情况下,似乎“工作”都被推迟到了一个专用线程。那么区别是什么呢 ?
问题3: 最后,在以下原型中:
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)
是否有可能 IRQ 的“处理程序”部分由相关 IRQ 连续触发(例如 UART 以高速率接收字符),即使“thread_fn”(将 rx'd 字节写入循环缓冲区)部分中断处理程序正忙于处理来自先前唤醒的 IRQ 吗?那么,处理程序不会试图“唤醒”已经运行的“thread_fn”吗?在这种情况下,正在运行的 irq thread_fn 会如何表现?
如果有人能帮助我理解这一点,我将不胜感激。
谢谢,vj