簡體   English   中英

從計時器回調函數內部調用mod_timer

[英]Calling mod_timer from inside timer callback function

我正在為Linux編寫一個內核模塊,並且希望自己的計時器重新設置。 為此,我想從計時器的回調函數內部調用mod_timer ,如下所示:

static void sched_send(unsigned long data)
{
    send_now();
    mod_timer(&test_timer, jiffies+(get_interval()*HZ));
}

static void timer_start(void)
{
    set_log_msg("Meep meep!");

    test_timer.function = sched_send;
    test_timer.expires = jiffies + HZ*get_interval();
}

但是,我讀過mod_timer刪除了計時器並重新添加了它。 會引起問題嗎? 如果是這樣,是否有更好的方法為內核模塊創建重復計時器?

您的函數timer_start()在設置函數和到期時間后必須調用add_timer() 一旦計時器函數觸發,您的計時器將不再活動,因此您要做的就是將.expires字段重置為新值,然后再次調用add_timer() 確保您提供了一種干凈的方法來停止重新計划計時器,例如在模塊卸載時。

send_now();
if(!terminate_timer) {
    test_timer.expires = jiffies + HZ*get_interval();
    add_timer(&test_timer);
}

從計時器回調中執行mod_timer是安全的。

從內核源代碼(kernel / timer.c):

/* mod_timer(timer, expires) is equivalent to:
*
*     del_timer(timer); timer->expires = expires; add_timer(timer);
*     ...
*/

至於del_timer

/*
* del_timer - deactive a timer.
* @timer: the timer to be deactivated
*
* del_timer() deactivates a timer - this works on both active and inactive
* timers. 
* ...
*/

正如Peter所指出的,您需要在要啟動/重新啟動計時器的任何時間調用add_timer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM