天天看點

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)

繼續閱讀