阅读:3058回复:23
关于多线程间切换所需时间,对数据采集实时性的影响。。。
我在做一个数据采集系统。Win98应用软件的编程上,开了一个线程采数据(编了一个驱动程序);又需要示波(显示数据波形)即又一个线程。采集数据的线程需要保证采样频率,保证不丢点采集(采样频率为30K)。但是,好像多线程之间切换,就需要几十毫秒,在这期间,是不是 应用程序无法获得CPU的控制,也就是说,这几十毫秒不能采样。不知道如何解决。。。真是一个难题。(前面的说法可能又不少错误。还请各位指导)。
谢谢关注! |
|
|
沙发#
发布于:2002-05-15 18:01
你为什么不担心你的数据采集会影响你的数据显示呢 :D
显示数据在app,ring3的,数据采集在ring0,你用查询的方式,还要到200K,那不是把CPU的时间都抢了,你有时间显示你的数据吗? 加FIFO,用中断,会好很多的。 |
|
板凳#
发布于:2002-05-15 17:50
主要是同步显示,又不影响采集。
|
|
|
地板#
发布于:2002-05-15 17:46
呵呵,写错了,不是200采样/s, 改为200K采样/s
我的意思是,VXD采数据。还要显示数据,需要同步呀,显示的程序,会对我得采样有影响么(保证采样频率) |
|
|
地下室#
发布于:2002-05-15 17:07
200sample/s,我觉得不用FIFO也可以了吧,虽然是用查询方式,不用中断。
在VxD开buffer(app开,pass给VxD也可以),采集一定的数据,就pass给app,让app来绘图。在VxD绘图,您就算了吧 :D |
|
5楼#
发布于:2002-05-15 17:00
同意yanghaoyun的观点。
|
|
|
6楼#
发布于:2002-05-15 16:24
大哥,怎么能在VXD中直接显示数据呢?加FIFO也没用。VXD中无法直接调用那些绘图函数。VXD采集到数据后传给RING3程序,在RING3程序你就可以随心所欲的绘图了。
|
|
7楼#
发布于:2002-05-15 16:09
我使用VXD,在系统级上运行,查询方式读板子上AD是否转换.速度可以达到200采样/s.速度没有问题,不会丢点.现在就是,在VXD中无法直接显示数据(示波)....看来还是要在硬件上加FIFO.
|
|
|
8楼#
发布于:2002-05-15 15:28
假如在纯DOS下(既实模式下),汇编编程去实现这一过程应该很容易把.
|
|
|
9楼#
发布于:2002-05-14 09:54
如果时间都给CPU,30K不算什么啦。可是CPU大部分时间都在等。
唉,我也没有试过。不过有100K sample rate的数据采集卡,我想,30K应该可以吧,不然100K的卡。。。 |
|
10楼#
发布于:2002-05-14 09:27
我们可以粗略的算一下。对X86系列的CPU来说,平均一个指令大约4个时钟周期,按400M的CPU,也就是说1ms可以执行100K个指令。所以
对CPU来说,0.3ms是个很长的时间。虽然总线和外设的读写速度比CPU慢,但不会慢到微秒级。因此,我认为30K的中断没问题。 |
|
11楼#
发布于:2002-05-14 09:00
1/30=0.33,给你的处理时间可能连0.3ms都没有。
|
|
12楼#
发布于:2002-05-14 08:08
没有硬件的配合,这个无法试,只能分析分析。
|
|
13楼#
发布于:2002-05-13 19:20
我没有试过,但是,30K在window下面很难的,即使用VxD。
|
|
14楼#
发布于:2002-05-13 16:43
我想用中断的方法应该可以,前提是频率为30K的中断应该由硬件产生。中断服务程序将每次采集的数据存入一个较大的缓冲区内,应用程序以10毫秒以上的时间间隔读取数据。所以我觉得你不需要什么多线程,只要你的硬件以30K的频率发出中断信号,用中断服务程序做缓冲,你的应用程序就可以以很慢的频率去显示。
我没有试过,不能完全肯定,主要是我不知道在windows里,CPU从收到一个中断信号到进入中断处理函数需要多少时间。我以前看的一点资料,好象是windows对中断的处理过程与DOS下的差不多,只不过将中断向量表改成IDT了。我想只要CPU在收到一个中断信号后不经过任务级别的等待而只是进行一些现场保护,那么中断信号以30K的频率出现肯定没问题,而且以现在的CPU速度还可以用更高的频率。 [编辑 - 5/13/02 by yanghaoyun] |
|
15楼#
发布于:2002-05-13 15:23
连FIFO都没有,在Windows可以到30K,我真的很佩服!
我都不敢相信了,真的。 |
|
16楼#
发布于:2002-05-13 15:13
to cpboy:
你的意思是不是说你的硬件设备可以达到相应的采样频率,采样后数据放到寄存器,没有fifo,下次采样将冲掉上次的数据。 而现在的问题是没办法以足够大的频率把这些数据从寄存器读出来,进而造成了数据丢失。 如果是这样的话,我在重复一下我的观点,鉴于商业操作系统不以 实时性为目的,恐怕你是肯定会有数据丢失(国外有相关的公司可以帮助把windows这类操作系统变为实时的)。 至于你所说的单线程没有此问题,我认为是不可能的,因为存放数据这个过程本身就耗费系统资源。不知道你怎么存放数据,可以用标准 c或api的一些函数在获得数据的同时也获得系统时间,这样在一个较长的时间段中进行采样,回头就会发现那20几毫秒的间隔。 好久以前做过数据采集程序,差不多都忘光了,如果说错了,请指出来。上面说的,如果我没记错的话,我大体都试过。 |
|
17楼#
发布于:2002-05-12 17:03
你的意思是你用单线程可以达到30K(!)的速度?
|
|
18楼#
发布于:2002-05-11 17:52
我是使用硬件控制采样频率的(8253)。现在的问题不是采样频率的控制。而是,一边采,一边显示,需要开多线程。会影响我的采样。现在我可以做到只采不显示。也就是单线程。因为我的硬件没有加FIFO,所以,采样读板上的数据必须即时。单线程没有这个问题。但是,多线程就有问题了。。。
|
|
|
19楼#
发布于:2002-05-11 10:10
楼上的兄弟的确高见,兄弟我也是做了很长时间的实时控制系统,我认为在WIN98下完成如此高频的数据采集可能性非常小。
|
|
|
上一页
下一页