【发布时间】:2011-06-24 10:23:27
【问题描述】:
- 可以在 C/C++ 中的非实时 Linux 应用程序中创建实时间隔吗?
我正在编写一个 ADC 模拟器。这是一个以特定频率生成包的应用程序。重要的是,封装生成的频率尽可能接近 ADC 的采样率。为什么我不想使用sleep() 和usleep() 来设置包生成时间间隔。
谢谢。
【问题讨论】:
我正在编写一个 ADC 模拟器。这是一个以特定频率生成包的应用程序。重要的是,封装生成的频率尽可能接近 ADC 的采样率。为什么我不想使用sleep() 和usleep() 来设置包生成时间间隔。
谢谢。
【问题讨论】:
可以在 C/C++ 中的非实时 Linux 应用程序中创建实时时间间隔吗?
不...如果是的话,那将是一个实时 Linux 系统。
也就是说,您可能会非常接近,所以这取决于您的间隔和公差。子时间片精度的唯一重要选择是将发送线程固定到核心并让它旋转,同时将其他处理远离该核心,但这非常浪费硬件......
如果您能够承受足够长的延迟以重新安排您的发送代码,那么您可以考虑设置警报和信号处理程序,但这可能会大大增加延迟,也许仅在相对罕见的情况下内核具有都以其他方式使用。要评估其效果如何,您必须在实际系统负载下进行实际测量。
【讨论】:
数据包生成器不应与数据包发送者在一起。
如果您希望数据包按时发送,您应该事先创建数据包,然后将它们发送给packer sender。
因此,您需要一个带有工作队列的线程,并在该线程上使用睡眠来按时发送数据包。 (你可以看看boost's sleep())
【讨论】:
sleep 尽可能地是非实时的。在timerfd 上阻止是尽可能接近实时的。这将尽可能准确(如果支持,则使用 HPET),并且尽可能高效(旁注:实时系统与非实时系统的不同之处不一定在于更快或更具响应性,但在于它给出了有保证的上限。)