浅谈嵌入式系统中网络通信模块的实现
扫描二维码
随时随地手机看文章
嵌入式系统是“控制、监视或者辅助装置、机器和设备运行的装置”(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、对可靠性、成本、体积、功耗有严格要求的专用计算机系统。
1. VxWorks中的网络通信原理
1.1 VxWorks的网络协议
VxWorks 是美国 Wind River System 公司( 以下简称风河 公司 ,即 WRS 公司)推出的一个实时操作系统。Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Microsoft Visual C,但是提供了更丰富的调试、仿真环境和工具。它提供了对其它VxWorks系统和TCP/IP 网络系统的"透明"访问,包括与BSD套接字兼容的编程接口,远程过程调用(RPC),SNMP(可选项),远程文件访问(包括客户端和服务端的NFS机制以及使用RSH,FTP 或 TFTP的非NFS机制)以及BOOTP 和代理ARP、DHCP、DNS、OSPF、RIP。无论是松耦合的串行线路、标准的以太网连接还是紧耦合的利用共享内存的背板总线,所有的 VxWorks 网络机制都遵循标准的 Internet 协议。
在传输媒介上,VxWorks使用TCP/IP和UDP/IP协议作为VxWorks进程与其他主机环境进程之间数据传输的工具。VxWorks的所有网络机制都遵循标准的Internet协议。在以太网协议之上,VxWorks提供了以下几种网络工具:套接字(socket);远程过程调用(Remote Procedure Calls);远程文件存取(Remote File Access);文件输出(File Export);远程命令执行。
1.2 VxWorks中的Socket接口
本文网络通讯接口是基于套接字(socket)来实现的。利用套接字,无论是单一CPU中的不同进程,还是通过共享内存底板,以太网或任何类型的网络连接的进程都可以实现通信。套接字是与网络节点的UDP或TCP端口捆绑在一起的通信接口。VxWorks实现了标准的BSD流套接字和数据报套接字。socket接口增加了网络通信操作的抽象定义,与文件操作一样,每个打开的socket都对应一个整数,称之为socket描述符。
1.3客户/服务器编程模式
网络编程一般采用客户/服务器(Client/Server)模式。服务器端有一个或多个任务在指定的端口等待来自客户端的连接请求,一旦连接成功,即可按约定的数据交换方法和格式进行数据传输。在C/S编程模式下,网络应用程序可分为客户端程序和服务器端程序。
客户端程序是指发出用户请求的程序,它需要知道服务端的地址,提供服务的端口号,服务所用的传输层协议类型。服务器端程序是提供服务的一方,它侦听某个端口,等待来自客户端的请求消息。在程序结构上,服务端程序可使用循环模式和并发模式。循环模式是指程序结构总体上是一个循环,一次处理一个请求。并发模式是指服务端程序可同时处理多个请求,结构上一般采用父进程接受请求,然后产生子进程来处理请求。
2.基于socket的C/S编程模式的嵌入式系统应用实例
2.1嵌入式系统的结构
本嵌入式系统作为一个整机系统的子系统运行于VME总线的VME处理器上。嵌入式系统是面向用户、面向产品、面向应用的,它必须与具体应用相结合才会具有生命力、才更具有优势。因此可以这样理解上述三个面向的含义,即嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。系统结构意图如图1所示。
图1:板卡驱动程序示意图
硬件板卡主要由DSP子系统组成,它接收外部传感器信息,控制执行器实现目标功能。DpRAM模块是VME处理器和硬件板卡之间共享的双端口RAM。板卡驱动程序的目的是提供一系列接口函数,对用户屏蔽掉硬件板卡的硬件细节。其主要任务是分发硬件板卡命令,传递命令伴随的I/O参数。
2.2网络中间件
根据上面介绍的VxWorks中的网络通信原理,我们开发了一个用于分布式系统上的任务/进程之间的通信模块CX。本文中CX公共模块采用的是基于TCP协议的流套接字和阻塞模式,其中TCP协议是一种面向连接的通信方式,提供了有序的、无重复并且无记录边界的数据流服务,同时流量和拥塞控制以及传输数据校验保证了数据传输质量;阻塞模式节约资源。
系统中CX的作用类似于网络中间件,它将VxWorks中socket编程接口封装成进程间通信的统一接口,从而屏蔽掉底层的通信细节,调用者不需要具备socket通信的技能就能直接调用CX接口函数进行通信。在实际整机系统中,许多不同任务驻留在不同的CPU处理器上,即使同一处理器上由于任务的进一步划分,子任务之间也存在进程之间的通讯。不管通信的实体(任务/进程)在同一CPU上,还是不同CPU上,都能够直接以逻辑地址(CX Address) 利用CX公共通讯模块来进行通信,CX模块主要提供了如表1的功能:
本文中CX公共模块在设计过程中对以下各方面也进行了兼顾:
1、CX传送数据的实时性保证:网络中间件针对所有接收函数都提供有timeout的功能,这样既避免了client挂起而接收不到回应消息;
2、CX的重发机制:当一个server没有侦听到请求时,client可以多次向server重发请求,重发间隔时间由调用者自己设定;
3、CX支持阻塞模式:使用select机制来同步多路I/O复用。允许client从多个server等待回应。server同样也可以使用这样的机制来等待请求消息,或从其它server处等待回应消息;
4、CX的监视机制:提供单独的进程来监视host的状态,一旦某个host不可访问就会产生错误或警告信息。
2.3网络中间件的实例
int CXc_send(const CX_serv serv_addr, const void *msg, int len, int retry_interval )
{
int serv_num;
int result;
//检查调用CX的任务是否已向CX注册,CX是否在本地host上初始化
if((!CX_TaskInitialized)||(!CXs_CXisInitialized()))
{ result = CX_NOT_INITIALIZED; }
//参数检查
else if((len <= 0)||(len>CX_MaxMsgSize))
{ result = CX_ILLEGAL_MSG_LEN; }
else
{ //将server地址转换为server号
result=ServAddr2Num(serv_addr, &serv_num );
if(result == OK)
{ //发送请求消息
result = CXclient_send( serv_num, msg, len, retry_interval );
}
}
return result;
}
int CXclient_send( int serv_num, const void *msg, int len, int retry_interval )
{
int result;
result = CX_CONN_RESET;
while(result == CX_CONN_RESET)
{
//检查cliet是否还与server保持连接,如果没有则建立连接
if(!CXclient_IsStillConnectedTo(serv_num))
{ result = CXc_Connect(serv_num, retry_interval);
if(result != OK)
{ return result; }
}
//向server发送消息
Result = CXFD_WriteMsg(Client_Admin[serv_num].cl_write_fd, msg, len);
//如果没有发送成功,则返回错误码,并修改client相应的项目
if(result == CX_CONN_RESET)
{ Client_Admin[serv_num].cl_is_connected = FALSE; }
}
return result;
}
2.4基于网络中间件的板卡驱动程序
板卡驱动的软件结构采用C/S(Client/Server)模式,客户端和服务器通过CX模块通信。Client发送请求消息到指定的server,server从client接收请求消息,执行请求的动作,发送一个包含请求动作执行结果的消息给发送请求的client。板卡驱动的软件结构示意图如图2所示。
图2:板卡驱动软件结构示意图
板卡驱动的外部接口函数ILDXA_xxx以库文件的形式提供给用户,作为请求服务的客户端。用户通过调用这些接口函数向服务器端发送请求。
请求发送成功后,客户端调用接收返回消息的函数来接收服务端返回消息:CXc_recv。
服务器端则通过一个无限循环的进程等待来自客户的请求消息,接收请求消息的接口函数是:CXs_recv。
服务器端接收到请求消息后调用相应的处理函数来处理传递过来的命令和参数,并继续等待下一个请求。当命令执行完后,外部中断信号会中断服务器端处理器。
3结束语
VxWorks是一种高效的多任务的嵌入式实时操作系统,网络是VxWorks系统之间以及与其他系统通信的主要方式。VxWorks 提供了一个快速灵活的与 ANSI C 兼容的 I/O 系统,包括 UNIX 标准的Basic I/O(creat(), remove(), open(),close(), read(), write(), and ioctl()。),Buffer I/O (fopen(), fclose(), fread(), fwrite(), getc(), putc()) 以及POSIX 标准的异步 I/O。VxWorks 包括以下驱动程序:网络驱动、管道驱动、RAM盘驱动、SCSI驱动、键盘驱动、显示驱动、磁盘驱动、并口驱动等 ?本文讨论了VxWorks中网络通信的关键技术,其创新点在于:利用这种基于socket的面向连接的网络通信机制,开发了普适于整机系统通讯的公共模块-CX网络中间件,具体到该嵌入式分系统应用中实现了上位机与硬件板卡的实时通信,取得了良好的效果。
QICK