引言
随着信息技术的不断发展和更新,嵌入式操作系统以其速率高、稳定、可配置内核的优势正得到越来越广泛的应用,包括医学、图像处理、军事、工业控制、电信等许多领域。嵌入式系统必须采用特殊有效的实时操作系统,VxWorks正是一个具有高性能的实时操作系统,成为嵌入式系统操作内核的最佳选择之一。随着嵌入式系统在网络当中的应用不断加强,具有多种数据通道的复合通信模式显得列为必要。本文根据基于VxWorks的嵌入式系统对于数据通信的不同要求,提出一个嵌入式系统复合通信模型,研究几种具有代表性的数据通信方式,并论述在VxWorks下的实现方法及其一些关键技术。
1 嵌入式系统复合通信模型的设计
嵌入式系统在控制领域应用十分广泛,例如在工业控制当中常常利用嵌入式系统作为中央控制机,完成信息采集、分系统监管、系统决策等等重要功能。硬件往往离不开软件的支持。VxWorks操作系统是目前功能最全的、独立于处理器的嵌入式实时操作系统之一。考虑如何基于VxWorks实现嵌入式系统的复合通信方式是有意义的。由于此时嵌放式系统已经不再是孤立系统,而是处于某种拓扑网络结构当中,因此,有必采取复合通信模式以适应系统扩展、集中控制和远程信息传输的需要。控制机应当具备优良的系统总线、可靠的控制网络、高速传输通道接口以及远程数据管道。综合以上考虑,图1给出了一个控制机的复合通信模型。 控制机本身采用VME总线标准,可以嵌入多块单板机,具有良好的系统扩展性。为了适应不同的通信要求,外围有三种通信接口。其中光纤通信传输速率很高,适合作为大流量数据通道,例如信号处理机数据传输管道。串口通信设备简单、成本较低,传输速率适中且安全性高,可以作为远程数据通道。以太网则由于其极佳的增容性、稳定性,适合于局域网络控制体系。
2 复合通信模式特点分析
为了对以上复合通信模型加以说明,下面对片几种通信模式的特点进行分析。
(1)总线标准 目前常用的总线标准有多种,基中VME总线支持多处理器系统,最多可以容纳21块插件。地址总线32位,数据总线32位,数据传输速率可以达到 80Mb/s。VME总线能处理7级中断,具备高速的实时响应能力。VME总线采用主-从结构,主功能模块传输数据之间必须先使用中央仲裁器,也称为系统控制器,具有总线仲裁功能。VME数据传输总线是高速异步并行的,模块间数据传输是通过连锁的握手信号实现的。具有高可靠性,同时其模板结构具有良好的抗震性,适应较为恶劣的工作环境[1]。
(2)控制网络 控制网络一般采用局域网。由于TCP/IP协议是一个标准的企业网络协议,是比较完善的、公认的最有效的互联协议,因此目前流行的操作系统都支持TCP /IP协议,TCP/IP协议还是个稳定的、对称的、支持交叉平台的Client/Server方式的结构,并为应用程序提供了标准接口,对于集中控制的嵌入式系统采用基于TCP/IP的网络通信无疑是方便而且有效的。
(3)高速数据接口 目前来看,光纤通道作为高速数据通信是最为有利的。它是一种利用光纤(苦口婆心铜缆)作为物理链路的高性能串行数据接口,支持SCSI、IP等上层数据传输协议,具有可靠性高、速度快和传输距离的特点,可用来连接大型机、服务器和存储设备以实现高速大容量的信息传输。对于分离的嵌入式硬件系统而言,采用光纤通道作为高速I/O数据接口无疑是一种很好的选择。
(4)远程数据通道 由于控制机的远程数据传输需要较高的安全性,同时一般只需单路传输,如果使用光纤电缆显示成本高而且不需要那么高传输的带宽,因此可以考虑使用串行口通信。串行口在嵌入式系统当中是一类重要的数据通信接口。由于RS-422标准串行口通信采用了双线传输,大大增加了抗共模干扰的能力,最大数据传输速度可以达到10Mb/s,这对于远程数据交换具有极大的优势,因此可用于远程信息交换。
3 复合通信方式的实现与关键技术
由于本文的讨论与单板机生产商所提供的板级支持包有关,而不同类型的单板机所提供的板级支持包(BSP、ESP)也会略有不同,为了不失一般性同时具有一定先进性,本文采用英国Radstone公司生产的PPCx系列单板机作示例。PPCx系列单板机功能集成度高、扩展性强、性能稳定,可以添加多种外围存储设备、支持高分辨显示,是一种理想的单板机系统。
3.1 基于VME总线的DMA通信方式
在VME总线上,每个单板机如果要访问其它单板机的RAM,必须通信VME总线地址映射。因此,每块板上有两个地址译码器,一个用于VME总线地址→本地地址译码,而另一个用于本地地址→VME总线地址译码,这样就会存在多个不同的存储器地址映射。如果想要访问某个单板机的RAM,需要知道该单板机的 RAM本地址所映射成的VME总线地址,然后通过访问VME总线地址映射到自身的本地地址而访问到系统控制器,甚至可以将其看成自身的RAM地址。多处理器地址映射关系如图2所示。 综上所述,对于某一VME总线中的任务一块板而言,只要获得了它的本地地址到VME总线地址的映射关系,就可以从板外来访问该板的RAM。VxWorks 标准函数库sysLib当中提供了函数sysLocaltoBusAddr(),可以直接获得本地地址的VME总线地址。这样,当前主机只需调用该函数获得自身RAM地址到VME地址映射,其它的主机就可以根据该映射得到的VME总线地址访问该主机。因此,当需要对于外板的某些控制寄存器进行位元操作的进修,这种方法就显得尤其重要:因为往往没有函数能够仅仅对于外板RAM的某个字节进行操作,更无法定位到位操作。 为了进一步提高数据传输速率,可使用PPC4A上的VME控制芯片Tundra中集成的DMA控制器。它支持基于VME总线的DMA数据传输方式,而 DMA是外存数据传输最有效的一种方式。具体步骤如下: ①安装DMA驱动程序,调用函数dmaDrv(); ②建立DMA设备,调用函数dmaDevCreate(); ③打开DMA进行读写,调用函数open()、write()、read()。 DMA设备句柄就是一个类似于文件指针的数据类型,所以可以像一个标准数据操作来对待。开启设备后即可调用文件读写标准函数进行读写操作。通过较为严格的测试,DMA数据传输速率可以达到40Mb/s以上,并且不发生数据传输错误。
为了保证主机对于其它主机DMA传输数据的实时响应,应当产生VME总线中断信号通知该主机。当某个主机发送数据完毕后,须调用VxWorks提供的函数 sysBusIntGen ()t向VME总线产生一个级别为intLevel、中断号为intNum的中断信号。 接收端主机事先建立一个与该级别中断信号对应的客户中断服务程序,并将该客户中断服务程序链接到所要求级别的中断号上,从而实现对其进行实时响应。当主机接收到属于自己的中断信号后,会立刻自动调用该中断服务程序。这时可利用中断服务程序释放一个信号灯,通过该信号灯驱动相应的数据处理模块,从而实现实时操作。如下面的全程: /*客户中断服务程序*/ void intHdlr(SEM_ID semId) void intHdlr(SEM_ID semId) { /*释放信号灯*/ semGive(semId); } /*等待信号灯的处理模块*/ void processsModle(void) { /*等待信号灯*/ semTake(semld); /*处理模块代码*/ … } VME总线共有7个中断级别,排除系统使用的中断号,客户自定义中断号可从18设置到32。这样能够为足够多的主机设置中断服务程序,从而实现 VxWorks操作系统下的多主机VME总线实时高速通信。
3.2 串行口通信
在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,所以串行口通信软件的设计和VME通信具有相似之处。在 VxWorks中,任何对于串行口的操作仍然可以视为对一个文件的操作,而不必了解关于设备或程序驱动实现的细节。在串行口通信软件的设计不中,利用 RRCx的增强软件包ESP可对驱动成功后的串行口设备进行操作。系统首先调用ESP软件提供的esccDrv()安装串行驱动程序,随后调用 esccDevCreate()将指定的串口设备添加到系统中,当串口初始化完成后,与DMA操作方式类似,在使用之前利用open()打开相应串口,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。 对于串口通信,仍然要关心数据接收的实时性。可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。
3.3 基于TCP/IP协议的网络通信
网络通信一般可通过套接口(socket)实现。VxWorks提供了标准的BSD socket调用,具有两种类型:Stream socket(全双工流类型)、Datagram sockets(数据摄类型)。前者支持TCP协议,后者支持UDP协议。任何一个任务都可以打开一或多个socket,其它任务的socket可与之连接。客户端程序首先调用socket()个函数产生用于与各分系统连接的套接口,并为每个套接口返回一个ID号,然后初始化一个套接口结构体,为其赋上该 ID号以及服务端的IP地址和端口号,并将具作为函数connect()的参数,调用connect()函数主动去连接客户端。服务端则需调用 bind()函数将自身IP和端口号绑定,以保证客户端正确识别。为了确保服务器能够实时接收客户端的数据,当服务端与客户端建立连接之后,必须嵌入循环,利用read()语句不断等待客户数据。同时客户端每次发送数据之后也应等待服务端回复,建立握手机制。一个完整的socket网络应该可以用图3来描述。值得指出的是,read调用具有一个PEEK选项,即向接收缓冲区探测是否有数据而并不真正取出数据,根据它的返回值可以判断出网络的状态。这个功能适用于网络查错。
3.4 光纤通道
由于光纤通道(fibre channel)接口并非VxWorks自身具备的组件,因此,VxWorks内核上实现光纤通信也需要加载相关的驱动程序;同时,主机也需安装光纤通信适配器,然后通过光纤电缆连接。下面仍以PPCx系列单板机为例来说明。 这里采用QLA2200作为光纤通道适栩器。QLA2200/66是Qlogic公司生产的、目前应用最为广泛的光纤通道适配器。它主要包括四个功能模块:高速RISC处理器,包括千兆位收发模块、通道控制、帧缓存等的FC接口,有三个通道PCI总线DMA控制器以及ISP2200A的外存储器。 RRCx的ESP为该适配器QLA2200提供了驱动程序,支持基于交换机、仲裁环以及点对点等三种拓扑结构的SCSI、IP和低开销访问(LLA)协议,其固件协议层结构如图4所示。
当VxWorks启动之后,需要调用QLA2200的初始化函数ql22Init(),该函数的功能是驱动PPCx主板上QLA2200的PCI板卡,包括SCSI、IP固件协议初始化。此时,可在光纤通道上建立基于SCSI或IP协议的数据通信模式;而LLA实际上一种不具备协议管理的点对点通信模式,可节约大量系统开销,故称之为低开销方式。它可以建立一种类似于服务器/客户机的通信机制,即服务端可以实时响应客户端的数据请求,但它同样缺乏握手安全机制。因此,如果客户端连续发送两次大批量数据,将会由于服务器来不及接收导致该两批数据首尾发生冲突,故需加以改进。LLA的服务器/客户机通信机制是通过调用函数ql22laHookAttach()在服务端设备一个挂钩函数来实现的。每当客户端向服务端发送数据,该挂钩函数将会立刻自动响应,因此,可以在挂钩函数当设置VxWorks消息队列,将接收帧缓存区中的数据取出。如下面的程序: BOOL ql22LlaClientInputHook() {… /*将缓存区数据发送到服务端本地消息队列当中去*/ msgQsend(ServerQueue,ClientData,Length,NO_WAIT,0); } 采用消息队列接收数据则是由于它具有消息自动追加功能,可以保证数据在高速拷贝时不被覆盖。当传输完毕后,服务端就可以将消息队列当中的数据取出来进一步处理。客户端则应当在每次发送数据完毕之后等待服务端的回答,首到得到确认之后才可以进行下一步发送。因此,客户端必须设备回复等待,这可以利用信号灯来实现。LLA具有很高的传输速率。根据测试,在实施了握手通信机制后,传输速率可达50Mb/s以上,而且实现,系统开销很小,适应于点对点的主机高速通信。
4 结论
本嵌入式系统复合通信模式具有多种通信接口,可适应不同的数据通信需要。同时,由于VxWorks高效的实时性以及强大的兼容性,使得复合通信的实现变得更加容易并且具有良好的实时性和安全性。通过实际运行,系统内部各个模块运行稳定,软件的模块实时调度表示良好,经长时间的运行未发现通信阻塞。该复合通信模式可适用于工业控制、医疗等多方面,具有广泛的适应性。