有没有可能在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几微秒不会真的有关系。虽然我更喜欢一种更优雅的解决方案。
我希望问题清晰明了,找到了很多关于计时器精度的主题,但没有真正回答这个问题。
到目前为止,我已经创建了一个内核模块,设置了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几微秒不会真的有关系。虽然我更喜欢一种更优雅的解决方案。
我希望问题清晰明了,找到了很多关于计时器精度的主题,但没有真正回答这个问题。