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...