2014-03-01 18 views
0

我有一個Linux驅動程序,其中有許多中斷要由單個tasklet函數處理。如何從irq處理程序將值傳遞給linux內核tasklet?

我想爲它們註冊相同的tasklet,但根據接收到的irq更改它的行爲。我可以這樣做嗎?

是否有您知道的替代解決方案?

請不要在DECLARE_TASKLET()期間聲明參數聲明我已經知道這不起作用,因爲該值是靜態的,並且不會被irq處理程序傳遞。

回答

1

我通過使用工作隊列解決了這個問題。

每個中斷處理程序都會收到一個數據結構的不同實例,這個實例在request_irq()期間已經被註冊。

該結構包含一個work_struct作爲其字段之一。

您可以爲每個irq定義多個work_structs。

您可以通過調用irq處理程序中的INIT_WORK()來調用workqueue函數,將工作結構字段作爲參數傳遞,該參數是原始結構的一部分。

工作隊列功能,然後使用

container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname); 

獲取數據的實例針對特定工作隊列調用。總之,通過這種方式,您可以擁有多箇中斷線,由相同的中斷處理程序,相同的工作隊列函數提供服務,但工作在不同的數據結構上。

希望這會有所幫助。

相關問題