Linux設備驅動之工作隊列

工作隊列與Tasklet相同點和不同點:
1、相同
工作隊列與Tasklet都允許內核代碼請求某個函數在將來的時間被調用
2、區別
(1)、tasklet運行在中斷上下文,因此所有的tasklet代碼都必須是原子的。而工作隊列函數運行在一個特殊的內核進程上下文,  因此它們具有更好的靈活性。工作隊列可以休眠。
(2)、Tasklet始終運行在被初始提交的同一處理器上,但這只是工作隊列的默認方式。
(3)、內核代碼可以請求工作隊列函數的執行延遲給定的時間間隔

內核中使用struct workqueue_struct 來描述工作隊列

  • 創建一個工作隊列
struct workqueue_struct *create_workqueue(const char *name)
struct workqueue_struct *create_singlethread_workqueue(const char *name)
  • 初始化一個任務
要向一個工作隊列提交一個任務,需要填充一個work_struct結構,
宏編譯時:
DECLARE_WORK(name, void(*func)(void *), void *data)
運行時:
INIT_WORK(struct work_struct *work, void(*func)(void *), void *data)
PREPARE_WORK(struct work_struct *work, void(*func)(void *), void *data )
  • 將工作提交到工作隊列
int queue_work(struct workqueue_struct*queue, struct work_struct *work)
int queue_delayed_work(struct workqueue_struct*queue, struct work_struct *work, unsighed long delay)
  • 取消某個掛起的工作隊列入口項
int cancel_delayed_work(struct work_struct *work)
void flush_workqueue(struct workqueue_struct *queue)
  • 銷燬工作隊列
void destroy_workqueue(struct workqueue_struct *queue)




    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章