QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2014|回复: 16

数据采集处理程序的问题

[复制链接]
发表于 2005-12-29 22:48:42 | 显示全部楼层 |阅读模式
我在做一个课题,笼统的说就是Linux环境下数据采集处理程序。
现在我感觉有好多问题,想请教版主和各位大侠!

先问一个吧:首先要隔固定的时间采集一次数据(一次采400个值),要采很多次,再把数据和起来,变换并处理。处理的同时,采集数据是继续进行的。
我就是想问,这该怎么实现呀
是用多线程编程吗?还是把采集和处理看为两个进程!
应该是采集作为父线程(进程)还是处理作为父线程(进程)
希望高手多指教!我很希望学习!
谢谢
发表于 2005-12-30 11:09:28 | 显示全部楼层
采集的时间间隔是多少?
回复

使用道具 举报

 楼主| 发表于 2005-12-30 14:42:55 | 显示全部楼层
采集过程由采集板完成,为一个异步过程,命令传给采集板后,立即返回。采集完的数据会放在一个缓冲区中!采400个点,每ms一个!
大概就是隔1s下一次命令,采400个点!共53次。采集完后放在一起。(我是每次将buffer中的数据赋给一个二维矩阵。因为最后是要得到一个温度值对应的灰度图!不知道这样可以不?或有什么更好的方法)。 然后再用小波处理! 大概就是这样一个过程!
每部分大概都知道怎么实现,但是要让整个过程实现起来,思路还是没有!  多进程?多线程?矩阵怎么共享等?
希望版主可以帮帮我!谢谢!  (这个课题是空气预热器热点检测,空预器是电站上用的,是个大圆盘,每次延径向扫描一次,采400个点!53扫完圆盘,组成一个灰度图,对应空预器温度值! 就是这么一个情况! 不知版主有何高见!谢谢指教!)
回复

使用道具 举报

发表于 2005-12-30 16:40:30 | 显示全部楼层
这么慢的采集速度基本不用什么特殊处理。
多进程没必要。
加个1s的定时器定时发采集命令就行了。
同一个进程了数据都可以直接访问,不存在共享问题,将他们定义为全局变量就行了。
回复

使用道具 举报

 楼主| 发表于 2005-12-30 20:24:39 | 显示全部楼层
在同一个进程的话,那采集和处理怎么同时进行呀!(是否用多线程呢!唉,我在这里想不通呀)
处理部分在MATLAB仿真下需3分钟,在这也需很长时间的吧!

定时器我也不会用呀!怎么设置呀!
谢谢帮助!
回复

使用道具 举报

发表于 2005-12-31 20:31:09 | 显示全部楼层
采集是定时器定时触发的,处理在主进程里可以一直处理数据,只不过在需要采集数据时定时器会打断一小会,按你的说法,采集时自动进行的,只要发一个指令就行了,所以采集消耗的cpu时间是非常非常短的,绝大部分时间还是用在了数据处理上,所以这并不矛盾。
定时器的用法你可以搜索“linux定时器”。
回复

使用道具 举报

 楼主| 发表于 2006-1-3 15:57:22 | 显示全部楼层
根据版主的意思,在这个程序中定时器起着至关重要的作用!
定时器我确实还不会用!看了一些资料,我觉得说得也很模糊!
希望版主在这方面指点一二,如该用什么函数怎么设置等!
我非常感谢版主给我指点了这么多!
回复

使用道具 举报

发表于 2006-1-4 10:17:38 | 显示全部楼层
[code:1]
#include <stdio.h>
#include <signal.h>
#include <time.h>

//采集数据
void collect_data(int signum)
{
    printf("collect_data\n");
}

//处理数据
void handle_data()
{
    while(1)
        sleep(1);
}
main()
{
    timer_t tm_id;
    struct sigevent evp;
    struct itimerspec value;
    struct itimerspec ovalue;
    struct sigaction sigact;
    int ret;

    signal(SIGRTMAX,collect_data);
    evp.sigev_notify = SIGEV_SIGNAL;
    evp.sigev_signo = SIGRTMAX;
    evp.sigev_value.sival_ptr = &tm_id;
    ret = timer_create(CLOCK_REALTIME, &evp, &tm_id);
    if(ret != 0)
        return;
    value.it_value.tv_sec = 1;
    value.it_interval.tv_sec = 1;
    value.it_value.tv_nsec = 0;
    value.it_interval.tv_nsec = 0;
    ret = timer_settime(tm_id,0,&value,&ovalue);
    if(ret == 0)
        handle_data();
    timer_delete(tm_id);
}
[/code:1]
回复

使用道具 举报

发表于 2006-1-4 12:48:11 | 显示全部楼层
编译时要加什么库吗
回复

使用道具 举报

 楼主| 发表于 2006-1-4 14:26:19 | 显示全部楼层
啊!谢谢版主给了这么多的指导,真是非常感谢!
我也是刚走上linux学习之路,在这里认识了很多朋友也学到了很多!
谢谢!
回复

使用道具 举报

 楼主| 发表于 2006-1-4 17:12:27 | 显示全部楼层
基本看懂了版主的程序!同时自己也看了很多关于定时器的文章!
我真觉的是仁者见仁,智者见智,各有自己的办法!
有的说用alarm,有的说用select,有的用setitimer,版主用的是timer_creat和
timer_settimer,我有点迷惑了!
不知版主可以对他们做一阐述吗?
谢谢!让我们一起学习吧!
回复

使用道具 举报

发表于 2006-1-4 17:31:36 | 显示全部楼层
timer_create是创建定时器
timer_settime是设置定制器触发时间
回复

使用道具 举报

 楼主| 发表于 2006-1-4 19:44:16 | 显示全部楼层
这个我明白的!我主要是想问关于这几个函数之间的区别!
谢谢!
回复

使用道具 举报

发表于 2006-1-5 09:31:37 | 显示全部楼层
这几个原理都一样,都是超时时给进程发一个信号。
alarm是发SIGALRM
setitimer发SIGALRM或者SIGVTALRM或者SIGPROF
timer_create发的信号好像可以定制。
alarm时间精度没那么高,是以秒为单位,而且只触发一次。
回复

使用道具 举报

 楼主| 发表于 2006-1-6 14:44:28 | 显示全部楼层
哦,基本上清楚了!
另外最近我在一本《UNIX高级编程》上看到一些定时器的使用文章!
上面主要说了setitimer,不知道这个函数可以实现定时处理的功能吗!
主要是因为我找不见版主提供的timer_settime这个函数的使用!
请版主多指教!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 00:35 , Processed in 0.082686 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表