【发布时间】:2012-01-19 15:51:06
【问题描述】:
我正在使用 Windows XP 上的 Visual Studio 开发控制台 C++ 应用程序,该应用程序必须为调度程序提供尽可能高的优先级。
int main()
{
while ( somecondition )
{
// pick data from external hardware every 10 milliseconds
// do computation
}
}
我的意思是没有其他系统进程应该干扰它,因为它是一个实时数据采集系统,每 10 毫秒刷新一次帧缓冲区。
我尝试将每帧的时间长度保存到文件中,但在我想要的时间附近发现了一个奇怪的“量化”。为什么?
我还发现有时长度是我的基本帧时间的倍数,这是由干扰内部操作系统引起的吗?进程?
有没有办法确保我的程序具有最高优先级?
【问题讨论】:
-
记住几件事。首先,Windows XP 不提供实时保证,即使对于“实时”优先级也是如此,因此理论上您无法实现您想要的(实际上,您的里程可能会有所不同)。其次,写入文件会在您的测量中引入 巨大 偏差。可能只是你看到的“量化”其实是I/O系统造成的。
-
那么在这种情况下测量时序的方法应该是什么?将 delta t 附加到列表中,当程序完成时,刷新它?
-
这可能会引入更小(且更可预测)的偏差,特别是如果列表是预先分配的。您也可以定期刷新它,这甚至可以让您测量文件偏差。如果您愿意,可以使用一些技术来衡量偏差本身(尽管这不会帮助您保持 10 毫秒的时间范围)。
-
通常使用驱动程序和相关的缓冲区和信号来进行此类操作。您的硬件接口如何工作?视频 I/O 通常是延迟和帧速率之间的权衡——如果没有大量“松弛”——驱动程序、线程和帧缓冲区队列,很难维持高帧速率。磁盘写入相同 - 在没有排队/延迟的情况下“实时”写入文件通常是不可能的,尤其是在旋转媒体的情况下。
-
我的硬件接口是一个与红外跟踪系统通信的 PCI 卡,而我的程序是用 Glut 编写的,需要在硬盘上保存每一帧标记位置的信息。
标签: c++ process real-time win32-process