youngchun
驱动牛犊
驱动牛犊
  • 注册日期2002-04-21
  • 最后登录2005-06-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1532回复:12

请教:如何用VXD实现微秒级的定时?

楼主#
更多 发布于:2002-04-21 12:52

最新喜欢:

flyfoxflyfox
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-22 10:22
DWORD VTD_Delay(
   DWORD Ticks
);

使处理器延迟
Ticks――Length of interval to stall. Units are 838 nanoseconds.

你是要Delay还是定时CallBack呀?
youngchun
驱动牛犊
驱动牛犊
  • 注册日期2002-04-21
  • 最后登录2005-06-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-22 20:55
请问有何区别?
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-22 21:21
VTD_Delay是处理器Delay,空等你设定的时间,可达到微秒级的长度;而让系统定时回调不可能只间隔几或数十微秒(我不知你是不是仅指精度为微秒级,这也不大可能,因为回调本就费时,控制到你的程序时已不准确,而且精度微秒级的回调也没什么用。如果你实在想试试,可使用APIC中的定时器,并在IDT中装载自己的处理例程)
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-23 09:37
If u want to have the 0.000001sec.
1.Simulate by Math.
2.Program the 8254 Timer.
Taiwan's Driver Developer
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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上也不会影响操作系统。
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-23 11:09
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上也不会影响操作系统。


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.
Taiwan's Driver Developer
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-04-23 11:51
――――――――――――――――――――――――――――――――――――
讨论一下:
要得到微秒级的间隔,应用循环的方式让处理器Delay,系统提供了这种函数。而用可编程时钟在中断的过程就会造成很大差异,更何况8254是目前单CPU机器操作系统的脉搏,不应该对其进行修改(事实上8254最小可设时间间隔刚刚小于1微秒,几乎达到极限,在这么短的时间里且不说中断的费时,光就操作系统没法进行必需的时钟中断处理就是致命的。)
要得到微秒级精度的回调(本没必要,系统提供的服务是毫秒级的),基于上面的理由,用8254亦不行。只要你不是SMP机器
,就可用APIC片内时钟,精度也比8254高的多,在单CPU上也不会影响操作系统。


现在的Windows操作系统已经不用系统定时器(8254)进行任务调度了,实际上,系统定时器(8254)在现在的Windows操作系统中是空闲的,缺省情况下,系统定时器(8254)产生的中断是不能路由到处理器的INTR引脚。也就是说,我们可以用系统定时器(8254)做任何喜欢的事情,至少在我的机器上是的。我的机器是P4 1.5GHz/854主板/Windows 2000 Build 2195,我在我的机器上就实现了10us的定时,而且还是比较精确的。我是通过HOOK系统定时器(8254)的中断向量实现的,最重要的就是,你可以用系统定时器(8254)做任何事情,而不会对系统产生任何影响。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-23 12:12
我的机器是P4 1.5GHz/854主板/Windows 2000 Build 2195
――――――――――――――――――――――――――――――――――――
这么说来单CPU上2000以上系统都改用APIC了?这么说来“兄弟变速器”在Windows 2000 Build 2195以后的系统就报废了,呵呵
那我以前在nt上用片内时钟定时的程序在2000反而不行了呀,我去试试
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
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顶多也就用其中一个吧!
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-23 16:16
Windows 2000在IRQL=28(CLOCK2_LEVEL)的中断处理程序中读写了CMOS实时时钟端口(70H/71H),只能说读写CMOS实时时钟端口是为了刷新系统日时钟
______________________________________________________________
读写CMOS实时时钟端口除了校正系统日时钟外好像本来就没什么用,呵呵
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-04-23 16:24
也许还有一种可能,那就是Windows 2000根本就是使用CMOS实时时钟中断来进行任务调度的。我有一次在用WinDriver监听IRQ8时,系统就停止响应,而IRQ8就是CMOS实时时钟中断。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-23 17:14
唔,不错
游客

返回顶部