如何实现微秒级的精确延时(在WIN95/98)中?(100分)

  • 主题发起人 主题发起人 陈新龙
  • 开始时间 开始时间

陈新龙

Unregistered / Unconfirmed
GUEST, unregistred user!
本人需要0.1、1微秒级的精确延时函数(控件)或方法,请你帮我。用于硬件控制。
 
用gettickcount(?)可以的。
程序员大本营有例子
 
邹光先:我找了半天也找到请问你说的例子在哪里。
 
<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=128073">
有例子!</a>
 
如果要求较高,
建议你最好是买一块包含8253或8254的计数卡,
再用VxD技术处理。
将时间控制交给硬件处理,比较安全可靠。
 
var my event:thandle;
......
myenent:=createevent(nil,true,false,nil);
waitforsingleobject(myevent,100);
use api32 to wait nul event to 100ms,
allright.
 
amo 的建议不错,呵呵,不过,硬件供应商是否提供软件接口呢?
一般系统时钟如果达不到,那么什么软件都没用的说。
 
to 邹光先:
gettickcount可以么,仔细看一下
这个函数的说明,只能到毫秒级。
to amo:
好象8253,8254也达不到微秒级(10e-6)吧?
 
用空指令? 那得根据cpu时钟频率来做了. 算出每微妙执行指令数. 做个空指令循环?
似乎不行, 谁叫windows是多任务的呢
 
procedure Delay(Sec: DWORD);
var
StartTickCount: DWORD;
begin
StartTickCount:=GetTickCount;
while (GetTickCount-StartTickCount)<=Secdo
;
end;
 
感谢各位的帮助
 
各位对不起我现在没分了,先欠着。
 
CJ:
如果不提供,就打他的屁屁!
嘻嘻,别小看,这种板子如果是用于工控的话,通常是1千¥的报价,
所以一定会提供驱动的!
实再不行,只要提供了中断号和I/O地址及含义,直接I/O口编程也没什么大不了的!
 
我找了一个c++builder的例子,希望对你有帮助。
虽然Win95下可视化开发工具如VC、Delphi、C++ Builder等都
有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功
能,但最小计时精度仅为55ms,且定时器消息在多任务操作系统中的
优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应
用。不过Microsoft公司在Win32 API函数库中已经为用户提供了一组
用于高精度计时的底层函数,如果用户使用得当,计时精度可到1ms。
这个计时精度、对于一般的实时系统控制完全可以满足要求。现将由
C++ Builder 4.0提供的重新封装后的一组与时间相关的主要接口函
数(函数名、参数、功能与Win32 API基本相同)说明如下:
  1.DWORD timeGetTime(void)
  返回从Windows启动开始经过的毫秒数。最大值为232,约49.71
天。
  2.MMRESULT timeSetEvent(
  UINT uDelay,
  UINT uResolution,
  LPTIMECALLBACK lpTimeProc,
  DWORD dwUser,
  UINT fuEvent
   )
  该函数设置一个定时回调事件,此事件可以是一个一次性事件或
周期性事件。事件一旦被激活,便调用指定的回调函数,成功后返回
事件的标识符代码,否则返回NULL。参数说明如下:
  uDelay:以毫秒指定事件的周期。
  UResolution:以毫秒指定延时的精度,数值越小定时器事件分辨
率越高。缺省值为1ms。
  LpTimeProc:指向一个回调函数。
  DwUser:存放用户提供的回调数据。
  FuEvent:指定定时器事件类型:
  TIME_ONESHOT:uDelay毫秒后只产生一次事件
  TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。
  3.MMRESULT timeKillEvent(UINT uTimerID)
  该函数取消一个指定的定时器回调事件。uTimerID标识要取消的
事件(由timeSetEvent函数返回的标识符)。如果成功则返回
TIMERR_NOERROR,如果定时器时间不存在则返回MMSYSERR_INVALPARAM

  void CALLBACK TimeProc(
  UINT uID,
  UINT uMsg,
  DWORD dwUser,
  DWORD dw1,
  DWORD dw2
   );
  该函数是一个应用程序定义的回调函数,出现定时器事件时该函
数被调用。TimeProc是应用程序定义的函数名的占位符。使用该函数
时要注意的是,它只能调用以下有限的几组API函数:PostMessage,
timeGetSystemTime, timeGetTime, timeSetEvent,timeKillEvent
,midiOutShortMsg, midiOutLongMsg,OutputDebugString。同时也
不要使用完成时间很长的API函数,程序尽可能简短。
  使用以上一组函数就可以完成毫秒级精度的计时和控制(在C++
Builder中使用时要将头文件mmsystem.h加到程序中)。由于将定时控
制精确到几毫秒,定时器事件将占用大量的CPU时间和系统资源,所以
在满足控制要求的前提下,应尽量将参数uResolution的数值增大。而
且定时器实时控制功能完成后要尽快释放。
因为没有时间,没有改他。你自己完成吧
 
liukeen:
8253的计数频率为2MHz, 8254的计数频率为10MHz.
你想达到多高的精度?
 
邹光先:
搞清楚别人的精度是10e-7秒,
,你的一堆代码没用的。
 
嘿嘿,真巧
到urus.163.net得delphi栏里去载一个supertim.zip吧
鄙人陋作,精度可到0.01微妙。适用于delphi3
 
见DecodeTime,EncodeTime,gettickcount的帮助说明。
 
urus:
我已下载SuperTimer.zip,在安装编译中出现一些错误:
superTimer.pas[59]:record,object or class type repuired
superTimer.pas[59]:record,object or class type repuired
superTimer.pas[59]:statement expected,but expression of type 'integer'found
superTimer.pas[59]:record,object or class type repuired
superTimer.pas[59]:record,object or class type repuired
superTimer.pas[94]:statement expected,but expression of type 'real'found
请问如何解决?
 
urus:
精度可到0.01微妙
---
|-----10纳秒?(我记不清1微秒等于多少纳秒了)
---------------用软件可以达到如此精度吗?
一般老内存条的速度是60或70纳秒呀!
 
后退
顶部