Linux的hrtimer - 微秒精度?

use*_*081 5 linux kernel module real-time timer

是否可以在具有微秒级精度的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 to Core i7).

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

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

amd*_*mdn 3

您可以从用户空间做您想做的事情

  1. clock_gettime()与 with 一起使用以获取秒分辨率CLOCK_REALTIME的时间nano
  2. 使用nanosleep()来让出 CPU,直到接近执行任务所需的时间(至少为milli- 秒分辨率)。
  3. 使用旋转循环clock_gettime()直到达到所需的时间
  4. 执行你的任务

clock_gettime()函数在最新的内核和现代 x86 处理器中实现VDSO- 需要 20-30nano秒才能获得秒分辨率的时间nano- 您应该能够每秒调用clock_gettime()超过 30 次micromicro使用此方法,您的任务应在预期时间的1/30 秒内调度。