RadAsm
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5172回复:21

用VC可否实现5微秒的延迟(A/D转换时要求的)?

楼主#
更多 发布于:2001-07-14 22:26
如题

最新喜欢:

meteormeteor
nigx
驱动巨牛
驱动巨牛
  • 注册日期2001-04-29
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分14166分
  • 威望71910点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-07-14 22:39
ok, 由于精度为微秒级,请采用多媒体定时器的方式 ,正常的定

时器是1ms的。


也可采用汇编编程,我曾经也这样做过。
abeh
驱动牛犊
驱动牛犊
  • 注册日期2001-04-10
  • 最后登录2003-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-07-14 22:45
我记得几年前的《计算机世界》上有篇文章讨论到Win32用户模式的精确定时问题,好像是在多媒体处理的部分有着个函数,你不妨在这方面找一找。Window的定时器在100ms级可用。
我爱开发
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-07-15 13:15
在WIN32用户模式下,有一个函数你可试一试:
VOID Sleep(  DWORD dwMilliseconds   );// sleep time in milliseconds 可在毫秒级延迟,
至于在 kernel mode 下,我不太清楚了。
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-07-15 19:19
在内核模式中,好象没有类似于Ring 3层的Sleep函数。

我考虑是否使用定时器来保证一段时间的延迟,不知各位有何高见。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
glacier
驱动牛犊
驱动牛犊
  • 注册日期2001-07-03
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-07-17 15:18
在内核模式下许多函数的timeout时间都是100纳秒为单位的,你可以考虑使用他们来实现5微秒的延时,另外多媒体时钟的最小单位也是毫秒级的,不可以使用。
提供一个参考的函数你自己去查一下msdn了解具体用法

BOOLEAN
KeSetTimer(
IN PKTIMER Timer,
IN LARGE_INTEGER DueTime,
IN PKDPC Dpc /* optional */
);

skysky
驱动小牛
驱动小牛
  • 注册日期2001-07-18
  • 最后登录2003-06-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-07-18 12:23
用KeDelayExecutionThread内核函数
NTSTATUS
  KeDelayExecutionThread(
  IN KPROCESSOR_MODE  WaitMode,
  IN BOOLEAN  Alertable,
  IN PLARGE_INTEGER  Interval
  );
interval以100ns为单位。
以德服人,以德服人
RTLife
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-07-18 17:02
多媒体定时器的精度为1ms.要实现5us的定时精度,多半都要采用内核定时器的方案。
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
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,实际上达不到

XYBUS
驱动牛犊
驱动牛犊
  • 注册日期2001-05-06
  • 最后登录2002-01-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-08-18 11:58
我曾经用QueryPerformanceFrency和QueryPerformanceCounter两个
winapi函数实现过微秒级定时,如果你机器配置好,其定时精度完全
可以达到1微秒
两个函数具体应用可看msdn.
oneq
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2001-11-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-08-20 13:15
dazzy 的方法最易精确控制.
lcx119
禁止发言
禁止发言
  • 注册日期2001-07-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2330分
  • 威望11503点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2001-08-20 13:59
用户被禁言,该主题自动屏蔽!
ZhuYong
驱动牛犊
驱动牛犊
  • 注册日期2001-09-06
  • 最后登录2002-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-09-11 22:35
    我是搞硬件的,也想提一些意见:
(1)我也赞成使用CPU的指令周期作为定时基准,计算该定时基准时只能使用寄存器操作指令,不要涉及存储器和外部I/O访问,以免因系统时序的原因导致计算结果不精确。
(2)延时程序也要只使用寄存器操作指令,并且执行过程中要禁止中断---CLI,5us不响应中断对一般的中断请求是可以接受的。
(3)Sleep等函数应该用到了系统的实时钟硬中断,靠中断来定时要考虑中断响应的延时时间。
(4)如果软件无法达到要求,只能修改硬件,让硬件定时器来完成控制操作。
游虾一只。
cszhaoqm
驱动牛犊
驱动牛犊
  • 注册日期2002-12-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-05-14 15:35
请问dazzy:win2000下一样能用嵌入汇编指令到VC中吗?

还有:我在MSDN中根本找不到有关
QueryPerformanceFrency和KeSetTimer的主题?

仁兄们能多赐教几句?
在下感激不尽!

[编辑 -  5/14/03 by  cszhaoqm]

[编辑 -  5/14/03 by  cszhaoqm]
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-14 18:13
请问dazzy:win2000下一样能用嵌入汇编指令到VC中吗?

能!

还有:我在MSDN中根本找不到有关
QueryPerformanceFrency和KeSetTimer的主题?

QueryPerformanceFrency msdn 里有!

KeSetTimer ddk 里有!

仁兄们能多赐教几句?
在下感激不尽!

[编辑 -  5/14/03 by  cszhaoqm]

[编辑 -  5/14/03 by  cszhaoqm]
cszhaoqm
驱动牛犊
驱动牛犊
  • 注册日期2002-12-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
cai_yankun
驱动牛犊
驱动牛犊
  • 注册日期2005-03-10
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-03-27 22:16
看了上面大侠的高见我受益匪浅。多谢大家的指点。
不过我想问一下dazzy的方法中 如果用程序循环的话会不会有问题?
如果用指令进行循环的话 那windows是多任务的 延时程序那个线程不是独占cpu那样结果会不会被延长?
再者如果用循环读计数值的方法那每循环一次都要执行一些指令这些指令的时间是不是也要算进去?
能不能利用中断呢?
我是新手也许问的问题方式不对 也许有些弱智 请大家多多包涵。先行谢过了!
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-04-06 17:06
在应用程序级无从谈起精确,  不过有时似是而非的定时确实可以达到你要求的定时效果. 但是WINDOW无法保证你的定时可以准确的到达.  WINDOW是多任务的, 任务是需要不断的切换的.  这一点,就可能使得你的定时不在准确


http://guoj.blog.edu.cn/
guoj
a0041059a
驱动小牛
驱动小牛
  • 注册日期2005-05-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望6点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-05-09 19:53
这里高手真多呀,佩服
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-05-12 14:43
Retsc 最简单了
上一页
游客

返回顶部