Linux内核2.6中的计时

时间:2009-02-17 09:24:14

标签: c linux-kernel

我已经阅读了“Linux设备驱动程序”(which can be found here)中的第7章,可以用'jiffies'来衡量时间。股票jiffies变量的问题在于它经常包裹(特别是如果你将CONFIG_HZ设置为1000)。

在我的内核模块中,我将保存一个jiffies值,该值将在未来的某个时间设置,并在以后将其与当前的“jiffies”值进行比较。我已经知道有些函数会考虑32位jiffy包装,所以要比较我正在使用的两个值:

if (time_after(jiffies, some_future_jiffies_value))
{
   // we've already passed the saved value
}

我的问题出现了:现在我想将'some_future_jiffies_value'设置为“now + 10ms”。这可以通过这样做轻松完成:

some_future_jiffies_value = jiffies + msecs_to_jiffies(10);

这是对的吗?如果当前的jiffies接近MAX_JIFFY_OFFSET并且msecs_to_jiffies(10)的结果值使some_future_jiffies_value超过该偏移量会发生什么?它是自动环绕还是我应该添加一些代码来检查这个?是否有功能可以让我不必处理这个问题?

更新

为了避免使用环绕式内容我已经重写了我的睡眠循环:

   // Sleep for the appropriate time
   while (time_after(some_future_jiffies_value, jiffies))
   {
      set_current_state(TASK_INTERRUPTIBLE);
      schedule_timeout(1);
   }

我认为这样更便携吗?

更新2:

非常感谢'ctuffli'花时间回到这个问题并提供一些反馈意见。我的内核驱动程序现在工作正常,与你向我提供所有这些提示之前的情况相比,它不那么难看。谢谢!

1 个答案:

答案 0 :(得分:8)

你在这里实现的基本上是msleep_interruptible()(linux / kernel / timer.c)

/**
 * msleep_interruptible - sleep waiting for signals
 * @msecs: Time in milliseconds to sleep for
 */
unsigned long msleep_interruptible(unsigned int msecs)

此函数的优点是规范以毫秒为单位,并隐藏内部jiffies包装的详细信息。请务必检查返回值,因为此调用返回剩余的jiffies数。零意味着呼叫睡眠指定的毫秒数,而非零值表示呼叫在早期中断了这么多jiffies。

关于包装,请参阅第6.2.1.2节,了解jiffies和包装的说明。此外,这个post试图在摘要中描述包装。