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)
{
struct irqaction *action;
struct irq_desc *desc;
int retval;
if (irq == IRQ_NOTCONNECTED)
return -ENOTCONN;
desc = irq_to_desc(irq);
if (!desc)
return -EINVAL;
if (!irq_settings_can_request(desc) ||
WARN_ON(irq_settings_is_per_cpu_devid(desc)))
return -EINVAL;
//从这里可以看到再用request_threaded_irq申请中断线程化的时候irq的回调函数可以为null,如果为空的话,就由request_threaded_irq赋值一个默认的函数irq_default_primary_handler
,但是handler和thread_fn 不能同时为null
if (!handler) {
if (!thread_fn)
return -EINVAL;
handler = irq_default_primary_handler;
}
return retval;
}
继续看看irq_default_primary_handler
static irqreturn_t irq_default_primary_handler(int irq, void *dev_id)
{
return IRQ_WAKE_THREAD;
}
irq_default_primary_handler 符合我们之前的分析,其返回IRQ_WAKE_THREAD来触发线程的调用
中断线程化时,中断的回调函数可以为null
最新推荐文章于 2025-03-20 21:29:11 发布