嵌入式Linux面试:硬中断和线程化中断有什么区别?request_threaded_irq怎么用?
一、参考回答
传统硬中断处理函数运行在硬中断上下文,要求执行时间尽量短,不能执行可能睡眠的操作,例如获取可能阻塞的互斥锁、等待I2C/SPI传输完成或进行长时间轮询。线程化中断把处理拆成主处理函数handler和线程函数thread_fn:硬中断到来后,handler先快速确认中断是否属于本设备,必要时屏蔽设备中断源,然后返回IRQ_WAKE_THREAD唤醒对应的IRQ线程;后续较耗时、允许睡眠的处理放到thread_fn中完成。Linux通过request_threaded_irq注册这种中断处理方式,IRQF_ONESHOT可以在线程函数运行期间保持中断线屏蔽,避免同一中断源重复进入造成并发问题。它并不意味着所有中断工作都可以无限制地放进线程里,主处理函数仍然必须快速、安全。
二、回答时要讲清楚的关键点
handler运行在硬中断上下文,通常只做状态判断、读取必要寄存器、清除或屏蔽中断源,并返回IRQ_HANDLED或IRQ_WAKE_THREAD。
thread_fn运行在内核线程上下文,可以执行允许睡眠的操作,例如访问可能阻塞的总线、等待资源或处理较复杂的数据。
request_threaded_irq的handler和thread_fn要按设备中断机制配合设计;如果是共享中断,主处理函数必须判断中断是否来自本设备,不能无条件唤醒线程。
IRQF_ONESHOT常与线程化中断配合使用,在线程函数处理期间保持中断线屏蔽;设备端的中断状态清除和重新使能顺序必须与芯片手册一致。
三、工程判断对照

不要在硬中断handler中调用可能睡眠的函数,也不要认为thread_fn一定可以忽略设备中断源清除。若设备中断条件没有正确清除,线程化中断仍可能反复触发或形成中断风暴。
如果使用request_threaded_irq后,系统启动正常但中断触发一次后就不再进入线程函数,你会检查handler返回值、设备中断状态、IRQF_ONESHOT和中断控制器状态中的哪些环节?
技术资料:Linux Kernel Documentation:Generic IRQ Handling;Linux Kernel Documentation:Real-time kernels and threaded interrupts

扫码关注
































