cpboy
驱动牛犊
驱动牛犊
  • 注册日期2001-09-04
  • 最后登录2004-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3056回复:23

关于多线程间切换所需时间,对数据采集实时性的影响。。。

楼主#
更多 发布于:2002-05-10 09:37
我在做一个数据采集系统。Win98应用软件的编程上,开了一个线程采数据(编了一个驱动程序);又需要示波(显示数据波形)即又一个线程。采集数据的线程需要保证采样频率,保证不丢点采集(采样频率为30K)。但是,好像多线程之间切换,就需要几十毫秒,在这期间,是不是 应用程序无法获得CPU的控制,也就是说,这几十毫秒不能采样。不知道如何解决。。。真是一个难题。(前面的说法可能又不少错误。还请各位指导)。
  谢谢关注!
欢迎讨论
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-10 10:16
不知道线程切换需要几十毫秒的结论从哪儿得到的?我对Win 98不是很熟悉,但是在Win NT上,当系统在进行线程切换时,应用程序肯定无法获得CPU控制权,因为系统线程调度的IRQL为DISPACH_LEVEL,而应用程序线程的IRQL为PASSIVE_LEVEL。

这么高的采样频率用线程来实现好象比较困难,除非你有办法让Win 98不进行任何调度。我有一个问题,30kHz你怎么定时呢?如果你通过硬件定时的话,那就ISR中采集数据,ISR可以中断系统的调度过程。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-05-10 10:59
30k,我觉得一定要用VxD,在ISR中采集才有可能保证。
jombia
驱动牛犊
驱动牛犊
  • 注册日期2001-12-28
  • 最后登录2004-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-10 15:05
30k的采样率,使用应用程序优先级别的线程是绝对做不到的

如果硬件没有FIFO功能的话,那你得有一台工作站级别的计算机

才能完成如此高的采样速度
你好!
daoshi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-12
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-10 17:31
98下时间片大概是25毫秒。也就是说对不同线程进行调度的时间间隔
至少是这些。不做驱动的话,在应用程序中用多媒体定时器会好一点,windows内部可能对多媒体定时器的实现采取了什么特别的方法。我大体测试过1Khz吧。
如果想达到30K,并且由pc控制这个频率,在通常的os上,比如windowslinux,unix下,我认为是不可能的。这就是分时操作系统的限制。
除非用VXWorks(火星机器人上跑的那个)这类的实时操作系统。
折衷的办法是由采集部分控制频率,写数据到DMA,应用程序只读数据
而不负责采集频率。
sunlu
驱动牛犊
驱动牛犊
  • 注册日期2002-02-21
  • 最后登录2002-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-11 10:10
  楼上的兄弟的确高见,兄弟我也是做了很长时间的实时控制系统,我认为在WIN98下完成如此高频的数据采集可能性非常小。
[email]tnt_2_m_cn@163.com[/email]
cpboy
驱动牛犊
驱动牛犊
  • 注册日期2001-09-04
  • 最后登录2004-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-11 17:52
我是使用硬件控制采样频率的(8253)。现在的问题不是采样频率的控制。而是,一边采,一边显示,需要开多线程。会影响我的采样。现在我可以做到只采不显示。也就是单线程。因为我的硬件没有加FIFO,所以,采样读板上的数据必须即时。单线程没有这个问题。但是,多线程就有问题了。。。
欢迎讨论
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-05-12 17:03
你的意思是你用单线程可以达到30K(!)的速度?
daoshi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-12
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-13 15:13
to cpboy:
你的意思是不是说你的硬件设备可以达到相应的采样频率,采样后数据放到寄存器,没有fifo,下次采样将冲掉上次的数据。
而现在的问题是没办法以足够大的频率把这些数据从寄存器读出来,进而造成了数据丢失。

如果是这样的话,我在重复一下我的观点,鉴于商业操作系统不以
实时性为目的,恐怕你是肯定会有数据丢失(国外有相关的公司可以帮助把windows这类操作系统变为实时的)。
至于你所说的单线程没有此问题,我认为是不可能的,因为存放数据这个过程本身就耗费系统资源。不知道你怎么存放数据,可以用标准
c或api的一些函数在获得数据的同时也获得系统时间,这样在一个较长的时间段中进行采样,回头就会发现那20几毫秒的间隔。
好久以前做过数据采集程序,差不多都忘光了,如果说错了,请指出来。上面说的,如果我没记错的话,我大体都试过。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-05-13 15:23
连FIFO都没有,在Windows可以到30K,我真的很佩服!
我都不敢相信了,真的。
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-13 16:43
我想用中断的方法应该可以,前提是频率为30K的中断应该由硬件产生。中断服务程序将每次采集的数据存入一个较大的缓冲区内,应用程序以10毫秒以上的时间间隔读取数据。所以我觉得你不需要什么多线程,只要你的硬件以30K的频率发出中断信号,用中断服务程序做缓冲,你的应用程序就可以以很慢的频率去显示。
我没有试过,不能完全肯定,主要是我不知道在windows里,CPU从收到一个中断信号到进入中断处理函数需要多少时间。我以前看的一点资料,好象是windows对中断的处理过程与DOS下的差不多,只不过将中断向量表改成IDT了。我想只要CPU在收到一个中断信号后不经过任务级别的等待而只是进行一些现场保护,那么中断信号以30K的频率出现肯定没问题,而且以现在的CPU速度还可以用更高的频率。

[编辑 -  5/13/02 by  yanghaoyun]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-05-13 19:20
我没有试过,但是,30K在window下面很难的,即使用VxD。
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-05-14 08:08
没有硬件的配合,这个无法试,只能分析分析。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-05-14 09:00
1/30=0.33,给你的处理时间可能连0.3ms都没有。
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-05-14 09:27
我们可以粗略的算一下。对X86系列的CPU来说,平均一个指令大约4个时钟周期,按400M的CPU,也就是说1ms可以执行100K个指令。所以
对CPU来说,0.3ms是个很长的时间。虽然总线和外设的读写速度比CPU慢,但不会慢到微秒级。因此,我认为30K的中断没问题。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-05-14 09:54
如果时间都给CPU,30K不算什么啦。可是CPU大部分时间都在等。
唉,我也没有试过。不过有100K sample rate的数据采集卡,我想,30K应该可以吧,不然100K的卡。。。
eastman
驱动小牛
驱动小牛
  • 注册日期2001-12-02
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-05-15 15:28
假如在纯DOS下(既实模式下),汇编编程去实现这一过程应该很容易把.
李问
cpboy
驱动牛犊
驱动牛犊
  • 注册日期2001-09-04
  • 最后登录2004-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-05-15 16:09
我使用VXD,在系统级上运行,查询方式读板子上AD是否转换.速度可以达到200采样/s.速度没有问题,不会丢点.现在就是,在VXD中无法直接显示数据(示波)....看来还是要在硬件上加FIFO.
欢迎讨论
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-05-15 16:24
大哥,怎么能在VXD中直接显示数据呢?加FIFO也没用。VXD中无法直接调用那些绘图函数。VXD采集到数据后传给RING3程序,在RING3程序你就可以随心所欲的绘图了。
huoxy
驱动小牛
驱动小牛
  • 注册日期2002-03-01
  • 最后登录2014-02-24
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-05-15 17:00
同意yanghaoyun的观点。
好好学习,天天向上,做一个乖宝宝。
上一页
游客

返回顶部