3.2 软件架构
整个软件采用嵌入式操作系统Linux作为基站功能实现上的主要载体。Linux是多任务操作系统,在软件整体划分上主要分五个线程,系统上电起动后五个线程并行工作。五个线程之间的关系如图3所示。
这五个线程分别是:
视频传输线程,负责将压缩好的数据通过网络传给主控制中心。
网口接收线程,负责接收和处理主控中心通过网口下发的指令和数据。
传感器检测线程,负责检测前端传感器的状态,并对相应的数据进行处理。
门禁检测线程,负责对门禁系统进行控制。
GSM短信检测线程,负责对短信命令的接收,并根据命令作相应的处理。
下面以网口接收线程为例,详细介绍此线程模块的设计,网络接收线程流程如图4所示。
网络接收线程起始处于接收状态,当它接收到信息时,根据所定义的信息标识来确定接收到的是数据还是命令,如果判定是命令,则根据命令的定义来区分命令的种类并作相应的处理,在网络接收线程的设计中使用了select函数作为接收和处理函数。select()机制中提供fd_set的数据结构,实际上是一个long类型的数组,每一个数组元素都能与一个打开的文件句柄(不管是Socket句柄,还是其他文件或者命名管道或者设备句柄)建立联系。建立联系的工作由程序员完成,当调用Select()时,由内核根据I/O状态修改fd_set的内容,由此来通知执行了select()进程的哪一个Socket或文件可读。具体解释为:
ndfs:select需要监视的文件句柄数,视进程中打开的文件数而定,一般设为需要监视各文件中的最大文件号加1。
readfds:select()监视的可读文件句柄集合。
writefds:select()监视的可写文件句柄集合。
exceptfds:select()监视的异常文件句柄集合。
timeout:本次select()的超时结束时间。(见/usr/sys/select.h,可精确至百万分之一秒。)
当readfds或writefds中映象的文件可读或可写或超时,本次select()就结束返回。程序员利用一组系统提供的宏在select()结束时便可判断哪一文件可读或可写。对Socket编程特别有用的就是readfds。
几个相关的宏解释如下:
FD_ZERO(fd_set*fdset):清空fdset与所有文件句柄的联系。
FD_SET(int fd,fd_set*fdset):建立文件句柄fd与fdset的联系。
FD_CLR(int fd,fd_set*fdset):清除文件句柄fd与fdset的联系。
FD_ISSET(int fd,fdset*fdset):检查fdset联系的文件句柄fd是否可读写,>0表示可读写。(关于fd_set及相关宏的定义见/usr/include/sys/types.h)
这样,socket只需在有数据读的时间才读入,大致如下:
所以一个FD_ISSET(sockfd)就相当于通知了sockfd可读。
结语
基于AT91RM9200的智能综合监控基站具有性能稳定可靠,集成化智能化程度高,无需专人看管,可扩展性好,资源利用率高等明显优点。因此,开发基于AT91RM9200的智能综合监控基站具有较高的技术先进性和广阔的市场前景,是一件非常有意义的事情。
该文观点仅代表作者,本站仅提供信息存储空间服务,转载请注明出处。若需了解详细的安防行业方案,或有其它建议反馈,欢迎联系我们。