从计时器回调函数内部调用mod_timer

时间:2014-06-30 11:56:34

标签: c linux linux-kernel

我正在为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删除计时器并重新添加。它会引起问题吗?如果是这样,是否有更好的方法为内核模块创建重复计时器?

2 个答案:

答案 0 :(得分:1)

您的函数timer_start()必须在设置函数和到期时间后调用add_timer()。计时器功能触发后,您的计时器不再处于活动状态,因此您只需将.expires字段重置为新值,然后再次呼叫add_timer()。确保提供一种干净的方法来停止重新安排定时器,例如在模块卸载时。

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

答案 1 :(得分:1)

从计时器回调中执行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