引言
VxWorks操作系统作为一种嵌入式实时操作系统(RTOS),拥有高性能的内核以及友好的用户开发环境,发展为当今较流行的嵌入式系统。其应用遍布通信、国防、工业控制、医疗设备等多个嵌入式领域。
S698T是珠海欧比特控制工程股份有限公司面向嵌入式控制领域而研制的一款高性能、高可靠的SoC 芯片,以130 nm CMOS 半导体工艺制造。S698T芯片以高性能的SPARC V8(IEEE1754)架构,标准的32 位RISC 整数单元IU 为主控内核,配以IEEE754 标准的64 位双精度浮点处理单元FPU。此外,S698T内部还集成了1553B总线控制器、ARINC429总线控制器、CAN总线控制器、多功能I/O接口、UART接口、在线硬件调试支持单元DSU、DAC模块、ADC模块等多种功能模块。
ARINC429总线协议是美国航空电子工程委员会(Airlines Engineering Committee)于1977年7月提出的,并于同年同月发表并获得批准使用。数字式信息传输系统DITS,规定了航空电子设备及有关系统间的数字信息传输要求。ARINC429广泛应用在先进的民航客机中,如B737、B757、B767等。ARINC429总线结构简单、性能稳定、抗干扰性强。最大的优势在于可靠性高,这是由于它非集中控制、传输可靠、错误隔离性好。
1 S698TARINC429驱动程序设计
ARINC429驱动基于VxBus模式进行开发,VxBus是在VxWorks中用于支持设备驱动的特有架构。VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常通信。它包括以下功能:
① 允许设备驱动匹配对应设备;
② 提供驱动程序访问硬件的机制;
③ 允许软件其他部分访问设备功能;
④ 在VxWorks系统中,实现设备驱动的模块化。
在VxWorks6.2版本发布前,设备驱动并不能被集成到VxWorks工程配置当中,为了添加或移出设备驱动,需要有丰富的BSP和驱动开发相关的知识。并且在驱动被添加或移出时要去做一些管理VxWorks工程的额外工作。作为VxWorks系统组件的一部分,VxBus消除了上面遇到的一些难题,各种驱动和支持组件的添加与删除完全可以在Workbench工程中进行,而不需要BSP和驱动相关的知识,也不会在添加、删除驱动时增加管理VxWorks工程的额外工作。因此大大方便了BSP的开发。
ARINC429驱动采用第三方驱动程序的组织方式,VxWorks允许驱动程序开发厂商和开发者创建第三方驱动程序,不需要担心不同厂商的文件之间的命名空间冲突。每一个想提供VxWorks驱动程序的厂商必须在3rdparty目录创建自己的子目录。
尽管一个驱动程序可以包括很多文件,比如多个源文件和多个头文件,但是一个标准的VxWorks驱动程序有一个最小的文件集,对于大多数VxWorks驱动程序最少要求6个文件,如表1所列。
表1 VxWorks驱动程序
一般情况下,CDF文件、dc文件、dr文件都被认为是驱动程序的配置文件,下面详细介绍这些文件。
1.1 驱动程序源文件
驱动程序源文件包含了驱动程序功能的实现逻辑,它们被放在目录 installDir/vxworks6.x/target/src/hwif,第三方驱动的源文件放在目录installDir/vxworks6.x/target/3rdparty。很多VxWorks设备驱动程序只包含一个源文件,一个驱动程序可以包含一个或者几个可选的头文件;驱动程序可以包含多个源文件,此时必须在Makefile里面提供各个模块的依赖规则。下面以文件leon2obt429.c为例来说明VxWorks驱动程序的结构。
设备驱动程序的第一部分是一个描述VxBus初始化阶段要调用的例程的结构:
LOCAL struct drvBusFuncs leon2OBT429DrvFuncs ={
leon2OBT429InstInit,
leon2OBT429InstInit2,
leon2OBT429InstConnect
};
接着就是描述驱动程序所支持的驱动方法的数据结构(每一种类别的驱动程序都必须实现该类的驱动方法):
LOCAL device_method_t leon2OBT429Drv_methods[] ={
{0, NULL}
};
然后描述该驱动程序需要的注册信息的结构:
LOCAL struct vxbDevRegInfo leon2OBT429DrvRegistration={
NULL,/* 后续设备指针*/
VXB_DEVID_DEVICE, /* 设备ID号 */
VXB_BUSID_PLB,/* 总线ID号*/
VXB_VER_4_0_0,/* VxBus版本号 */
"leon2OBT429Dev",/*驱动名称*/
&leon2OBT429DrvFuncs,/*驱动入口函数指针*/
&leon2OBT429Drv_methods[0],/*设备方法组*/
NULL,/*设备探测*/
NULL/*默认参数*/
};
在注册信息后面,驱动程序必须提供一个例程来向VxBus注册,表明该驱动程序的存在:
void leon2OBT429DrvRegister(void){
/*驱动注册,此时不需要真正的硬件*/
vxbDevRegister((struct vxbDevRegInfo *)
&leon2OBT429DrvRegistration);
}
由于驱动程序注册方法被当作是驱动程序的第一个入口点,VxWorks必须被配置成:当该驱动程序向VxBus注册时,VxWorks知道调用该入口点。为了做到这点,VxWorks使用的之前提到的那几个驱动配置文件:CDF文件、dc文件、dr文件。
1.2 CDF文件
CDF文件的全称是Component Description File,组件描述文件。根据VxBus标准开发的VxWorks设备驱动程序都被编译成一个单独的模块,可以使用VxWorks配置工具非常轻松地将驱动程序配置进BSP中。但是,必须为你的设备驱动程序创建一个VxWorks组件。
一个组件是一个基本的功能单元,它可以单独配置进入VxWorks内核镜像中。为了能够单独添加和删除设备驱动程序到VxWorks中,驱动程序必须能够被VxWorks配置工具识别成inpidual 组件。为了让驱动程序能够在Workbench或者vxprj中是可以配置的,必须创建CDF文件,CDF文件提供VxWorks配置工具所需要的信息。针对风河公司发布的设备驱动程序,其对应的CDF文件位于以下目录:
installDir/vxworks6.x/target/config/comps/vxWorks
在风河提供的驱动程序中,一个CDF文件可能包含着描述多个设备驱动程序的信息,对于第三方驱动,其CDF文件路径是在驱动程序目录下。
40leon2obt429.cdf文件的主要数据结构如下:
Component DRV_LEON2_OBT429 {
NAMELEON2 obt429 VxBus driver
SYNOPSISLEON2 obt429 VxBus driver provided by Wind River
REQUIRESINCLUDE_VXBUS \\
INCLUDE_PLB_BUS
MODULESleon2obt429.o
PROTOTYPEvoid leon2OBT429DrvRegister(void);
INIT_RTNleon2OBT429DrvRegister();
INIT_AFTERINCLUDE_PLB_BUS
_INIT_ORDERhardWareInterFaceBusInit
_CHILDRENFOLDER_DRIVERS
}
CDF文件使用上述语句来定义一个组件ID。VxWorks中的每个组件必须用 Component关键字来描述,驱动程序的ID一般以DRV_开始,并在ID中包含该驱动程序的描述性信息,每一类的驱动程序对组件ID都有着相同的命名习惯。设备驱动程序组件标准的命名习惯应该是DRV_CLASS_NAME。组件名字必须是唯一的,而DRV_CLASS_NAME中的 DRV和CLASS都有可能相同,这就要求NAME必须唯一才行。
2 S698TARINC429驱动应用编程
ARINC429是普通 I/O设备,设备打开、关闭通过标准open( )、 close( )函数完成。数据的收、发通过标准write( )、read( )函数完成,而通道的配置、选择等需要通过ioctl()函数完成。由于S698T中的429模块总共有6个通道:4个接收通道、2个发送通道。为了进行区分,软件在进行收、发操作之前要先进行通道选定,以下分别是调用ARINC429驱动完成ARINC429数据收、发操作的一般软件流程,如图1、图2所示。
图1 ARINC429数据发送流程图
图2 ARINC429数据接收流程图
以下示例调用ARINC429的驱动,完成ARINC429数据的发送、接收操作。示例需要新建一个VIP工程,新建429test.c文件中输入的程序代码略——编者注。
3 S698TARINC429应用执行结果
首先选择“wrleon23_sparcleon”BSP包创建一个VIP(VxWorks Image Project)工程。
完成工程的创建之后还需对内核进行配置。在Workbench左侧的Project Explorer窗口中点击创建的工程,再双击Kernel Configuration进入到内核配置界面。
为了让编译的镜像文件具有ARINC429功能,需添加ARINC429组件,首先查找到组件“LEON2 obt429 VxBus driver”,并将其添加到工程中。
将上节中编辑好的429test.c文件添加到工程中,最后要修改usrAppInit函数,增加对OBT429AppInit函数的入口调用。
编译整个工程,再通过dsumon调试器下载VxWorks映像到目标板上运行。
下载运行的步骤如下:
① 确保S698T开发板上的DSU口和UART0已连接到PC机;
② 先打开超级终端,打开相应的串口,用于S698T程序运行时的显示输出;
③ 再打开cygwin终端,进入工程目录,连接dsumon;
④ 将生成的Image文件下载进目标板。
命令描述如下:
$ dsumon i u
$ lo VxWorks
$ run
在超级终端上可以观察到运行VxWorks的运行结果,如图3所示。
图3 VxWorks ARINC429数据测试
从程序输出结果中可以看出,接收通道1完全接收了发送通道1发出的20个帧数据,前7帧为非0数据,后13帧为全0;由于选择的是25位字长模式,接收到的数据与发送数组中的数据存有差异,为(tempbuf[n] & 0x1FFFFFF),实际值与预期值完全相同。
另外还可以在VxWorks Shell中输入devs和vxBusShow命令来观察ARINC429硬件驱动的挂载情况,如图4所示。
结语
针对S698T处理器内部的ARINC429总线模块,开发了基于VxWorks6.7的ARINC429驱动程序,该驱动程序是标准I/O设备驱动,使用方便、处理灵活。本文详细给出了通过VxWorks VIP工程调用ARINC429驱动,完成数据收、发的过程,并给出了相关参考代码,以及对应的验证结果,可为后续的应用、开发工作提供帮助。
图4 VxWorks ARINC429设备驱动信息