当前位置:  开发笔记 > 运维 > 正文

Linux内核2.6中的计时

如何解决《Linux内核2.6中的计时》经验,为你挑选了1个好方法。

我已经阅读了"Linux设备驱动程序"中的第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> ctuffli..:

你在这里实现的基本上是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.

关于包装,有关jiffies和包装的说明,请参阅第6.2.1.2节.此外,这篇文章试图在摘要中描述包装.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有