阅读:5828回复:5
请问:关于KeSetTimer(...)的定时精度?
被这个问题折腾坏了。我想要做一个纯软件的东西,使用Win2000的DDK,目的是准确的产生几个频率值,频率倒是不高,10个HZ左右,但是对精度要求比较高,千分之一左右,这样对定时器的精度就比较严格了,不知道有没有谁使用过这个定时器函数,我用过以后发现,虽然微软在这里带有欺骗性地说DueTime的单位是100ns,但是精度也就1ms而已,低于1ms根本就不准,而且这两天似乎1ms都不准了。使用过的大虾或者有经验者请指教!多谢了!
|
|
最新喜欢:jlj |
沙发#
发布于:2001-05-17 16:21
KeSetTimer的精度达不到100ns,它的精度你可以用KeQueryPerformanceCounter()来测试。
|
|
板凳#
发布于:2001-05-17 16:32
我感觉KeSetTimer的精度在10ms左右,所以,使用KeSetTimer是不行的啦。
不知道你的程序允许不允许用轮询的方式来实现这个时钟,如果可以的话,可以在一个循环里不停的调用下面的函数直到超时再调用相关处理函数。 ULONG QuerySystemTime() { LARGE_INTEGER CurTime, Freq; CurTime = KeQueryPerformanceCounter(&Freq); return (ULONG)((CurTime.QuadPart * 1000)/Freq.QuadPart); } 这个函数的精度为1ms,稍加修改,应该可以有更高的精度。 |
|
地板#
发布于:2001-05-17 21:27
[QUOTE]原本由 lao_o 发表
[B]我感觉KeSetTimer的精度在10ms左右,所以,使用KeSetTimer是不行的啦。 不知道你的程序允许不允许用轮询的方式来实现这个时钟,如果可以的话,可以在一个循环里不停的调用下面的函数直到超时再调用相关处理函数。 ULONG QuerySystemTime() { LARGE_INTEGER CurTime, Freq; CurTime = KeQueryPerformanceCounter(&Freq); return (ULONG)((CurTime.QuadPart * 1000)/Freq.QuadPart); } 这个函数的精度为1ms,稍加修改,应该可以有更高的精度。 [/B][/QUOTE] 在WDM里面?你在哪个函数里轮询? |
|
|
地下室#
发布于:2009-04-14 20:14
经过精确测试,该函数定时精度为15.625ms,而且以15.625ms为单位
|
|
5楼#
发布于:2009-04-14 20:19
8HZ,16HZ---64HZ是可以精确实现的,其精度就是15.625ms,但是15.625也是很准确的,误差在1us之内
如果哪位高手有更高精度的定时器,不妨提供出来。 PS:有没有通过QuerySystemTime()来设计一个定时器的? |
|