阅读:1532回复:12
请教:如何用VXD实现微秒级的定时? |
|
最新喜欢:![]() |
沙发#
发布于:2002-04-22 10:22
DWORD VTD_Delay(
DWORD Ticks ); 使处理器延迟 Ticks――Length of interval to stall. Units are 838 nanoseconds. 你是要Delay还是定时CallBack呀? |
|
板凳#
发布于:2002-04-22 20:55
请问有何区别?
|
|
地板#
发布于:2002-04-22 21:21
VTD_Delay是处理器Delay,空等你设定的时间,可达到微秒级的长度;而让系统定时回调不可能只间隔几或数十微秒(我不知你是不是仅指精度为微秒级,这也不大可能,因为回调本就费时,控制到你的程序时已不准确,而且精度微秒级的回调也没什么用。如果你实在想试试,可使用APIC中的定时器,并在IDT中装载自己的处理例程)
|
|
地下室#
发布于:2002-04-23 09:37
If u want to have the 0.000001sec.
1.Simulate by Math. 2.Program the 8254 Timer. |
|
|
5楼#
发布于:2002-04-23 10:37
If u want to have the 0.000001sec.
1.Simulate by Math. 2.Program the 8254 Timer. ―――――――――――――――――――――――――――――――――――― 讨论一下: 要得到微秒级的间隔,应用循环的方式让处理器Delay,系统提供了这种函数。而用可编程时钟在中断的过程就会造成很大差异,更何况8254是目前单CPU机器操作系统的脉搏,不应该对其进行修改(事实上8254最小可设时间间隔刚刚小于1微秒,几乎达到极限,在这么短的时间里且不说中断的费时,光就操作系统没法进行必需的时钟中断处理就是致命的。) 要得到微秒级精度的回调(本没必要,系统提供的服务是毫秒级的),基于上面的理由,用8254亦不行。只要你不是SMP机器 ,就可用APIC片内时钟,精度也比8254高的多,在单CPU上也不会影响操作系统。 |
|
6楼#
发布于:2002-04-23 11:09
If u want to have the 0.000001sec. BINGO~~U r the pro^^ It\'s ez to GetTickCount about 0.000001s. But if u want to Callback like KeSetTimer,it\'s hard!!! Because the Win32 isn\'t RTOS(inc poor RTNT.) May be using external trigger like OSC. |
|
|
7楼#
发布于:2002-04-23 11:51
―――――――――――――――――――――――――――――――――――― 现在的Windows操作系统已经不用系统定时器(8254)进行任务调度了,实际上,系统定时器(8254)在现在的Windows操作系统中是空闲的,缺省情况下,系统定时器(8254)产生的中断是不能路由到处理器的INTR引脚。也就是说,我们可以用系统定时器(8254)做任何喜欢的事情,至少在我的机器上是的。我的机器是P4 1.5GHz/854主板/Windows 2000 Build 2195,我在我的机器上就实现了10us的定时,而且还是比较精确的。我是通过HOOK系统定时器(8254)的中断向量实现的,最重要的就是,你可以用系统定时器(8254)做任何事情,而不会对系统产生任何影响。 |
|
8楼#
发布于:2002-04-23 12:12
我的机器是P4 1.5GHz/854主板/Windows 2000 Build 2195
―――――――――――――――――――――――――――――――――――― 这么说来单CPU上2000以上系统都改用APIC了?这么说来“兄弟变速器”在Windows 2000 Build 2195以后的系统就报废了,呵呵 那我以前在nt上用片内时钟定时的程序在2000反而不行了呀,我去试试 |
|
9楼#
发布于:2002-04-23 16:02
但是并不能说明Windows 2000就是用APIC片内的定时器来实现多任务调度的。因为我发现Windows 2000在IRQL=28(CLOCK2_LEVEL)的中断处理程序中读写了CMOS实时时钟端口(70H/71H),而IRQL=28说明了系统正在处理系统时钟中断。这怎么解释呢?如果说Windows 2000是用APIC片内的定时器来实现多任务调度的话,那只能说读写CMOS实时时钟端口是为了刷新系统日时钟。不过APIC片内好象有两个定时器啊,我想Windows 2000顶多也就用其中一个吧!
|
|
10楼#
发布于:2002-04-23 16:16
Windows 2000在IRQL=28(CLOCK2_LEVEL)的中断处理程序中读写了CMOS实时时钟端口(70H/71H),只能说读写CMOS实时时钟端口是为了刷新系统日时钟
______________________________________________________________ 读写CMOS实时时钟端口除了校正系统日时钟外好像本来就没什么用,呵呵 |
|
11楼#
发布于:2002-04-23 16:24
也许还有一种可能,那就是Windows 2000根本就是使用CMOS实时时钟中断来进行任务调度的。我有一次在用WinDriver监听IRQ8时,系统就停止响应,而IRQ8就是CMOS实时时钟中断。
|
|
12楼#
发布于:2002-04-23 17:14
唔,不错
|
|