linux内核计时器 - 为什么在系统启动后不立即启动计时器功能

时间:2014-11-11 10:06:57

标签: linux timer linux-kernel linux-device-driver

我使用内核计时器来安排定期运行的函数(一旦初始化定时器并调用该函数,计时器就会在该函数内重新调度)。它作为我的设备驱动程序内核模块的一部分发生,并且所需的行为是该函数被触发并在系统引导(模块加载)后直接运行。问题是定时器触发的功能不是在系统启动后立即启动,而是在启动后大约5分钟后启动(尽管我可以确认模块已经加载并且代码执行时间足够早地通过add_timer)

这是我对计时器的初始化:

// Allocate memory for the timer
struct timer_list* pTimer = (struct timer_list*)vmalloc(sizeof(struct timer_list));
// step 1: Initialising function for the timer
init_timer(pTimer);
// step 2: set timer fields as needed
pTimer->data = (unsigned long)Data;
pTimer->function = ((void(*)(unsigned long))start_routine);
pTimer->expires = -1; // fire immediately
// step 3: register timer
add_timer(pTimer);

,其中start_routine是要运行的函数。然后,在该函数内部,我重新安排了计时器:

/* reschedule the timer */
pTimer->expires = jiffies + 1; // fire every 4msec
add_timer(pTimer);

并且整个工作正常但不是在系统启动后的最初约5分钟内。

就像我写的那样,我可以看到代码在系统启动后直接通过定时器初始化部分执行(并调用add_timer),但由于某种原因,函数start_routine在启动后的最初5分钟被阻止。之后,启动start_routine按预期调用。在系统启动后开始调用定时器功能大约5分钟延迟的原因是什么?

1 个答案:

答案 0 :(得分:2)

pTimer->expires = -1; // fire immediately

没有具有特殊含义的jiffies值。 当jiffies计数器达到值-1时,此代码告诉内核运行计时器。 在您的计算机上,计数器恰好从-75000开始,因此在启动后5分钟达到值-1

pTimer->expires = jiffies + 1; // fire every 4msec

除非CONFIG_HZ设置为250,否则此评论错误。