标题:
基于多线程的环境监控系统下位机的设计
[打印本页]
作者:
porereading
时间:
2014-10-19 10:09
标题:
基于多线程的环境监控系统下位机的设计
为提高环境监控系统的稳定性,节约系统资源,提出了一种由下位机、传输网络和上位机组成的环境监控系统的设计方案,详细介绍了该系统中下位机的硬件及软件设计。该下位机硬件以ARM9处理器S3C2410为核心,软件采用多线程应用程序同时处理多个任务,并采用信号量和互斥量实现线程间的同步。实际应用表明,该系统运行稳定,提高了系统效率。
0引言
随着国民经济及工业技术的发展,环境保护越来越受到重视。现在市场上已经出现了多种环境监控系统,但性能不稳定。现场监控终端大多采用工控机或单片机,前者抗干扰性能好,但成本较高;后者处理能力低,人机界面不友好,不利于现场人员的监控管理。针对上述问题,笔者设计了一种基于多线程的环境监控系统。该系统采用多线程技术有效地实现了监控过程中数据的采集与存储、实时数据显示、下位机(监控终端)与上位机(监控中心)的通信、实时报警等功能。本文重点介绍该系统下位机的设计。
1系统总体结构
基于多线程的环境监控系统由现场监控终端(下位机)、传输网络、监控中心(上位机)3个部分组成,其结构如图1所示。
图1基于多线程的环境监控系统结构
下位机是一个基于A RM9的嵌入式系统,用于定时采集、处理、存储被监测的特征数据。经过下位机处理后的数据,按照相关协议,经GPRS模块发送给上位机。上位机由一台PC机担任,负责接收多个下位机发送的数据,并对这些数据进行分析、处理和显示。环保部门可通过上位机监控其辖区内的污染排放状况。上位机基于VB. NET开发。
2下位机硬件设计
下位机的硬件核心部分由S3C2410、NandFLASH和SDRAM组成,如图2所示。S3C2410是三星公司生产的一款基于ARM920T内核的32位RISC嵌入式微处理器,带有独立的16 KB指令Cache和16 KB数据Cache、LCD控制器、RAM控制器、N and FLASH控制器、并行I/ O口、8路10位ADC,其运行频率可达203 MHz.8位64 MB的Nand FLASH选用的芯片为K9F1208, 64 MB的SDRAM由2片HY57V561620组成。下位机通过以太网控制器CS8900A扩展了一个网口,数据既可以通过无线传输,也可以通过有线传输;通过I/ O接口扩展了8个DI口(数字量输入)、4个AI口(模拟量输入)、4个DO口(数字量输出),下位机通过这些接口与被监控设备通信。
图2下位机硬件组成
3下位机的需求与结构设计
下位机定时采集、处理现场数据,并存储在数据库中,把实时数据发送给上位机,并响应上位机发送的控制命令。因此,下位机需要同时处理多个任务,这些任务并发执行。若使用单线程来完成这些任务,则需要使用多个定时器来触发,而过多的定时器会导致系统不稳定。Window s是抢先式多任务的操作系统,启动了一个应用程序就等于启动了一个进程。一个进程通常拥有一个线程,在系统资源管理中,每一个线程被分配一定的时间片。采用多线程的设计方法可以使程序拥有多个线程,这样程序就能同时处理更多的任务。因此,若使用多个进程来协作完成,能避免上述缺点且系统比较稳定,但系统对进程的频繁调度会占用过多资源,程序的可读性也不好。
笔者采用一种并行的、多线程方案能够很好地处理多个任务,并充分节约系统资源。该方案中,下位机有5个线程:GU I线程、复位线程、数据采集与存储线程、网络通信线程、决策线程。其中GU I线程为主线程,负责界面处理、系统数据的初始化以及创建子线程等任务;复位线程、数据采集与存储线程、网络通信线程是后台的工作线程,通过优先级调度、线程同步等机制保证能可靠执行现场数据采集、存储、发送、显示等任务。复位线程在启动后循环地对看门狗操作,不作为任务处理线程。任务线程之间的关系如图3所示。
图3任务线程之间的关系
4多线程技术在系统中的应用
4. 1线程的创建
Linux环境下,使用pthread_cr eate()函数创建一个新线程,默认情况下主线程会等待被创建的子线程执行结束,得到子线程的返回结果然后再继续往后执行。实时监控程序的子线程都是循环执行的,不需要运行结束后归并到主线程中,需设置其属性为PT HREAD _ CREATE _DETACHED.根据子线程的重要性进行优先级设置,确保重要线程优先执行。子线程的优先级从高到低依次为复位线程、数据采集与存储线程、决策线程、网络通信线程。
线程的创建、设置伪代码如下:
void * thr ead_wat chdog(void * arg); / /复位线程函数
void * thr ead_collect ion(void * arg); / /数据采集与存储线程函数
void * thr ead_communi cat ion(void * arg); / /网络通信线程函数
void * thr ead_decis e(void * arg); / /决策线程函数
int dat a[ 12] ; / /数据缓冲区,用于存放线程间共享的数据函数
main()
{
/ /初始化工作
……
pthread_t wat chd og; / /线程号
pthread_t collect ion;
pthread_t commun ication;
pthread_t deci se;
pthread_at t r_init(); / /初始化线程属性
pthread_at t r_setdetach st at e(); / /不对线程进行重新归并
pthread_at t r_set s ched param(); / /设置线程的优先级
sem_init(); / /对相关信号量进行初始化
pth read_creat e(); / /创建新线程
/ /启动GUI程序
……
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0