打印

16MB/s,上位机怎样做到一边采,一边存,一边实时显示

[复制链接]
5029|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tancm|  楼主 | 2011-6-27 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用68013做一块AD数菜板,采样率为8MHz,AD分辨率为16位。
用VC编写上位机程序,用一个线程读USB,欲再用一个线程将读来的数保存到硬盘中时间就来不及了,纠结多日。
我现在只能在将数据写到内存中,可怜就2G内存,只能采集一分多钟的数据。
以前用过TI的数采卡,那么高的采样率,还能做到实时图形显示,时间怎么来的及的!
看看上位机程序运行时,CPU使用率只有百分之几,这么多CPU没有使用,想着这里应该有办法的。。。

相关帖子

沙发
xwj| | 2011-6-27 17:16 | 只看该作者
硬盘的读写死很占资源的,同样高速USB数据也是很占资源的,要想边收边存不可能“CPU使用率只有百分之几”。
除非是用PCI或者PCI-E的采集卡

使用特权

评论回复
板凳
drentsi| | 2011-6-27 18:45 | 只看该作者
差分压缩再存盘,显示用directx

使用特权

评论回复
地板
tancm|  楼主 | 2011-6-27 20:35 | 只看该作者
3楼:网上大概搜了搜,没搜到差分压缩是怎么个压缩法,但想来是压缩数据量的,算它将2个字节压成一个字节,但是这样电脑实时存盘时间就来的及吗?
2楼:CPU只用了百分之几是在仅采没存盘的情况下

使用特权

评论回复
5
drentsi| | 2011-6-27 20:43 | 只看该作者
举个简单例子,4个16bit数据:A0,A1,A2,A3
正常表示需要64bit,但是AD采集的数据前后两个数值相差不大,那么计算A1-A0,A2-A1,A3-A2
它们的差取值范围就大大减小了,用8bit就可以表示了,那么后面3个数只需要24个bit就可以表示了
还可以把差值再想减,就变成二阶查分了,可以继续压缩

使用特权

评论回复
6
tancm|  楼主 | 2011-6-27 22:03 | 只看该作者
5楼:高。这压缩的可以啊。
我是将int转成CString再写入txt,这个好像很耗时间,经人指点,可以直接保存为二进制文件,说就来的及了,我回头试试。

使用特权

评论回复
7
xwj| | 2011-6-28 10:27 | 只看该作者
晕~

千万别用VC等自带的格式化字符串转换,那个奇慢无比。

使用特权

评论回复
8
tancm|  楼主 | 2011-6-28 11:37 | 只看该作者
16MB/s,一边采一边存应该没什么问题了,再加个一边同时图形显示又困难了

使用特权

评论回复
9
lxyppc| | 2011-6-28 13:15 | 只看该作者
16MB/s,硬盘表示压力不大
楼主可以随便找个大文件复制一下看看,那个速度就是理论最大速度

至于显示,那和你的刷新率还有像素有关。
还有一点,所谓实时显示,其实也就一秒钟20幅左右的图而已
并不是有多少数据就要显示多少,而是每隔0.05秒显示一下当前的数据

你不做什么光影效果,半透明什么的,用GDI完全能满足你的要求。就是CDC提供的那些函数

使用特权

评论回复
10
icecut| | 2011-6-28 15:01 | 只看该作者
应该问题不大...16MB/s USB压力不大...3Gbit/s stat也压力不大.... 16xpci-e,压力也不大....至少16G/s

关键是lz的程序间数据传递性能太差了.....Cstring坚决不能用.

16M*120S=1.875g,一个硬盘1T,不压缩很快就满了....

使用特权

评论回复
11
nongfuxu| | 2011-6-28 15:54 | 只看该作者
哪位大神,最好给出点具体数据及根据.

使用特权

评论回复
12
tancm|  楼主 | 2011-6-30 20:17 | 只看该作者
9楼:我这个是个AD数据采集系统,想显示的是AD采集来的电压波形。不是图像采集。

使用特权

评论回复
13
mohanwei| | 2011-6-30 20:49 | 只看该作者
1-大数据量不要搞什么文本格式了,直接二进制保存;
2-程序启动就分配好N个同样大小的数组(N>=2),USB驱动写满一个数组后,设一个标志位,然后写下一个数组……另起一个线程,判断标志位有效,则将相应的数组一次写入文件……

但对于你这么低的速度,完全可以像5楼说的那样,根据数据的特点,把数据处理压缩一……用一个字节表示查分值有点浪费了,你可以先编个小程序统计一下90%以上的数据差分值是多少……假设90%以上的差值小于7,那么用4个bit表示就够了。定义存储结构如下:
typedef struct
{
        u16 FirstValue;//本存储块的ADC基值
        u16 num;//本存储块有多少个(最大65535+1=64KB)ADC采样值
//        u8 DiffBits;//还可以动态定义本数据块的差分值需要占用多少bit
        u8 buff[n];//比特流。n <= (num*DiffBits/8+1)。所以尽量使DiffBits优化为最小值,这样存储效率较高
}DatBlockStruct;
文件结构:
DatBlockStruct dat1,DatBlockStruct dat12,DatBlockStruct dat13……

使用特权

评论回复
14
zhang123| | 2011-7-17 09:12 | 只看该作者

使用特权

评论回复
15
happyming0809| | 2011-7-17 23:50 | 只看该作者
这么快的采集速度,没使用过

使用特权

评论回复
16
z1111| | 2011-7-22 21:39 | 只看该作者
可以抽象出一个多深度的buffer,类似usb设备的端点。采集线程存,另外线程取,处理后存到硬盘,显示线程只监视数据。

使用特权

评论回复
17
icecut| | 2011-7-23 10:46 | 只看该作者
16# z1111
buffer 还是落后的设计。。。。时髦的设计是什么呢?是什么呢?有木有?

使用特权

评论回复
18
z1111| | 2011-7-23 20:59 | 只看该作者
17# icecut
buffer 还是落后的设计吗? 看来我又孤陋寡闻了。
我是觉得buffer是挺大的一个概念。

说得再具体一点吧,借鉴FPGA中“乒乓”FIFO的设计,像楼主这样的问题,可以开一个线程来采集数据,存入其中一个FIFO,当达到一个阈值时,换另一个FIFO,并通知另一线程或发个消息来进行数据处理并存到硬盘。

数据的显示这里就不多说了,小问题而已。

当然,“采集线程”与“数据存储到硬盘的例程”之间会有同步问题,windows或linux不是RTOS,线程的运行时间无法控制,放弃线程控制权后,再得到线程控制权的时间也无法确定,不过多搞几个FIFO,比如“乒乒乓乓”啥的FIFOs,情况会好很多吧。

icecut大侠,你觉得呢?

使用特权

评论回复
19
icecut| | 2011-7-24 09:23 | 只看该作者
17# icecut  
buffer 还是落后的设计吗? 看来我又孤陋寡闻了。
我是觉得buffer是挺大的一个概念。

说得再具体一点吧,借鉴FPGA中“乒乓”FIFO的设计,像楼主这样的问题,可以开一个线程来采集数据,存入其中一个F ...
z1111 发表于 2011-7-23 20:59


老大,这叫list。。。一堆buffer填上数据就挂到list上。循环使用或者重新申请内存。前者有优势。
仅仅是buffer再多线程情况下乒乓太少加锁还有啥的性能难以最有。要来个buffer队列

使用特权

评论回复
20
z1111| | 2011-7-24 17:47 | 只看该作者
我只是说借鉴FPGA中“乒乓”FIFO。
借鉴啊,借鉴。叫什么好像不重要吧,你在数据结构里叫LIST,但是在FPGA里可以不用这么叫吧。有相同的核心设计思想,到底是叫Buffer,List,FIFO,MemoryBlock还是Container,就不必纠结了吧。

icecut大侠,上次发贴多有得罪,请多包含。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

20

帖子

0

粉丝