【问题标题】:real time intervals in C/C++C/C++ 中的实时间隔
【发布时间】:2011-06-24 10:23:27
【问题描述】:
  1. 可以在 C/C++ 中的非实时 Linux 应用程序中创建实时间隔吗?

我正在编写一个 ADC 模拟器。这是一个以特定频率生成包的应用程序。重要的是,封装生成的频率尽可能接近 ADC 的采样率。为什么我不想使用sleep() 和usleep() 来设置包生成时间间隔。

谢谢。

【问题讨论】:

    标签: c linux real-time


    【解决方案1】:

    可以在 C/C++ 中的非实时 Linux 应用程序中创建实时时间间隔吗?

    不...如果是的话,那将是一个实时 Linux 系统。

    也就是说,您可能会非常接近,所以这取决于您的间隔和公差。子时间片精度的唯一重要选择是将发送线程固定到核心并让它旋转,同时将其他处理远离该核心,但这非常浪费硬件......

    如果您能够承受足够长的延迟以重新安排您的发送代码,那么您可以考虑设置警报和信号处理程序,但这可能会大大增加延迟,也许仅在相对罕见的情况下内核具有都以其他方式使用。要评估其效果如何,您必须在实际系统负载下进行实际测量。

    【讨论】:

      【解决方案2】:

      数据包生成器不应与数据包发送者在一起。
      如果您希望数据包按时发送,您应该事先创建数据包,然后将它们发送给packer sender。

      因此,您需要一个带有工作队列的线程,并在该线程上使用睡眠来按时发送数据包。 (你可以看看boost's sleep())

      【讨论】:

      • 不,一点也不。 sleep 尽可能地是非实时的。在timerfd 上阻止是尽可能接近实时的。这将尽可能准确(如果支持,则使用 HPET),并且尽可能高效(旁注:实时系统与非实时系统的不同之处不一定在于更快或更具响应性,但在于它给出了有保证的上限。)
      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多