"); //-->
薛晓君,郑郁正,邓俊林
(成都信息工程学院 通信工程学院 四川 成都 610225)
摘要:为了实现远程监控中心和消防安全控制器互联,设计了RS232/Ethernet嵌入式消防网关。在硬件平台ARM 公司的cortex-M3型微处理器上,移植了µc/os-II嵌入式实时操作系统和轻型TCP/IP协议栈,通过利用队列状态机和链表数据结构完成了高效可靠数据通信。
关键字:TCP/IP;以太网;µc/os-II; Cortex-M3;
The implement and design of fire gateway on Cortex-M3
microprocessor
XUE xiaojun, ZHENG yuzheng, DENG junlin
(Chendu University of Information Technology ,Communication College,Sichan,Chengdu,610225,China)
1 引言:
嵌入式技术的广泛应用给人们的生活带来很大便利,基于嵌入式的计算机网络技术已经应用到工业控制,娱乐休闲等众多领域。城市火灾报警信息随机的分布在某一个角落,需要一种装置将分布在四面八方的火灾信息传输到消防监管中心。以往灾情信息通过Can总线进行传输,传输的距离较近,难以达到目前消防系统的要求。
消防系统由三大部分组成:1.火灾报警探测器和控制器。2.火灾信息传输装置即消防网关。3.远程监控中心。火灾报警探测器和控制器放置在家庭、公司、企业的楼宇之间,实时探测火光、烟雾等信息。消防网关和消防控制器通过RS232(通用异步串口)或RS485相连,按照国家规定的《火灾报警控制器与上位机见的数据通信协议》进行数据通信。消防网关检测到的数据通过WAN发送远端的城市火灾监控中心,按照国家规定的另一标准《城市消防远程监控系统报警传输网络通信协议》进行数据通信。
嵌入式以太网可以连接到互联网进行数据传输,实现远距离通信的目的,满足城市消防系统远程监控的需要。嵌入式RS232最大传输距离为15m,RS485传输距离在1000m左右,满足了消防网关和控制器数据传输的需求。消防网关利用嵌入式系统通用异步串口和以太网口,在设计中完成两个国家标准协议的转换和一些非标准协议到标准协议的转换。
图1 火灾报警系统数据通信图
2 硬件平台设计
硬件是消防网关工作的平台,是软件设计的基础。消防网关硬件设计包含三大部分:
1.主板,主板上主要包含主芯片、模拟和数字电源、外扩Flash存储芯片、和以太网接口、RS232接口等各种外设接口。2.面板,面板上设置了六个独立按键,和十五个LED灯。3.电源板,电源板上主要包含主备电部分、主备电切换部分。
消防网关主芯片选择ARM公司的Cortex-M3型微控制器。Cortex-M3型处理器是ARM公司推出的内部的指令和数据总线相互独立的哈佛结构的一款新高性能处理器,属于ARMv7-M体系构架,采用ARM指令集和Thumb-2指令集。Cortex-M3处理器不但支持中断向量嵌套,在三级流水线的基础上增加了分支预测功能,运行时功耗比ARM7小近一半。工作频率最高可以达50MHZ的Cortex-M3型的芯片集成了以太网、CAN-Bus、RS485、RS232等多种通信口,非常适合于工业控制领域。
Cortex-M3型芯片集成了以太网控制器,以太网控制器包含两大部分:介质访问控制层(MAC)和网络物理层(PHY)。
图2为设计的网关硬件电路模块结构。按照国家标准对消防网关规定,电源控制板主要完成将220V电压转换为5V和12V分别给主板和面板供电。电源板上还设计的24V的备电、供电系统工作的同时给蓄电瓶充电,主电正常的情况下主电工作,主电出现故障时控制备电自动切换。
图2 消防网关硬件结构图
网关不仅能转发通信的数据,而且必须和存储显示网关自身的状态,为了存储网关的基本配置信息,选用华邦公司的W25P16型16Mbits的FLASH芯片。显示通信数据的信息,独立按键为手动报警、警情消除、本机自检、巡检应答、消音和复位控制系统正常工作。LED灯有主备电工作指示灯、火警指示灯、巡检指示灯等等。
3网关软件系统设计
3.1 µc/os-II+TCP/IP简介
3.1.1µc/os-II
µc/os-II操作系统是美国科学家Jean J Labrosse专门为嵌入式系统设计的小型占先式可以裁剪的实时操作系统,和linux,vxWorks,WinCE等操作系统相比µc/os操作系统更像一个多任务调度器。系统通过优先级和时间算法完成任务调度。µc/os-II操作系统提供了:信号量(OSSem)、邮箱(OSMBox) 、队列(OSQ)、互斥信号量(OSMutexs)事件标志组(OSFlag)等资源;提供了内存管理、时间管理、事件管理等服务。
开源的µc/os-II是经过多次应用证明稳定性高优秀的嵌入式操作系统,非常适合于应用的工业控制领域,消防网关系统的设计采用µc/os-II操作系统。
3.1.2TCP/IP协议栈
涉及到以太网的信息传输,消防网关软件基于µc/os-II操作系统移植了轻量级型的TCP/IP协议栈。协议栈实现了最基本的TCP、UDP、CIMP、ARP通信。协议栈基本按照TCP/IP七层原理,包涵了:Hardware.C、Ethernet.C、ICMP.C、IP.C.TCP.C、UDP.C、Socket.C。接收数据时数据由硬件层开始传递,逐层传递直到Socket接收到数据,发送数据时反向传递。协议栈与操作系统结合是消防网关软件设计的最关键点,不同协议层间传输数据基本上使用了邮箱队列,保证了数据完整可靠传输。
数据在跨网段传输时有所不同,当收到以太网数据时判断是在同一网段则存储源端的IP地址和MAC地址到MAC表。如果数据是来自不同网段,经判断后则存储源端路由器的MAC地址。向不同网段发送数据时,首先在MAC表中找路由器MAC地址,若没有找到则网络层会发送ARP请求获目标MAC地址。因此开初始化阶段调用ARP请求获取路由器MAC。
3.2网关程序设计
3.2.1软件任务分布和设计流程
基于µc/os-II多任务操作系统和TCP/IP协议栈程序共创建7个任务,主函数中对系统进行初始化,并创建初始化任务(TaskInitial任务)。
图3多任务关系图
在TaskInitial任务中建立7个任务并对目标板的进行初始化,包括时钟、通用IO口、以太网控制器、LED、串口等初始化。TaskInitial任务中并且负责定时和上位机建立连接,测试通信线路是否畅通。
TaskUDPProces为UDP通信实时监控任务,使用邮箱队列完成IP层和UDP层数据包的转发。
TaskUart任务主要负责对串口中断压入队列的数据进行封报处理,并将数据包转发给其他任务。
TaskEthernetRecev接收UDP数据包,通过队列发送给TaskEthernetProcess任务。在TaskEthernetProcess中对数据包的类型判断,对数据包进行重构,完成协议转换,请求应答,控制确认等操作。
TaskEthernetSend处理发送各个任务将要发送向以太网的数据包,完成30s内三次重传保证数据传送的可靠性。
由于没有硬件时钟模块,在TaskTime任务中构建本地时钟。
3.2.2串口和以太网数据接收
串口在接收数据时采用中断方式,达到数据实时处理的要求。串口数据在配置好速率的情况下按照数据流的方式到达串口FIFO,中断处理函数在数据接收到以后压入长度为500字节的循环队列中。
typedef struct{
unsigned char base[MAXQSIZE];
int front;
int rear;
}SqQueue;
循环队列的数据结构相当的简单,一个指针指向数据的头部,另一个数据指向数据的尾部,数据的类型定义为无符号字符型。关于队列的操作有初始化队列、求取队列的长度、数据的压入和弹出。
extern int InitQueue(SqQueue *Q);
extern int QueueLength(SqQueue Q);
extern int EnQueue(SqQueue *Q,unsigned char e);
extern int DeQueue(SqQueue *Q,unsigned char *e);
使用队列的关键是通过状态机检索一个完整的数据包,在消防网关的系统中串口需要检索三种数据包:网关的配置数据包、非标准的报警信息包、火灾报警控制器与上位机间的数据通信协议数据包。
下图为数据包检索状态机,箭头代表了字符从循环队列中弹出。起始状态为NOPACKHEAD(没检索到包头),国家规定的控制器和消防网关标准协议以“@@”开头,以“##”结尾,中间包含数据包控制单元、应用数据单元和校验和。以检索国家标准协议数据包为例说明检索过程:从队列中弹出一个字节,当接收到字符为@时进入GET@HEAD状态,否则状态任然为NOPACKHEAD。再从数据包中弹出一个字节,当接收到的数据为@时进入GET@BODY状态,否则返回到NOPACKHEAD状态。继续弹出数据,直到弹出的数据为#进入GET#TAIL状态,当接下来的第二个#数据时结束数据时表明获取的完整的数据包,通过队列发送给其他任务处理,并将状态值为NOPACKHEAD。图4指出了从队列中检索三种数据包的状态机。
图4数据包检索状态机
状态机的使用防止了连续数据包给系统带来的混乱,屏蔽了串扰信号的影响,加快了数据处理的速度。
以太网接收数据的过程相对简单,底层的TCP/IP协议按照数据发端已经将数据包分割完整。处理的方法就是将数据放到OSQ队列中去等待处理。
rec_count=recvfrom(sock,erthnetsharebuf, 1040, 0, (struct sockaddr *) & servaddr, &iii );(1)
OSQPost(TranslateQFlag,erthnetsharebuf);(2)
erthnet_sharebuf = (unsigned char *)OSQPend(TranslateQFlag, 0, &err);(3)
if(err==OS_NO_ERR){
……相应的处理
}
程序(1)为UDP接收数据包函数,接收到的数据通过程序(2)的队列发送出去。程序(3)等待队列中的数据,判断无错误后进行相应的处理。
3.2.3串口和以太网数据的发送
在数据发送端数据的处理方法类似,不论是串口还是以态网口在发送数据包形成之后将发送的数据添加到先进先出的连表中。数据先到先发送,发送完成后并不立即删除节点,在收到回复确认数据后遍历连表删除对应节点。下面所示的数据结构中包涵了连表节点的一些重要信息。
struct node //自定义连表节点
{
unsigned char flow_num[2]; //数据包流水号
unsigned char *p_addr; //连表数据包内容
int len; //记录数据包的长度
volatile unsigned long send_time; //记录数据包发送的时间点
int times; //记录数据包重发次数
struct node *next; //下一个连表节点指针
} ;
图5单项连表结构
图5为所示为为消防网关发送数据的链表结构。链表初始化时让系统链表的头部指向尾部,当数据需要发送时增加一个数据节点,后来的数据包继续增加增加到链表的尾部。
3.3.4协议转换
由于市场中存在很多非标准的警报探测器和控制器,每种控制器的通信数据协议不相同,而消防网关和监控中心数据的传输必须是国家标准形式。在消防网关设计中涉及到两种协议的转化:1.两个国家标准协议之间的转换。2.非标准协议和国家标准协议之间的转换。如下图所示对标准型协议直接进行翻译和处理,对非标准型协议首先转换成《火灾报警控制器与上位机见的数据通信协议》,然后进行两个国家标准协议的转换。
图6消防网关协议转换图
在具体设计中采用子函数调用的方式,在协议转换的子函数中对接收非表标准数据类型进行判断,转换成相应的标准协议的应用数据单元,应用数据单元形成后再给数据添加报头和包尾。
int convertGEC2000(unsigned char *in,unsigned char *out);
上面的函数为将安吉斯公司GEC2000型数据转换成标准协议应用数据单元。
3.3稳定性分析
基于Cortex-M3的消防网关实现了数据的成功转发和处理,通过实验室跨NAT路由器测试,无丢包现象。在复杂的网络环境中经过测试数据包在3s内到达。每分钟一次的定时连接数据包保证线路的可靠性。系统连续开机数天并未发生死机或程序运行不正常,证明系统工作稳定。
网关系统实时检测主电和备电的状态在面板上进行显示,并随时做好切换的准备保证供电系统的稳定。
4 结语
文章本文设计了基于嵌入式系统的RS23和以太网通信网关。基于Cortex-M3的硬件平台功耗低、工作稳定。基于µc/os+TCP/IP软件下任务合理的分配和使用队列状态机和链表数据结构做到了数据的实时处理正确处理和传输。在Cortex-M3+µc/os+TCP/IP软硬件平台下,软硬件很好的进行了结合,很好的满足了消防网关系统的要求。
参考文献:
[1]Jean J Labrosse.uc/os—II源码公开的实时嵌入式操作系统. 邵贝贝[M]. 北京: 中国电力出版社,2003.
[2]中华人民共和国国家标准,火灾报警控制器GB4717—2005.
[3]中华人民共和国国家标准 火灾报警控制器与上位机见的数据通信协议 2008-08 征求意见稿
[4]中华人民共和国国家标准 城市消防远程监控系统报警传输网络通信协议 2007-06 征求意见稿
[5]W Richard Stevens.TCP/IP详解三卷全.范建华译[M] .机械工业出版社,2000.
[6]周立功 等编著.Cortex-M3 开发指南---基于LM3S8000[M].广州:广州致远电子有限公司,2007.
[7]LuminaryMicro公司.LM3S8962数据手册(Datesheet_LM3S8962.pdf). 美国:
LuminaryM icro公司,2006.
[8] LuminaryMicro公司.StellarisTM 驱动库用户指南(sw02034-852.pdf). 美国:LuminaryM icro公司,2006.
[9]嵌入式实时操作系统uc/os—II教程.吴永忠 程文娟 郑淑丽等编著[M] .西安电子科技大学出版社
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。