我已经阅读了"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'花时间回到这个问题并提供一些反馈意见.我的内核驱动程序现在工作正常,与你向我提供所有这些提示之前的情况相比,它不那么难看.谢谢!
你在这里实现的基本上是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节.此外,这篇文章试图在摘要中描述包装.