gpt4 book ai didi

c++ - C 或 C++ 中的亚毫秒精度计时

转载 作者:可可西里 更新时间:2023-11-01 15:39:21 29 4
gpt4 key购买 nike

在 C 或 C++ 中获取亚毫秒精度计时数据的技术/方法有哪些,它们提供的精度和准确度如何?我正在寻找不需要额外硬件的方法。该应用程序需要等待大约 50 微秒 +/- 1 微秒,同时某些外部硬件会收集数据。

编辑:操作系统是 Wndows,可能是 VS2010。如果我可以在 Linux 上获得硬件的驱动程序和 SDK,我可以使用最新的 GCC 去那里。

最佳答案

在处理现成的操作系统时,准确计时是一项极其困难和复杂的任务。如果您真的需要保证时序,唯一真正的选择是一个完整的实时操作系统。但是,如果“几乎总是”足够好,您可以使用以下一些技巧,它们将在商品 Windows 和 Linux 下提供良好的准确性

  1. 使用 Sheilded CPU基本上,这意味着关闭选定 CPU 的 IRQ 亲和性并为机器上的所有其他进程设置处理器亲和性掩码以忽略 objective-c PU。在您的应用程序上,将 CPU 亲和性设置为仅在您的屏蔽 CPU 上运行。实际上,这应该可以防止操作系统暂停您的应用程序,因为它始终是该 CPU 唯一可运行的进程。
  2. 永远不要让您的进程自愿将控制权交给操作系统(对于非实时操作系统而言,这在本质上是不确定的)。没有内存分配,没有套接字,没有互斥锁,nada。使用 RDTSC 在等待目标时间到达的 while 循环中旋转。它会消耗 100% 的 CPU,但这是最准确的方法。
  3. 如果数字 2 有点太龙了,你可以“睡一会儿”,然后将 CPU 消耗到你的目标时间。在这里,您可以利用操作系统按设定的时间间隔调度 CPU 的事实。通常每秒 100 次或每秒 1000 次,具体取决于您的操作系统和配置(在 Windows 上,您可以使用多媒体 API 将默认调度周期 100/s 更改为 1000/s)。这可能有点难以正确,但基本上您需要确定操作系统调度周期何时发生并计算目标唤醒时间之前的周期。在此期间休眠,然后在醒来时启动 RDTSC(如果您使用的是单个 CPU...请使用 QueryPerformanceCounter 或 Linux 等价物,如果不是),直到您的目标时间到达。偶尔,操作系统调度会导致你错过,但一般来说,这种机制效果很好。

这似乎是一个简单的问题,但是您的时序约束越严格,获得“良好”时序的难度就会成倍增加。祝你好运!

关于c++ - C 或 C++ 中的亚毫秒精度计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2904887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com