图4 数据采集与存储线程流程
Fig 4 The flow chart of data collecting and storing
数据采集和存储线程作为系统的数据源头,它激活了其他两个子线程,与之相对应,被他激活的子线程随着它的结束而结束[7]。线程在未接受到信号量激活时是处于阻塞状态,是不占用系统资源的。前台处理用户界面的GUI线程与后台的工作线程之间是独立的。GUI线程提供友好的人机界面,它把被监控对象的信息实时的显示在图形界面上,供现场工作人员查询和设置。
在此程序中,每个线程都需要对存放被监控对象实时状态的数据缓冲区进行访问。由于Linux操作系统允许多个线程同时对某一数据缓冲区进行读操作,但在同一时刻对此数据缓冲区只能有一个写操作。GUI线程需要定时刷屏,更新被监控对象的实时状态,因而需要定时对缓冲区进行读操作,而数据采集与存储线程定时的对此缓冲区进行写操作,它们之间没有触发关系,是相互独立运行的。因此,需要对缓冲区设置一个互斥量,确保任一时刻这两个线程只有一个能对其进行访问[5]。
数据采集与存储线程对缓冲区进行写操作之前,先对互斥量进行加锁操作,把实时状态写入数据缓冲区后,再进行解锁。这样避免了因于GUI线程争夺资源而造成系统不稳定。上锁与解锁操作代码如下所示。
void *thread_collection(void *arg)
{
…
pthread_mutex_lock(&data_mutex); //上锁操作
read(fd, &data, sizeof(data)); //写实时状态到data缓冲区
pthread_mutex_unlock(&data_mutex); //解锁操作
//激活网络通信线程,决策线程,并写数据到数据库
…
}
同样,GUI线程中也需要对缓冲区进行相应的上锁、解锁操作。
网络通信线程和决策线程由主线程(GUI线程)创建,由数据采集与存储线程激活,都是每5秒运行一次。由于GPRS模块通过串口与下位机相连,并采用透明传输模式,即有数据即传输,因此网络通信线程只需要定时对串口写操作就可以完成数据的传输。此线程先打开串口,设置串口的波特率、数据位、校验位等属性,然后等待数据采集与存储程的信号量将其激活,第一次被激活后,进入了一个while循环,执行一次串口写操作,再等待下一次被激活。线程被激活的条件是数据采集和存储线程对信号进行了一次加1操作,即sem_post(&sem_2)。
其关键代码如下:
fd = open(“/dev/ttySC4”, O_RDWR);
set_speed(fd, 9600); //设置波特率
set_parity(fd, 8, 1, ‘n’); //设置数据位、奇偶校验位
sem_wait(&sem_2); //等待信号量激活
while(1){
write(fd, buf, sizeof(buf)); //对串口写操作,发送数据
sem_wait(&sem_2); //等待下一次信号量激活
}
pthread_exit( “thread exit\n”); //线程退出
决策线程的任务是对当前被监控对象的状态进行判断,如果有异常发生,则产生一个报警信号,并执行相关动作来应对这些异常。其代码结构与网络通信线程相似。
5 结束语
随着嵌入式处理器性能的不断增强和成本的降低,使用ARM为核心的嵌入式系统是来高端控制器的发展趋势。本文设计实现了一个基于ARM-Linux平台的环境监控下位机系统,并采用多线程控制技术来完成下位机的多个任务。相对于单任务应用程序,多线程应用程序能够减少定时器的使用,节约系统资源,从而使系统的效率提高。而且,多线程编程更能体现模块化设计思想,程序易于维护和修改。系统已经成功应用于项目之中,且性能稳定可靠。
参考文献
[1] 陈海明.基于ARM和GPRS远程无线监控系统的设计与实现[D].北京邮电大学,2009.
[2] 刘坚,陶正苏,陈德富,等.基于GPRS的环境监测系统的设计[J].自动化仪表. 2009,30(2):30-32.
[3] Xing Jianping,Zhang Jun. GPS real time vehicle alarm monitoring system based on GPRS/CSD using the embedded system[R]. ITS Telecommunications Proceedings, 2006.
[4] 刘森,慕春棣,赵明国.基于ARM嵌入式的拟人机器人控制器的设计[J].清华大学学报(自然科学版).2008,44(4):482-486.
[5] 景征骏,周军.基于多线程的集控式足球机器人上位机系统[J].计算机工程.2008,34(21):199-203.
[6] Matthew N.Linux程序设计[M].2版.北京:机械工业出版社,2002:445-447.
[7] 张静永,张蕾,曹其新,等.基于多线程的钢管智能探伤系统[J].计算机工程与应用.2004.31:210-212.
基金项目:
广东省科技计划项目(编号:2006B12301002);
佛山市产学研专项资金项目(编号:2007CB009);
佛山市南海环境保护局项目(编号:2007B08D8073570)。