八、延遲的工作隊列INIT_DELAYED_WORK


前面講到工作隊列是一種可以將工作推后執行的一種機制,當我們希望某個工作以一個固定的周期去執行的時候可以使用延遲的工作隊列來實現,通過分析延遲工作隊列函數我們發現,它本質上也是通過注冊內核定時器來保證這個延遲的時間的,

因此我們也可以使用內核定時器+工作隊列的方式來代替延遲的工作隊列。不過這種基於內核定時器實現的固定周期執行任務,因為內核定時器本身的精度關系,最高只能支持ms級別的精准度。如果需要更高更精確的延遲執行任務,延遲的工作隊列可能不合適。

接下來簡單說明一下延遲工作隊列的創建,本質上和工作隊列沒有什么區別。

1.定義一個延遲的工作隊列和任務對象
static struct workqueue_struct *ms_workqueue = NULL;
static struct delayed_work ms_queue_work;
2.定義周期性執行的函數
void work_func(struct work_struct *work)
{
    /*周期執行的操作,比如讀取某些外設數據等*/  
}
3.初始化工作隊列
static int __init xxx_init(void)
{
    my_workqueue= create_workqueue("1ms");                /*創建工作隊列workqueue_struct,該函數會為cpu創建內核線程*/ 
    INIT_DELAYED_WORK(&ms_queue_work,work_func);       /*初始化延遲的工作work_struct,指定工作函數*/ 
    queue_delayed_work(ms_workqueue, &ms_queue_work, 1);  /*將工作加入到工作隊列中,最終喚醒內核線程(比較常見的使用場景是在中斷上半部去喚醒內核線程),第三個參數1是表示以1ms的周期去執行*/ 
    return 0;
}

4.注銷工作隊列

cancel_rearming_delayed_workqueue(ms_workqueue, &ms_queue_work);

  destroy_workqueue(ms_workqueue);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM