【发布时间】:2011-10-23 16:48:05
【问题描述】:
这个问题不是关于在 Windows(XP 或更高版本)上准确计时,而是关于非常快速地通过回调或中断做某事。
我需要每隔 1 毫秒定期执行一次操作,最好是每 100 微秒执行一次。我需要做的是以这种速率驱动一些异步硬件(以太网)以向网络输出稳定的数据包流,并使该流看起来尽可能规则和同步。但如果问题可以与(以太网)设备分开,最好知道一般答案。
在您说“甚至不要考虑使用 Windows !!!”之前,先了解一下上下文。并非所有实时系统都有相同的需求。尽管需要平均每 10-16 毫秒左右处理一次音频或图像块,但大多数情况下,歌曲和视频在 Windows 上的播放是可以接受的。通过适当的缓冲,Windows 可以有其可变的延迟,但硬件可以在很大程度上不受它们的影响,并保持稳定的同步事件流发生。即便如此,我们大多数人都能容忍偶尔出现的故障。我的应用程序就是这样 - 可能相当宽容。
对我来说昂贵的选择是将我的整个应用程序移植到 Linux。但 Linux 只是在相同硬件上运行的不同软件,所以我强烈倾向于编写一些更好的软件,并坚持使用 Windows。我有幸消除所有竞争的硬件和软件(没有互联网或其他网络访问,没有其他应用程序运行等)。我是否有希望让 Windows 做到这一点?我会遇到什么限制?
我知道我的目标硬件有一个高性能事件定时器,并且这个定时器可以被编程为中断,但没有驱动程序。我可以写一个吗?那里有有用的例子吗?我还没有找到一个。这会干扰 QueryPerformanceCounter 吗?我将使用以太网设备这一事实是否意味着如果我明智地使用 select() 一切都会变得简单?
欢迎提供有用文章的指针 - 我发现了许多关于如何获得准确时间的概述,但除了使用相当于繁忙等待的情况外,还没有一个关于如何执行此类操作的概述。 有没有办法避免忙碌的等待?是否有内核模式或设备驱动选项?
【问题讨论】:
-
您可以尝试使用答案之一中提到的多媒体计时器,但这也取决于硬件。 Windows(和 Linux)根本就不是实时操作系统,也不能以 1 毫秒的规模做事。如果您不想切换到 RTOS,您最好尝试找到可以接受来自 Windows 应用程序的大量数据包缓冲区的以太网硬件,并每隔 1ms 或 100us 滴答声将这些数据包一点一点地发送出去。
-
非常好 - 对于我的具体情况,这听起来是一个非常有用的解决方案。关于什么以太网硬件可以做到这一点的任何提示?
-
我什至不知道这样的事情是否存在,我只是在抛出一个想法 :-) 你应该能够从 TI、摩托罗拉、PIC 等公司购买具有以太网端口并运行可以执行此操作的 RTOS。然后,您必须通过以太网或 RS232 从您的 PC 与它通信以传输数据。此解决方案涉及更多内容,而不是简单地编写 PC 应用程序,或找到可以满足您需求的现成硬件,因此这取决于您愿意为此投入的时间和精力。跨度>
-
更新 - 编辑问题以加粗强调。
-
如果你有一个多核,你可以分配一个核来做计时(旋转一个高分辨率时间源)。有关详细信息,请参阅this。
标签: c++ windows raw-ethernet