介紹
在中斷處理中,經常用到工作隊列,這樣便能縮短中斷處理時的時間
中斷中通過調用schedule_work(work)來通知內核線程,然后中斷結束后,再去繼續執行work對應的func函數
示例
當中斷來了,立馬調用schedule_work(work),然后退出.
中斷結束后,內核便會調用_work對應的func函數,最后才來讀取按鍵值,上報按鍵值,這樣就大大縮短了中斷處理時間
work_struct之相關函數
1.
INIT_WORK(work, func);
其中參數1是個work_struct結構體,參數2是個函數名,通過INIT_WORK將work_struct與一個函數建立起來.
其中work_struct結構體定義如下所示:
struct work_struct { atomic_long_t data; struct list_head entry; work_func_t func; //函數指針,指向func函數 #ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #endif };
2.
schedule_work(work);
通知內核線程,在后續的時間里,系統將會自動調用work結構體對應的func函數
3.
bool cancel_work_sync(struct work_struct *work);
取消work結構體對應的func函數,一般在exit中使用
接下來,在這個鏈接,將會在中斷里用到它們: https://www.cnblogs.com/lifexy/p/9629699.html
delayed_work之相關函數
在上個鏈接,我們只是講了work_struct如何使用
而在內核中,除了work_struct外,還有一個結構體delayed_work,該工作隊列里擁有一個timer定時器結構體,從而實現延時工作,其中delayed_work結構體如下所示:
該結構體相關函數如下所示:
INIT_DELAYED_WORK(dwork, work); //參數1是個delayed_work結構體,參數2是個函數名
schedule_delayed_work (struct delayed_work *dwork, unsigned long delay); //將當前dwork變量進入到等待隊列中,在后續的delay時間后,將會調用dwork變量對應的work函數
bool cancel_delayed_work(struct delayed_work *dwork); //如果當前dwork在等待隊列中,則將取消掉
