跳至主要内容

【转】VxWorks嵌人式操作系统C/S模式网络编程

1引言

VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,使其在嵌入式实时操作系统领域占据一席之地。他以良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

  2 VxWorks的特点

  2.1 可靠性

  稳定、可靠是VxWorks的一个突出优点,因而他得到了越来越多的用户的认可。

  2.2 实时性

  实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件做出响应的能力。实时性的强弱是以完成规定功能和做出响应时间的长短来衡量的。

  VxWorks有很强的实时性,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,他们造成的延迟很短。VxWorks提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。

  2.3 可裁减性

  VxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks内核最小为8kB,即便加上其他必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于他的高度灵活性,用户可以很容易地对这一操作系统进行定制或做适当开发,来满足自己的实际应用需要。

  3 C/S模式网络编程

  网络是VxWorks系统之间以及与其他系统联系的主要途径。在VxWorks网络结构的最底层,通常使用以太网作为传输媒介;而在传输媒介的上一层,则使用TCP/IP和UDP/IP协议。

  VxWorks网络编程中最常见的是C/S模式,在该模式下,服务器端有一个任务(或多个任务)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按照设计的数据交换方法和格式进行数据的传输;而客户端则在需要的时候发出向服务端的连接请求。客户端与服务器端的关系如图1所示。

  3.1 C/S模式网络编程原理

  网络通信的基石是套接字,一个套接字是通信的一端。VxWorks为用户提供了2种套接字,即流套接字和数据报套接字。流式套接字定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。

  五连接的服务一般都是面向事务处理的,一个请求一个应答就完成了客户端与服务端之间的信息交互。无连接的套接字C/S模式程序的流程如图2所示。

   面向连接的服务比无连接的服务处理起来要复杂。面向连接的套接字C/S模式程序的流程如图3所示。

  套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接口,然后调用bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定他的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用recv()/recvfrom()和send()/sendto()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接口。

  3.2 编程实例

  下面给出一个面向连接的点对点实时通信的工程应用的实例。该实例应用于作者所在的"网络测试分析仪"项目中。他由两部分组成,服务器在VxWorks操作系统下运行,客户机在Windows下运行。

  3.2.1 服务端的程序设计

  服务端的程序设计在结构上可以使用两种基本模式:循环模式和并发模式。

  循环模式 服务端进程在总体上是一个循环,一次处理一个请求。在有很多客户端请求时,请求放人队列,依次等待处理。如果某个请求的处理时间过长,就会导致队列满而不能接受新的请求。

  并发模式 服务端进程可以同时处理多个请求,结构上一般采用父进程接受请求,然后调用fork产生子进程,由于进程处理请求。该模式的优点是可以同时处理多个请求,客户端等待时间短。

  由于是面向连接的点对点通信,所以实例中采用了循环模式。

  (1)建立自己的套接口

  sHost=socket(AF_INET,SOCK_STREAM,0)

  该函数建立指定通信域、数据类型和协议下的套接口,通信域为AF_INET(惟一支持的格式),数据类型SOCK-STREAM表示建立流式套接口,第3个参数为0,即协议缺省。

  (2)绑定本地地址

  bind(sHost,(struct sockaddr * )&serverAddr,sizeof(serverAddr))

  该函数将服务器地址与sHost绑定在一起,其中,serverAddr是sockaddr_in结构,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网上标识出来。

  (3)开始侦听

  listen(sHost,2)

  该函数表示连接请求队列长度为2,即允许有2个请求,若多于2个请求,则出现错误,给出错误代码WSAECONNREFUSED。

  (4)等待接收连接

  snew=accept(sHost,(struct sockaddr*)&clientAddr,sizeof(clientAddr)))

  该函数阻塞等待请求队列中的请求,一旦有连接请求来,该函数就建立一个和sHost有相同属性的新的套接口。clientAddr也是一个sockaddr_in结构,连接建立时填入请求连接的客户端的地址。

  (5)接收、发送数据

  recv(snew,recvbuffer,buflen,0)
  send(snew,sendbuffer,buflen,0)

  recv()和send()分别负责接收和发送数据,recv()从snew(建立连接的套接口)接收数据,放人recvbuffer中,send()则将sendbuffer中数据发送给snew,第4个参数,表示该函数调用方式,通常用于诊断程序或路由选择程序,可选择MSG-DONTROUTE和MSG-OOB,MSG-WAITALL,MSG_DONTWAIT,0表示缺省。

  (6)关闭套接口

  close(sHost)
  close(snew)

  3.2.2 客户端程序设计

  所谓客户端程序,指用来向服务端发出服务请求的程序。客户端需要知道服务端的地址、服务所提供的端口号以及服务所使用的传输层协议:TCP还是UDP。

  该实例基于面向连接的TCP协议。

  (1)调用WSAStartup()函数初始化WindowsSockets DLL

  Status = WSAStartup (VersionReqd,lpmyWSAData)

  (2)创建一个通信域为Internet、SOCK_STREAM类型、使用TCP协议的套接字

  sClient =socket (AF_INET, SOCK_STREAM,IPPROTO_TCP)

  (3)设置与套接字sClient相关的属性选项

  int sockopt=1
  setsockopt (sClient,IPPROTO_TCP,SO_KEEPALIVE,(char *)&sockopt,sizeof(int))

  setsockopt()函数用于任意类型、任意状态套接口的设置选项值。在不同协议层上存在选项,但往往是在最高的"套接口"层次上,设置选项影响套接口的操作,诸如操作的阻塞与否、包的选径方式、带外数据的传送等。该实例中打开了SO_KEEPALIVE选项,使得套接字sClient实现在TCP连接情况下允许使用"保持活动"包。

  (4)在套接字sClient上向服务器建立一个连接

  connect (sClient,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

  该函数让系统知道写到sClient的数据将发往何地,而且只有该地址发来的数据才被sClient接收。其中,serverAddr是sockaddr_in结构,其成员描述了服务器的地址族,提供的端口号以及服务器地址,如下,

  serverAddr.Sin_family=AF_INET
  serverAddr.sin_addr.s_addr=inet_addr(ServerAddress)
  serverAddr.sin_port=htons(Port)

  其中:ServerAddress和Port通过参数传人。

  (5)接收、发送数据

  recv (sClient,recvbuffer,buflen,0)
  send (sClient,sendbuffer,buflen,0)

  (6)关闭套接口

  Close (sClient)

  4 结 语

  VxWorks操作系统是目前在国内外风行的嵌入式强实时操作系统,而网络编程又是嵌入式实时系统软件的设计核心之一。本文作者介绍了基于TCP的面向连接的C/S模式的编程方法。该方法已经在NA3100网络测试仪中得到了良好而有效的应用。

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总...

【转】GPIO编程模拟I2C入门

ARM编程:ARM普通GPIO口线模拟I2C  请教个问题: 因为需要很多EEPROM进行点对点控制,所以我现在要用ARM的GPIO模拟I2C,管脚方向我设 置的是向外的。我用网上的RW24C08的万能程序修改了一下,先进行两根线的模拟,SDA6, SCL6,但是读出来的数不对。我做了一个简单的实验,模拟SDA6,SCL6输出方波,在示波 器上看到正确方波,也就是说,我的输出控制是没问题的。 哪位大哥能指点一下,是否在接收时管脚方向要设为向内?(不过IOPIN不管什么方向都可 以读出当前状态值的阿) 附修改的RW24C08()程序: #define  SomeNOP() delay(300); /**/ /* *********************************  RW24C08   **************************************** */ /**/ /* ----------------------------------------------------------------------------- ---  调用方式:void I2CInit(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CInit( void ) ... {  IO0CLR  =  SCL6;      // 初始状态关闭总线  SomeNOP();  // 延时   I2CStop();  // 确保初始化,此时数据线是高电平 }   /**/ /* ---------------------------------------------------------------------------- ----  调用方式:void I2CSta...

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如...