嵌入式设计应用
1 引言
本文提出的SM END驱动模型为分布式多处理器系统间提供了一种通过CompactPCI总线而进行网络通信的方式,使得系统两侧的上层网络应用程序可以通过标准网络接口与对侧系统进行透明的网络通信。
END是嵌入式实时操作系统VxWorks中工作在数据链路层的一种网络驱动模型,该模型定义了与MUX层交互的标准接口,用户只需要根据特定的网络接口硬件特性按要求提供这些接口即可实现END层与网络协议层的通信。END驱动模型的存在,使得VxWorks可以满足嵌入式产品对各种网络接口硬件的适应性和通用性,也使得通过软件模拟的满足END驱动特性的虚拟网络接口成为可能。
在基于总线的分布式多处理器系统中,SM是应用较为广泛的实现多处理器之间的一种通信手段。VxWorks操作系统也提供了对共享内存的支持,通过驻留在主系统或从系统中的共享内存,分别运行在主从系统上的两个任务可以像在单一系统中的两个任务一样进行透明的进程间通信。
基于SM的END驱动,从软件上将共享内存模拟为一个虚拟的网络接口,从而可以提供诸如IP over PCI等功能特性,使得上层的应用程序可以通过CompactPCI总线进行标准的网络通信。
2 END机制分析
VxWorks中的增强型网络驱动END是一个使用MUX功能来与网络协议进行通信的数据链路层驱动模型。MUX是数据链路层与网络层之间的接口, VxWorks提供MUX层以支持数据链路层与网络层的相互独立性。
在VxWorks的这种架构下,网络层协议和数据链路层驱动程序不能直接通信,而必须通过MUX。网络层要调用数据链路层上的驱动程序以发送数据,那么网络协议就需要调用相关的MUX例程,同样链路层上的驱动程序需要访问网络层(IP或其他协议)时,也需要调用相关的MUX例程。图1给出了网络层、MUX层和驱动层三者之间的接口。
图1 协议层、驱动层与MUX层的接口
END设备需要初始化才能工作。初始化的第一步是向系统注册END设备,接着应该在系统初始化时通过MUX层接口加载END设备,然后可以通过MUX层接口启动END设备驱动或将网络协议绑定到END设备。在中断模式下时,END层的启动例程在启动设备的同时需要连接中断服务程序,当END设备收到数据包而引起中断时,会调用此中断服务程序进行数据接收工作;另一方面,网络协议也可以通过MUX层接口将它自身绑定到END设备以实现轮询模式的工作方式。
当VxWorks收到由数据到达引起的中断时,它调用由END启动例程注册的中断服务程序。该中断服务程序将数据帧从本地硬件传递到系统缓存,并通过回调函数将此数据缓存传递到MUX层。MUX层接收例程进而调用协议层的接收函数将数据缓存传送到应用程序。
当上层应用程序需要向外发送数据时,通过协议层的接口调用MUX层的发送例程,MUX发送例程通过回调函数将数据缓存传递给END驱动,END驱动进而将要发送的数据缓存复制到设备的发送队列,当设备收到发送数据中断时,中断服务程序调用发送函数将设备发送队列中的数据发送出去。END机制下的数据接收和发送过程分别如图2(a)、2(b)所示。
3 SM END设计与实现
从上面对END驱动工作原理的分析过程中可以看出,在这样一种模型下,END驱动程序和上层协议之间是透明的,它们并不了解彼此的内部信息,而是通过MUX层这个接口来进行间接地通信。保持这种透明性最大的好处是便于移植,可以很容易地增加一些新的END驱动程序或协议而能够保持透明的通信。正是基于这一点,本文基于一种共享内存机制,将共享内存作为一种虚拟网络设备,设计了基于共享内存的END驱动。基于共享内存的END驱动不再利用物理网络设备的中断服务程序进行数据的收发,而是直接使用底层共享内存机制的收发例程完成数据的收发,从而实现主从系统之间的网络通信方式。
具体来看,SM END模型可以分为三部分,初始化、加载与启动。SM END的初始化与标准END的初始化步骤相同,具体方法在稍后的实现部分说明。加载SM END设备,即向系统注册SM END驱动模块,也与标准END的加载过程相同。启动部分有区别,因为共享内存并不是真实的物理网络设备,因此它不能像物理设备那样通过中断触发数据的收发。本文利用底层的共享内存驱动机制实现数据的接收,即在启动SM END驱动时向底层的共享内存驱动模块先注册一个回调函数(SmEndCallBack()函数),底层的共享内存驱动收到数据后,再调用此前SM END向其注册的回调函数,进行数据的接收处理。在发送数据时,SM END驱动可以直接调用SM驱动的发送例程进行数据发送。基于SM END的数据收发流程如图2(c)、2(d)所示。
图2 数据接收和发送流程
需要指出的是,本文所提出的SM END模型是独立于底层具体的共享内存机制的,这样,在编码实现SM END驱动时,只需要调用底层具体的共享内存机制向上提供的发送和接收接口函数就能实现不同共享内存机制下的SM END驱动。
SM END的实现上,需要完成两部分任务,一部分为SM END设备的初始化,一部分为SM END需要提供的接口函数。SM END设备的初始化部分,只需要在VxWorks提供的框架下进行简单的操作即可,具体来讲有两步工作要做:第一,在系统中添加END机制模块,即在BSP目录的config.h文件中增加宏INCLUDE_END;第二,向系统注册SM END设备,即在BSP目录的configNet.h文件的全局变量endDevTbl中增加SM END设备对应项。
SM END驱动需要提供的接口函数必须与标准END驱动接口函数一致,表1列出了SM END驱动所提供的全部接口函数。其中,SmEndLoad()函数完成向系统加载SM END驱动模块的功能,具体来说,它需要创建并初始化SM END数据结构,并为SM END驱动模块分配内存以缓存发送和接收的数据包。SmEndStart()函数启动SM END设备,内部实现是向底层的共享内存驱动模块注册回调函数,当共享内存驱动收到数据后再调用此回调函数进行数据包的接收。SmEndSend()函数通过调用SM模块的发送例程实现END层的数据发送功能。SM END驱动必须能够支持多播,SmEndMCastAdd()、SmEndMCastDel()和SmEndMCastGet()实现SM END设备对多播的支持。此外,SM END驱动还提供对数据包的操纵函数和I/O控制等等支持。
表1 SM END驱动的接口函数列表
4 结束语
本文在详细分析了VxWorks中END驱动工作原理的基础上,结合实际需要,提出了基于共享内存的END驱动模型,该SM END驱动模型独立于具体的共享内存机制,在一种共享内存机制下实现了SM END驱动。
全部0条评论
快来发表一下你的评论吧 !