小编典典

Linux下1ms分辨率定时器推荐方式

linux

我需要一个在Linux下具有1ms分辨率的计时器刻度。它用于递增计时器值,该计时器值又用于查看是否应触发各种事件。由于glibc的要求,POSIX
timerfd_create不是一个选项。我尝试使用timer_create和timer_settimer,但从它们获得的最好结果是10ms分辨率,较小的值似乎默认为10ms分辨率。根据手册页,Getittimer和setitimer的分辨率为10毫秒。

我目前能想到的唯一执行此计时器的方法是在主循环中将clock_gettime与CLOCK_MONOTONIC一起使用,以测试是否已通过ms,并增加计数器(然后检查是否应触发各种事件)。

有比在主循环中不断查询更好的方法吗?建议的解决方案是什么?

我使用的语言是普通的旧c

更新
我正在使用2.6.26内核。我知道您可以使其在1kHz时中断,然后可以将POSIX timer_
*函数编程为最高1ms,但这似乎并不可靠,我也不想使用它,因为在某些情况下它可能需要新的内核系统。一些备用内核似乎仍配置了100Hz。我将需要检测到这一点。该应用程序可能在我的系统以外的其他设备上运行:)

我无法入睡1ms,因为可能有网络事件需要我做出反应。

我的解决方法
由于并不是那么重要,我只声明全局计时器具有100ms的分辨率。使用自己的计时器的所有事件都必须设置至少100毫秒的计时器到期时间。我或多或少在想是否会有更好的方法,因此是一个问题。

为什么我接受答案 我认为自由空间的答案最能说明为什么没有实时Linux系统是不可能实现的。


阅读 720

收藏
2020-06-07

共1个答案

小编典典

在主循环中轮询也不是解决问题的方法-您的进程可能不会获得太多的CPU时间,因此在您的代码开始运行之前,将经过10ms以上的时间,从而使其无意义。

10毫秒约为大多数非实时操作系统(RTOS)的标准计时器分辨率。但这在非RTOS中是没有意义的-
调度程序和调度程序的行为将极大地影响您对计时器到期的响应速度。例如,即使假设您有一个低于10ms的分辨率计时器,如果代码未运行,您也无法响应计时器到期。由于您无法预测代码何时运行,因此无法准确响应计时器到期。

当然有实时Linux内核,有关列表,请参见http://www.linuxdevices.com/articles/AT8073314981.html。RTOS提供了一些设施,通过这些设施,您可以在何时运行代码方面获得软性或硬性保证。这是可靠,准确地响应计时器到期等的唯一方法。

2020-06-07