我已经阅读了“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'花时间回到这个问题并提供一些反馈意见。我的内核驱动程序现在工作正常,与你向我提供所有这些提示之前的情况相比,它不那么难看。谢谢!
答案 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。