回覆列表
  • 1 # duhfr30350

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

  • 中秋節和大豐收的關聯?
  • 當地車輛限號,對外地車輛限號嗎?