Linux 2.6核心使用了不少工作佇列來處理任務,他在使用上和 tasklet最大的不同是工作佇列的函式可以使用休眠,而tasklet的函式是不允許使用休眠的。 工作佇列的使用又分兩種情況,一種是利用系統共享的工作佇列來新增自己的工作,這種情況處理函式不能消耗太多時間,這樣會影響共享佇列中其他任務的處理;另外一種是建立自己的工作佇列並新增工作。(一)利用系統共享的工作佇列新增工作: 第一步:宣告或編寫一個工作處理函式 void my_func(); 第二步:建立一個工作結構體變數,並將處理函式和引數的入口地址賦給這個工作結構體變數 DECLARE_WORK(my_work,my_func,&data); //編譯時建立名為my_work的結構體變數並把函式入口地址和引數地址賦給它; 如果不想要在編譯時就用DECLARE_WORK()建立並初始化工作結構體變數,也可以在程式執行時再用INIT_WORK()建立 struct work_struct my_work; //建立一個名為my_work的結構體變數,建立後才能使用INIT_WORK() INIT_WORK(&my_work,my_func,&data); //初始化已經建立的my_work,其實就是往這個結構體變數中新增處理函式的入口地址和data的地址,通常在驅動的open函式中完成 第三步:將工作結構體變數新增入系統的共享工作佇列 schedule_work(&my_work); //新增入佇列的工作完成後會自動從佇列中刪除 或schedule_delayed_work(&my_work,tick); //延時tick個滴答後再提交工作 (二)建立自己的工作佇列來新增工作 第一步:宣告工作處理函式和一個指向工作佇列的指標 void my_func(); struct workqueue_struct *p_queue; 第二步:建立自己的工作佇列和工作結構體變數(通常在open函式中完成) p_queu=create_workqueue("my_queue"); //建立一個名為my_queue的工作佇列並把工作佇列的入口地址賦給宣告的指標 struct work_struct my_work; INIT_WORK(&my_work, my_func, &data); //建立一個工作結構體變數並初始化,和第一種情況的方法一樣 第三步:將工作新增入自己建立的工作佇列等待執行 queue_work(p_queue, &my_work); //作用與schedule_work()類似,不同的是將工作新增入p_queue指標指向的工作佇列而不是系統共享的工作佇列 第四步:刪除自己的工作佇列 destroy_workqueue(p_queue); //一般是在close函式中刪除
Linux 2.6核心使用了不少工作佇列來處理任務,他在使用上和 tasklet最大的不同是工作佇列的函式可以使用休眠,而tasklet的函式是不允許使用休眠的。 工作佇列的使用又分兩種情況,一種是利用系統共享的工作佇列來新增自己的工作,這種情況處理函式不能消耗太多時間,這樣會影響共享佇列中其他任務的處理;另外一種是建立自己的工作佇列並新增工作。(一)利用系統共享的工作佇列新增工作: 第一步:宣告或編寫一個工作處理函式 void my_func(); 第二步:建立一個工作結構體變數,並將處理函式和引數的入口地址賦給這個工作結構體變數 DECLARE_WORK(my_work,my_func,&data); //編譯時建立名為my_work的結構體變數並把函式入口地址和引數地址賦給它; 如果不想要在編譯時就用DECLARE_WORK()建立並初始化工作結構體變數,也可以在程式執行時再用INIT_WORK()建立 struct work_struct my_work; //建立一個名為my_work的結構體變數,建立後才能使用INIT_WORK() INIT_WORK(&my_work,my_func,&data); //初始化已經建立的my_work,其實就是往這個結構體變數中新增處理函式的入口地址和data的地址,通常在驅動的open函式中完成 第三步:將工作結構體變數新增入系統的共享工作佇列 schedule_work(&my_work); //新增入佇列的工作完成後會自動從佇列中刪除 或schedule_delayed_work(&my_work,tick); //延時tick個滴答後再提交工作 (二)建立自己的工作佇列來新增工作 第一步:宣告工作處理函式和一個指向工作佇列的指標 void my_func(); struct workqueue_struct *p_queue; 第二步:建立自己的工作佇列和工作結構體變數(通常在open函式中完成) p_queu=create_workqueue("my_queue"); //建立一個名為my_queue的工作佇列並把工作佇列的入口地址賦給宣告的指標 struct work_struct my_work; INIT_WORK(&my_work, my_func, &data); //建立一個工作結構體變數並初始化,和第一種情況的方法一樣 第三步:將工作新增入自己建立的工作佇列等待執行 queue_work(p_queue, &my_work); //作用與schedule_work()類似,不同的是將工作新增入p_queue指標指向的工作佇列而不是系統共享的工作佇列 第四步:刪除自己的工作佇列 destroy_workqueue(p_queue); //一般是在close函式中刪除