阅读:5177回复:21
用VC可否实现5微秒的延迟(A/D转换时要求的)?
如题
|
|
最新喜欢:![]() |
沙发#
发布于:2001-07-14 22:39
ok, 由于精度为微秒级,请采用多媒体定时器的方式 ,正常的定
时器是1ms的。 也可采用汇编编程,我曾经也这样做过。 |
|
板凳#
发布于:2001-07-14 22:45
我记得几年前的《计算机世界》上有篇文章讨论到Win32用户模式的精确定时问题,好像是在多媒体处理的部分有着个函数,你不妨在这方面找一找。Window的定时器在100ms级可用。
|
|
|
地板#
发布于:2001-07-15 13:15
在WIN32用户模式下,有一个函数你可试一试:
VOID Sleep( DWORD dwMilliseconds );// sleep time in milliseconds 可在毫秒级延迟, 至于在 kernel mode 下,我不太清楚了。 |
|
地下室#
发布于:2001-07-15 19:19
在内核模式中,好象没有类似于Ring 3层的Sleep函数。
我考虑是否使用定时器来保证一段时间的延迟,不知各位有何高见。 |
|
|
5楼#
发布于:2001-07-17 15:18
在内核模式下许多函数的timeout时间都是100纳秒为单位的,你可以考虑使用他们来实现5微秒的延时,另外多媒体时钟的最小单位也是毫秒级的,不可以使用。
提供一个参考的函数你自己去查一下msdn了解具体用法 BOOLEAN KeSetTimer( IN PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc /* optional */ ); |
|
6楼#
发布于:2001-07-18 12:23
用KeDelayExecutionThread内核函数
NTSTATUS KeDelayExecutionThread( IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval ); interval以100ns为单位。 |
|
|
7楼#
发布于:2001-07-18 17:02
多媒体定时器的精度为1ms.要实现5us的定时精度,多半都要采用内核定时器的方案。
|
|
8楼#
发布于:2001-07-19 11:27
用rdtsc这条汇编指令读取当前的时钟计数
unsigned int tsc1; unsigned int tsc2; #define rdtsc __asm _emit 0x0f __asm _emit 0x31 _asm rdtsc; _asm mov tsc1,eax; _asm mov tsc2,edx; 这个精度高,但是条件是你必须先用软件检测出机器时钟(可以读注册表),用一小段程序循环就可得到5微秒的定时精度。 内核定时器号称100ns,实际上达不到 |
|
9楼#
发布于:2001-08-18 11:58
我曾经用QueryPerformanceFrency和QueryPerformanceCounter两个
winapi函数实现过微秒级定时,如果你机器配置好,其定时精度完全 可以达到1微秒 两个函数具体应用可看msdn. |
|
10楼#
发布于:2001-08-20 13:15
dazzy 的方法最易精确控制.
|
|
11楼#
发布于:2001-08-20 13:59
用户被禁言,该主题自动屏蔽! |
|
12楼#
发布于:2001-09-11 22:35
我是搞硬件的,也想提一些意见:
(1)我也赞成使用CPU的指令周期作为定时基准,计算该定时基准时只能使用寄存器操作指令,不要涉及存储器和外部I/O访问,以免因系统时序的原因导致计算结果不精确。 (2)延时程序也要只使用寄存器操作指令,并且执行过程中要禁止中断---CLI,5us不响应中断对一般的中断请求是可以接受的。 (3)Sleep等函数应该用到了系统的实时钟硬中断,靠中断来定时要考虑中断响应的延时时间。 (4)如果软件无法达到要求,只能修改硬件,让硬件定时器来完成控制操作。 |
|
|
13楼#
发布于:2003-05-14 15:35
请问dazzy:win2000下一样能用嵌入汇编指令到VC中吗?
还有:我在MSDN中根本找不到有关 QueryPerformanceFrency和KeSetTimer的主题? 仁兄们能多赐教几句? 在下感激不尽! [编辑 - 5/14/03 by cszhaoqm] [编辑 - 5/14/03 by cszhaoqm] |
|
14楼#
发布于:2003-05-14 18:13
请问dazzy:win2000下一样能用嵌入汇编指令到VC中吗? |
|
15楼#
发布于:2003-05-15 15:12
是的,是我犯了一个低级错误,MSDN中只打开了VC选项!
Sleep()的应用出这样的问题代码如下: void CSSDlg::OnTest() { //test按钮响应 // TODO: Add your control notification handler code here for(int m=0;m<100;m++) { UpdateData();//这一句有没有一样的结果 m_iNo=m; //编辑框控件对应成员变量 UpdateData(FALSE); Sleep(10); } } 程序执行时看不出每一个数字递增的延时,并不是间隔太小(加大Sleep()间隔一样的结果!),而是在全部延时完后,数字从0变到99 [编辑 - 5/15/03 by cszhaoqm] [编辑 - 5/15/03 by cszhaoqm] |
|
16楼#
发布于:2005-03-27 22:16
看了上面大侠的高见我受益匪浅。多谢大家的指点。
不过我想问一下dazzy的方法中 如果用程序循环的话会不会有问题? 如果用指令进行循环的话 那windows是多任务的 延时程序那个线程不是独占cpu那样结果会不会被延长? 再者如果用循环读计数值的方法那每循环一次都要执行一些指令这些指令的时间是不是也要算进去? 能不能利用中断呢? 我是新手也许问的问题方式不对 也许有些弱智 请大家多多包涵。先行谢过了! |
|
17楼#
发布于:2005-04-06 17:06
在应用程序级无从谈起精确, 不过有时似是而非的定时确实可以达到你要求的定时效果. 但是WINDOW无法保证你的定时可以准确的到达. WINDOW是多任务的, 任务是需要不断的切换的. 这一点,就可能使得你的定时不在准确
http://guoj.blog.edu.cn/ |
|
|
18楼#
发布于:2005-05-09 19:53
这里高手真多呀,佩服
|
|
19楼#
发布于:2005-05-12 14:43
Retsc 最简单了
|
|
上一页
下一页