C或C++中的亚毫秒精度时序

and*_*and 10 c c++ time

有哪些技术/方法可以用C或C++获得亚毫秒级的精确定时数据,它们提供的精度和准确度如何?我正在寻找不需要额外硬件的方法.该应用程序涉及等待大约50微秒+/- 1微秒,而一些外部硬件收集数据.

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

Rak*_*kis 14

在处理现成的操作系统时,准确的计时是一项非常困难且涉及的任务.如果你真的需要保证时间,唯一真正的选择是一个完整的实时操作系统.但是,如果"几乎总是"足够好,可以使用一些技巧,在商用Windows和Linux下提供良好的准确性

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

这似乎是一个简单的问题,但是当你的时序限制越来越严格时,获得"好"的时间会越来越困难.祝好运!


Ash*_*ain 5

硬件(因此分辨率)因机器而异.在Windows上,特别是(我不确定其他平台),你可以使用QueryPerformanceCounterQueryPerformanceFrequency,但要注意你应该从同一个线程调用这两个并且没有关于解决方案的严格保证(QueryPerformanceFrequency被允许返回0意味着没有高分辨率计时器可用).但是,在大多数现代桌面上,应该有一个精确到微秒.