Linux的hrtimer - 微秒精度?

时间:2013-02-18 19:52:18

标签: linux timer module kernel real-time

是否可以在微软精度的Linux主机上执行任务?即,我想在特定的时刻执行任务。我知道,Linux不是实时系统,但我正在寻找Linux上的最佳解决方案。

到目前为止,我已经创建了一个内核模块,设置了hrtimer并在输入回调函数时测量了抖动(我真的不太关心实际的延迟,它的抖动很重要) - 它大概是20- 50us的。这并不比在用户空间中使用timerfd好得多(也尝试使用进程的实时优先级,但这并没有真正改变任何东西)。

我正在运行Linux 3.5.0(只是一个例子,尝试了从2.6.35到3.7的不同内核),/ proc / timer_list显示了hrtimer_interrupt,我没有在故障安全模式下运行,它禁用了hrtimer功能。试用不同的CPU(Intel Atom到Core i7)。

到目前为止,我最好的想法是将hrtimer与ndelay / udelay结合使用。这真的是最好的方法吗?我无法相信以微秒精度触发任务是不可能的。如果代码没有被其他任务中断,那么在模块可以接受的情况下在内核空间中运行代码会很棒。我真的不太关心系统的其余部分,任务每秒只执行几次,因此每次执行任务时使用mdelay / ndelay将CPU刻录几微秒并不重要。尽管如此,我更喜欢更优雅的解决方案。

我希望问题很清楚,找到了很多关于计时器精度的主题,但没有真正回答这个问题。

2 个答案:

答案 0 :(得分:2)

您可以从用户空间执行您想要的操作

  1. 使用clock_gettime()CLOCK_REALTIME一起获取nano的时间 - 第二个解决方案
  2. 使用nanosleep()产生CPU,直到您接近执行任务所需的时间(至少milli - 秒分辨率)。
  3. 使用clock_gettime()的旋转循环,直到达到所需的时间
  4. 执行您的任务
  5. clock_gettime()函数在最近的内核和现代x86处理器中实现为VDSO - 用{{1}获取时间需要20-30 nano秒} - - 第二个分辨率 - 您应该能够每nano次调用clock_gettime()超过30次 - 秒。使用此方法,您的任务应在预计时间的micro - 秒的1/30内发送。

答案 1 :(得分:0)

默认的Linux内核计时器每毫秒计时。微秒是方式超出当前用户硬件的能力。

您看到的抖动是由于许多因素造成的,例如中断处理和服务于更高优先级的任务。您可以通过仔细选择硬件来减少这种情况,只启用真正需要的东西。内核的实时补丁系列(参见HOWTO)可能是一个减少它的选项。

永远记住,任何收益在互动性,稳定性和(最后,但至少也不是最不重要)建立,调整,故障排除和保持纸牌房屋分散的时间方面都有明确的成本。