linux INIT WORK 建立工作佇列

2021-06-08 02:07:56 字數 1455 閱讀 7089

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_queue=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函式中刪除

在t2上建立佇列 ,延時幾個ms才響應,這是什麼概念!還有解決這問題!!

linux INIT WORK 建立工作佇列

linux 2.6核心使用了不少工作佇列來處理任務,他在使用上和 tasklet最大的不同是工作佇列的函式可以使用休眠,而tasklet的函式是不允許使用休眠的。工作佇列的使用又分兩種情況,一種是利用系統共享的工作佇列來新增自己的工作,這種情況處理函式不能消耗太多時間,這樣會影響共享佇列中其他任務的...

建立主鍵 建立外來鍵 建立約束

建立主鍵 三種方法 建立學生表 第一種 create table student sno char 5 primary key,學號 可以直接指定主鍵 sname char 20 not null,姓名 s char 3 not null,性別 sage integer not null,年齡 sd...

Oracle建立儲存過程 建立函式 建立包

一 oracle建立儲存過程 1 基本語法 create orreplace procedureupdate emp sal name inout type,name inout type,is begin endupdate emp sal 2 寫乙個簡單的例子修改emp表的ename欄位 cre...