c++ - 使用 QueryPerformanceCounter() 倒计时

标签 c++ timer embedded windows-ce performancecounter

我在 this post 中找到了有关使用 QueryPerformanceCounter 的有用信息但我面临一个我还没有找到答案的问题。

我正在为 Windows CE 6.0 开发一个应用程序,需要 GetTickCount 可以提供的更好的分辨率。这就是我选择 QueryPerformanceCounter 函数的原因。

我观察到我得到的计数器值来回变化。虽然这不是最终的应用程序,但这个小例子说明了问题:

int i;
BOOL bRet;
LARGE_INTEGER liCounter;


for ( i = 0; i < 100; i++)
{
    bRet = QueryPerformanceCounter(&liCounter);
    if(bRet)
    {
        printf("Counter Value: %llu \n", liCounter.QuadPart);
    }

}

它打印一系列 100 个计数器值,这些值预计是递增的。然而,有一些计数器值相对于先前的值递减。例如:

...

计数器值:6536266821

计数器值:6536266262

计数器值:6536266604

...

此行为是有问题的,因为在最终应用程序 (endCounterValue-startCoutnerValue) 中执行了类型操作,并且在相同情况下发现了负时间间隔。

我已阅读 ( here ) 使用多核平台时会发现此问题。然而,情况并非如此,因为 Windows CE 6.0 不支持多核处理。

如果您能帮助找出发生这种情况的原因和/或避免此问题的任何解决方法,我们将不胜感激。

[编辑]

我编辑问题以包含更多信息:

更长的连续读取列表(与上面的列表不同):

计数器值:15234261579

计数器值:15234261594

计数器值:15234261609

计数器值:15234261624

计数器值:15234261640

计数器值:15234261064

计数器值:15234261079

计数器值:15234261094

计数器值:15234261109

计数器值:15234261125

计数器值:15234261140

计数器值:15234261155

计数器值:15234261170

计数器值:15234261185

计数器值:15234261201

计数器值:15234261216

计数器值:15234261231

计数器值:15234261246

在硬件方面,使用了 Intel Celeron 1047UE 处理器和 HM76 芯片组。

调用 QueryPerformanceFrequency 时,读取 1.19MHz 频率。

最佳答案

QueryPerformanceCounter 导致 OAL(BSP 的一部分)内部的调用,其中系统中可用的最高分辨率累进计数器应该用于返回 64 位值。 看起来像是那个特定 BSP 的问题。 在 x86 上,硬件计时器的数量是有限的,并且可能是某些驱动程序正在使用 QueryPerformanceCounter 使用的计数器来使计时器的分辨率小于 1ms。看起来这个值被重新设置然后继续增加,这可能是由于驱动程序为自己设置了一个定时器(可能只使用定时器寄存器的低 32 位部分)。 如果您有 BSP 的源代码,您可以搜索 OEMQueryPerformanceCounter 实现,检查正在使用的寄存器并检查 BSP 的其他组件是否正在访问它们(或可能影响其操作性的其他寄存器)。

关于c++ - 使用 QueryPerformanceCounter() 倒计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27419223/

相关文章:

java - 如何在android中使用计时器设置进度条?

linux - 适用于嵌入式设备的视频 session 堆栈

c++ - 如何在 C++ 中挂起一个程序,然后将其挂起 "unhang"

c++ - 混淆 C++ 中的变量和函数名称以防止基本逆向工程

c++ - For Loop 通过乘法打印出 10 个值

c - 在 'C' 代码中使用链接器命令文件变量的绝对值

c - C 嵌入式软件中的查找表与开关

c++ - 使用 FOR 循环将数据放入 ref 数组

c++ - 我的 List<T> 实现有什么问题?

c# - 计时器 Tick 事件突然不起作用