我知道我可以使用IRQ0,这是系统定时器,但这是基于14.31818MHz的时钟,对吧?有什么能提供更高的精确度吗?
感谢。
编辑:有谁知道Windows函数QueryPerformanceCounter使用了什么?
答案 0 :(得分:2)
“精确度”和“准确度”意味着不同的东西。 “地球的周长是40000.000000000 km”是准确的,但不准确。时钟有点复杂:
即使“系统计时器”(根据维基百科的PIT)以1.something MHz运行,通常也会使IRQ0介于100和1000 Hz之间。 Apparently您也可以从端口0x40读取两次以获取当前计数器值,但我不确定它具有什么样的延迟(然后在下一次中断之前获得计数,所以你需要做一些数学)。它也不适用于更现代的“无滴答”内核。
还有一些其他高频定时器:
Darwin (i.e. OS X)似乎假设TSC频率没有改变,并且当从TSC未运行的睡眠状态(显然是C4和更高)唤醒时调整添加到它的基值。每个CPU有不同的基值,因为TSC不需要跨CPU同步。你必须付出合理的努力来获得合理的时间戳。
IIRC,Linux只选择一个时钟源(TSC,如果它是理智的,然后是HPET,然后是ACPI PM,我想)。IIRC,QueryPerformanceCounter()使用Windows认为最好的任何东西。它在某种程度上也取决于Windows版本(据说XP不支持HPET用于中断,因此可能也不支持时间戳)。您可以调用QueryPerformanceFrequency()进行猜测(我得到1995030000,这可能意味着它是TSC)。
答案 1 :(得分:1)
英特尔处理器通常通过rdtsc指令提供高精度定时器信息。
它的精度远高于14MHz¹。需要注意的是,它可能会在多核和速度步进处理器上出现问题。
编辑: This question有关于此主题的更多详细信息。
1.实际频率取决于处理器 - 但通常是处理器频率。显然,在Nehalem处理器上,TSC以前端总线频率(133 MHz)运行。 功能