Linux'hrtimer – 微秒精度?

是否有可能以微秒的精度在Linux主机上执行任务? 也就是说,我想在特定的时间执行任务。 我知道,Linux不是实时系统,但我正在寻找Linux上的最佳解决scheme。

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

我正在运行Linux 3.5.0(只是一个例子,尝试从2.6.35到3.7不同的内核),/ proc / timer_list显示hrtimer_interrupt,我没有运行在失效保护模式,禁用hrtimerfunction。 试过不同的CPU(Intel Atom to Core i7)。

到目前为止,我最好的想法是将hrtimer与ndelay / udelay结合使用。 这真的是最好的办法吗? 我不敢相信这是不可能以微秒的精度触发一个任务。 在内核空间中以模块的forms运行代码是可以接受的,但是如果代码没有被其他任务中断,那将是非常好的。 我不太关心系统的其他部分,任务每秒只能执行几次,因此每次执行任务时,使用mdelay / ndelay来刻录CPU几微秒就没有关系。 尽pipe如此,我更喜欢更加优雅的解决scheme。

我希望这个问题很清楚,发现很多关于定时器精度的话题,但是对这个问题没有真正的答案。

Solutions Collecting From Web of "Linux'hrtimer – 微秒精度?"

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

  1. 使用clock_gettime()CLOCK_REALTIME来获得nano分辨率的时间
  2. 使用nanosleep()生成CPU,直到您接近需要执行任务的时间(至少是milli分辨率)。
  3. 使用带clock_gettime()的旋转循环,直到达到所需的时间
  4. 执行你的任务

在最近的内核和现代x86处理器中, clock_gettime()函数被实现为VDSO ,需要20-30 nano才能获得nano分辨率的时间 – 您应该能够调用clock_gettime()超过30次/ micro 。 使用这种方法,你的任务应该在预定时间的micro 1/30内分派。

默认的Linux内核计时器每毫秒记录一次。 微秒远远超出了当前用户硬件的能力。

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

一定要记住,任何收益在互动性,稳定性和(最后,但最重要的是)你在构建,调整,排除故障以及保持卡的房子不被破坏方面都有一定的代价。