2.6.30里,在ingo molnar的RT tree里存在有一段時間的interruptthread終于merge到mainline了。此時如果使用request_threaded_irq申請的中斷,handler不是在中斷上下文里執(zhí)行,而是在新創(chuàng)建的線程里執(zhí)行,這樣,該handler非常像執(zhí)行workqueue,擁有所有workqueue的特性,但是省掉了創(chuàng)建,初始化,調(diào)度workqueue的繁多步驟。處理起來非常簡單。讓我們看看這個接口。
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)和request_irq非常類似,irq是中斷號, handler是在發(fā)生中斷時,首先要執(zhí)行的code,非常類似于頂半,該函數(shù)最后會return IRQ_WAKE_THREAD來喚醒中斷線程,一般設(shè)為NULL,用系統(tǒng)提供的默認(rèn)處理。thread_fn,是要在線程里執(zhí)行的handler,非常類似于底半。 后三個參數(shù)基本和request_irq相同。irqsflags新增加了一個標(biāo)志,IRQF_ONESHOT,用來標(biāo)明是在中斷線程執(zhí)行完后在打開該中斷,該標(biāo)志非常有用,否則中斷有可能一直在頂半執(zhí)行,而不能處理中斷線程。例如對于gpio level中斷,如果不設(shè)置該位,在頂半執(zhí)行完成后,會打開中斷,此時由于電平?jīng)]有變化,馬上有執(zhí)行中斷,永遠沒有機會處理線程。下邊一個實際例子來說明它的應(yīng)用。在手機平臺中,檢測耳機的插入一般是通過耳機插孔中機械變化導(dǎo)致一個baseband gpio的電平的變化,在該gpio中斷里進行耳機插入處理。但是耳機插入一般都有個抖動的過程,需要消抖處理。最簡單的辦法是在中斷發(fā)生后,延時一段時間(例如200ms),然后再檢查GPIO狀態(tài)是否穩(wěn)定來確定是否有效插入。如果用老的中斷方式,不得不用workqueue的方式,你需要在頂半里激活一個delay 200ms的workqueue,然后在workqueue里檢查。用線程化的處理方式,你僅僅需要在thread_fn里sleep 200ms,然后在檢查即可???,事情就這么簡單!