45.work_struct和delayed_work的工作隊列使用


介紹

在中斷處理中,經常用到工作隊列,這樣便能縮短中斷處理時的時間

中斷中通過調用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在等待隊列中,則將取消掉

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM