0
我有一個Linux驅動程序,其中有許多中斷要由單個tasklet函數處理。如何從irq處理程序將值傳遞給linux內核tasklet?
我想爲它們註冊相同的tasklet,但根據接收到的irq更改它的行爲。我可以這樣做嗎?
是否有您知道的替代解決方案?
請不要在DECLARE_TASKLET()
期間聲明參數聲明我已經知道這不起作用,因爲該值是靜態的,並且不會被irq處理程序傳遞。
我有一個Linux驅動程序,其中有許多中斷要由單個tasklet函數處理。如何從irq處理程序將值傳遞給linux內核tasklet?
我想爲它們註冊相同的tasklet,但根據接收到的irq更改它的行爲。我可以這樣做嗎?
是否有您知道的替代解決方案?
請不要在DECLARE_TASKLET()
期間聲明參數聲明我已經知道這不起作用,因爲該值是靜態的,並且不會被irq處理程序傳遞。
我通過使用工作隊列解決了這個問題。
每個中斷處理程序都會收到一個數據結構的不同實例,這個實例在request_irq()期間已經被註冊。
該結構包含一個work_struct作爲其字段之一。
您可以爲每個irq定義多個work_structs。
您可以通過調用irq處理程序中的INIT_WORK()來調用workqueue函數,將工作結構字段作爲參數傳遞,該參數是原始結構的一部分。
工作隊列功能,然後使用
container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname);
獲取數據的實例針對特定工作隊列調用。總之,通過這種方式,您可以擁有多箇中斷線,由相同的中斷處理程序,相同的工作隊列函數提供服務,但工作在不同的數據結構上。
希望這會有所幫助。