在VxWorks系统下进行驱动或者应用程序开发,通常有两种情形,一种是源码开发,拥有所有的源代码,建工程和编译生成应用或者系统镜像,都基于源码。另外一种是基于库的开发,可能是一些商业的库,也可能是自己为了保护知识产权,特意制作成库文件提供给使用方。

最近一个项目中开发了几块CPCI板卡,驱动已经驾轻就熟,可是这次甲方需要将驱动封装成库,这个以前没做过,研究了一下,现于大家分享。

最简单的办法,是新建一个download工程,把所有源文件加进去。

以Tornado2.2为例,可以在工程管理树那里选Builds选项卡(另外两个是files和vxworks),再右键点你所用的Buid模式,选 properties,然后再rules选项里选输出格式。选archive输出.a文件,选object输出.o文件。

同样,在需要包含.o和.a文件的那个工程里,在Builds->properties->macros里选择PRJ_LIBS,如果是vxworks,则选EXTRA_MODULES,然后填入需要包含的.o和.a文件的全路径。然后编译就OK了。

注:实际应用中将Builds->properties->rules 中选择输出格式为archive就OK了 ,编译后库文件的名字就是创建工程的名字。

使用方法:

1. 创建.h头文件
#ifndef __CPCIDRIVER_H__
#define __CPCIDRIVER_H__

#ifdef __cplusplus
extern "C" {
#endif

typedef  struct
{
 DEV_HDR   devHdr; /* 必须 */

}
CPCI16IO_DEV;

/* 其他定义 */

IMPORT STATUS cpci32ioInit(void); //声明外部函数
IMPORT STATUS cpci32ioDrv(void);
IMPORT STATUS cpci32ioDevCreate(char *devName);

#ifdef __cplusplus
}
#endif

#endif /* __INCcpci16iodev */
2. Makefile文件修改

LIB_EXTRA 中添加相应.a文件

摘要:该文主要介绍了SAMSUNG公司的基于ARM7TDMI核S3C4510B微处理器,并详细介绍了利用该处理器所设计的嵌入式系统以及VxWorks操作系统下BSP(Board Supported Package)的开发。

1 介绍

S3C4510B是三星公司推出的针对嵌入式应用的16/32 位嵌入式处理器,该微控制器专为以太网通信系统的集线器和路由器而设计,具有低成本和高性能的特点, S3C4510B中内置了ARM公司设计的16/32位ARM7TDMI处理器, 可以执行32位的ARM指令,也可执行16位的THUMB指令, 并集成了多种外围部件,主要有:

  • 时钟频率50MHz
  • 内核/IO电压3.3V
  • 8KB的Cache/SRAM
  • 一个10/100Mbps 以太网控制器,MII接口
  • 两个HDLC通道,每个通道可支持10Mbps
  • 两个UART通道
  • 两个DMA通道
  • 两个32位定时/计数器
  • 18个可编程I/O口
  • 中断控制器,支持21个中断源,包括4个外部中断
  • 支持SDRAM,EDO DRAM,SRAM,Flash等
  • 具有扩展外部总线
  • JTAG接口,支持软件开发 ,硬件调试

S3C4510B支持目前常用的嵌入式操作系统,如VxWorks、pSoS、ucLinux等,本文将主要介绍VxWorks操作系统下的软件开发。

ARM7TDMI是ARM家族通用的一款32位微处理器,它主要为用户提供了高性能、低价格解决方案。

ARM7TDMI具有三级流水线的32位RISC处理器,处理器结构为冯·诺依曼Load/Store。该CPU具有两种指令集,即ARM和Thumb指令集。ARM指令集是32位,它可以利用CPU最大性能;而Thumb指令集则是16位指令集。

ARM7TDMI内核方块图如图1所示。

1.介绍

增强型网络驱动(END)是SOI 模型中数据链路层的实现,它通过MUX 函数和网络服务通信。

2.驱动操作

2.1 添加驱动到VxWorks

添加驱动到VxWorks系统就像添加其他的应用一样。第一步是编译并把驱动代码包括在VxWorks镜像中。

由于VxWorks允许创建一个以上的网络设备,所以必须需要对配置设备的相关的#define 进行分组。定义在target/config/bspname/configNet.h 里面。以下是网络设备描述的一个例子。在系统中应该添加类似的描述到configNet.h 文件中。

#define MOT_FCC_LOAD_FUNC sysMotFccEndLoad
#define MOT_FCC_LOAD_STRING ""
IMPORT END_OBJ* MOT_FCC_LOAD_FUNC (char *, void*);

在每一个网络设备的配置中,应该定义以上两个常量,以下对着两个常量进行说明:

LOAD_FUNC:

规定驱动endLoad()函数的入口点。例如,如果驱动的endLoad()入口点是sysMotFccEndLoad(),那么编辑configNet.h 包括以下的定义:

#define MOT_FCC_LOAD_FUNC sysMotFccEndLoad

LOAD_STRING:

在网络初始化过程中,作为initString参数,传递给muxDevLoad()的初始化参数。这个字符串也一并传给endLoad()函数,它的内同取决于驱动的需要。

必须编辑endDevTbl()的定义(在configNet.h中规定包括在镜像中的ENDS)从而包含被加载的每一个设备的入口。

例如:

END_TBL_ENTRY endDevTbl [] =
{
{ 0, LOAD_FUNC_0, LOAD_STRING_0, BSP_0, NULL, FALSE },
{ 1, LOAD_FUNC_1, LOAD_STRING_1, BSP_1, NULL, FALSE },
{ 0, END_TBL_END, NULL, 0, NULL, FALSE },
};

上面的第一个参数规定设备号。在最后的FALSE表示入口还没有被处理。在系统成功的加载驱动后,这个值变为TRUE。如果想要禁止系统自动加载驱动,那么可以把这个值设为TRUE。

这样,就准备好重新编译VxWorks从而包括新的END驱动。当新编译的VxWorks启动时,系统给在table中每一个设备按照列出来的顺序调用muxDevLoad()。

摘要: 镜像种类不同,VxWorks的启动过程会有所不同。 我们项目中使用的是加载型VxWorks镜像

VxWorks Boot Process

函数 函数功能 所在文件
bootTask()
  • 通过createBootLineFromFlash()从FLASH_ADRS中读出配置信息,组装bootline字符串到BOOT_LINE_ADRS
  • 调用autoboot()
bootMain.c
autoboot() 延迟5s,等待用户输入,超时后调用sysInit() bootMain.c
sysInit()
  • 锁住中断
  • 禁用缓冲
  • 用缺省值初始化系统中断表(仅i960)
  • 用缺省值初始化系统错误表(仅i960)
  • 初始化处理器寄存器到一缺省值
  • 使回溯失效
  • 清除所有悬置中断
  • item
  • 激活usrInit(),指明启动类型
sysALib.s
usrInit()
  • 调用sysStart() 对bss清零
  • 调用cacheLibInit() 支持cache
  • 调用excVecInit(),初始化所有系统和缺省中断向量
  • 调用sysHwInit(), usrCacheEnable()
  • 调用usrKernelInit()
prjConfig.c
usrKernelInit() 依次调用classLibInit(),taskLibInit()qInit(),workQInit(),kernelInit() Target\config\comps\src\usrKernel.c
kernelInit() 初始化并启动内核。
  • 激活intLockLevelSet();
  • 从内存池顶部创建根堆栈和TCB
  • 调用taskInit(), taskActivate(),用于usrRoot();
  • 调用usrRoot()
kernelLib.h
usrRoot() 依次调用
  • usrKernelCoreInit()
  • memPartLibInit()
  • memInit()
  • usrMmuInit()
  • sysClkInit()
  • usrIosCoreInit()
  • usrKernelExtrsInit()
  • usrIo***traInit
  • usrNetworkInit()
  • selectInit()
  • usrToolsInit()
  • cplusDemanglerInit()
  • usrAppInit()
prjConfig.c
usrAppInit() 依次调用 startWdTask(), appMain() usrAppInit.c
摘 要:随着嵌入式技术在军工、信息家电中的应用,如何在嵌入式实时系统下对网卡进行驱动程序的设计以及实现网络通信和管理,成为非常重要的技术。本文首先从整体上VxWorks网络系统得基本原理和与结构,然后以Intel82557网卡驱动为例,着重介绍网络设备驱动程序设计与实现过程。本文对所有基于MUX机制下的VxWorks网络设备驱动程序开发者具有参考价值.
Abstract:As Embedded system are the most popular technology applied in war industry, information appliances ,it has become an important technology how to design the device drivers and implement network communications and management under embedded system. At first, this article analyzes the base principle of network driver in VxWorks and its architecture. Then it mainly illustrates how to develop the enhanced network device driver by example of Intel82557 the enhanced network driver 。It has a reference value for other network device driver developers.

引言

VxWorks 是一个具有微内核、可裁剪的高性能强实时操作系统,它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。我校研制的综合导航显控台采用VxWorks操作系统,它作为舰船导航系统的核心设备实时为导航、通信、驾控系统提供各种信息。当需要更改海图模块硬盘中一些及时需要修改的数据、程序和电子海图等信息时,为避免拆卸设备,可以通过网络传输来解决上述问题。可以本文以Intel82557网卡为例 ,给出了基于VxWorks的网络设备驱动程序的开发方法和实现流程。

1 VxWorks的网络结构

VxWorks提供了与其他TCP/IP网络系统间“透明”的存取方式、BSD Socket兼用的编程接口,远程过程调用(RPC),远程文件存取等。网络驱动程序和上层网络协议栈可以有两种实现形式:BSD方式和MUX方式。在VxWorks中, MUX与END合称 SENS驱动(可裁剪增强型网络驱动)。网卡驱动程序的层次结构使网卡驱动程序的实现和移植更加方便。而且VxWorks为编写网卡增强型驱动程序(SENS)提供了很好的接口和规范。下图是VxWorks的网络系统。

VxWorks END Structure

图1 VxWorks的网络系统

2 END驱动概述

2.1 MUX与END

VxWorks网络协议栈可以分为以下几层:应用层 、传输层、IP层、MUX层、数据链路层和物理层。如图2所示。