电气信息学院 李寒
1 前言
VxWorks是由美国Wind River 公司推出的一种强嵌入式实时操作系统(RTOS)。它采用微内核结构,具有高可靠性、实时性、可裁减性等特点,而且支持多种CPU。VxWorks的一个重要特点是它的可移植性,应用程序编码在很大程度上与目标板的硬件和结构无关。它把所有特定的硬件功能都集成在一个称之为板级支持包BSP(Board Support Package)的库中。
目前为止Wind River公司提供的基于某一CPU 评估板的BSP 超过200个,当用户开发自己目标板的BSP时,比较简单的方法是从所提供的BSP中选一个最接近的来修改。这里提到的BSP的设计就是指这种板级的对依赖于硬件的源代码做必要的修改、增加或删除,以满足特定的硬件环境。
VxWorks是专门为实时嵌入式系统设计开发的操作系统内核,为程序员提供了高效的实时多任务调度、中断管理,实时的系统资源以及实时的任务间通信。在各种CPU平台上提供了统一的编程接口和一致的运行特性,尽可能的屏蔽了不同CPU 之间的底层差异。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。基于VxWorks操作系统的应用程序可以在不同CPU平台上轻松移植。
VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。WRS 公司组建于1981年,是一个专门从事实时操作系统开发与生产的软件公司,该公司在实时操作系统领域被世界公认为是最具有领导作用的公司。
VxWorks 是一个运行在目标机上的高性能、可裁减的嵌入式实时操作系统。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,1997年4月在火星表面登陆的火星探路者上也使用了VxWorks。
2 BSP的介绍
2.1 BSP的概念
BSP(Board Support Package,——板级支持包)是介于底层硬件和上层软件之间的底层软件开发包,这源于嵌入式操作系统与硬件无关的设计思想。如今的各种嵌入式系统,都采用了分层的设计方法。它将系统中与硬件直接相关的一层软件独立出来,称之为板级支持包(BSP)。这里BSP的主要功能为屏蔽硬件,提供操作系统的驱动及硬件驱动。
BSP即为板级支持包,是指支持一个目标板的硬件系统正常运行的与硬件密切相关的函数集合。主要包括目标系统启动时的硬件初始化例程,和目标板上控制各个硬件设备正常运行的驱动程序。还要提供VxWorks与硬件环境之间的主要接口,因此它不是普通的硬件驱动程序。如图2-1所示。
图2-1 BSP的位置
BSP的主要职能:
1. 上电初始化硬件,支持特定的BSP硬件驱动程序和通用设备驱动;
2. 对cache的初化(在硬件环境处于静止状态前,禁止CACHE;设置CACHE模式;在wind 内核激活前使能CACHE;)
3. 初始化内存和内存地址,在激活MMU前产生地址映射;
4. 初化中断向量表,连接ISR到相应的中断向量;
5. 加载需要的VxWorks;
6. 支持VxWorks访问硬件驱动程序;
7. 在VxWorks内核初始化前,设置硬件处于确定的静止状态;
8. 激活操作系统。
开发BSP主要完成的工作:
根据目标板的硬件构成,设置各种与硬件参数有关的宏,设置内存映射表,编写和修改相应的设备驱动程序,连接中断服务程序,根据上层和系统的需要生成相应的image,创建相应的任务,并启动应用程序。
一个采用分层设计方法的典型系统,其结构如如图2-2所示。
图2-2 结构框架图
BSP位于硬件平台与操作系统之间,用于对上层软件屏蔽各种硬件相关性。
BSP的主要功能在于配置系统硬件使其工作于正常的状态,完成硬件与软件之间的信息交互,为OS及上层应用程序提供一个与硬件无关的软件平台。因此从执行角度来说,其可以分为两大部分:
1)目标系统启动时的硬件初始化例程,只在系统启动过程中执行一次。用于
配置系统内硬件工作于指定状态。
2)目标板上控制各个硬件设备正常运行的设备驱动程序,由它来完成硬件
与软件之间的信息交互。其在整个软件系统中随着这种交互的发生而执行。
虽然通常BSP是为OS服务的, 但实际上, BSP软件包中的部分程序对OS也并不是必须的,从这个角度,又可以将BSP划分为两部分功能,
3)提供OS运行所必须的硬件初始化例程及驱动程序,如单板最小系统BSP等。
4)为满足OS之上的应用程序的需求而提供的一些外围设备的驱动程序,
如网口,HDLC控制器Driver等,这些驱动程序一般需要应用程序通过OS层与BSP交互,当然可能还包括直接与应用程序交互的一些硬件驱动,如对各种控制信号的存取,自定义的驱动程序接口等,不经过OS层。
采用这种功能的划分,实际上也体现了BSP调试的一个策略,即先调试最小系统的BSP,然后再利用各种调试工具调试其他外围设备的驱动程序。
2.3 BSP的文件目录及功能
BSP中包括源代码、头文件、MAKE文件、派生文件以及二进制驱动程序模块。在VxWorks 中硬件驱动程序分为通用性和BSP专用性两类。在开发BSP时,既要对BSP专用的驱动程序提供支持,还要将通用的设备驱动程序集成在一起。因此,编写的设备驱动程序,可根据具体情况放在BSP中的合适位置。
BSP文件主要位于Tornado安装之后的Target目录下,具体目录结构如图5-3所示。具体结构如下:
图2-3 Target目录
BSP中包括源代码、头文件、MAKE文件、派生文件以及二进制驱动程序模块。在VxWorks 中硬件驱动程序分为通用性和BSP专用性两类。在开发BSP时,既要对BSP专用的驱动程序提供支持,还要将通用的设备驱动程序集成在一起。因此,编写的设备驱动程序,可根据具体情况放在BSP中的合适位置。
BSP文件在 VxWorks /target /config /all和VxWorks /target /config / bspname文件夹里。其中,all文件夹里的文件是所有BSP的通用文件,bspname文件夹的文件是用户自己定制的BSP文件[1]。经过编译、链接,并在makefile和depend.bspname等文件的控制下,原程序最后将生成镜像。BSP的组成及主要文件功能如下。
(1)Tornado\target\config\all\目录下的文件。包括bootConfig.c,bootInit.c,usrConfig.c等,它们是所有BSP共享的,主要是缺省定义了所有VxWorks配置以及Boot Rom的初始化控制代码,所以不是特别需要不要更改里面的任何文件。
(2)Tornado\target\config\bspname\目录下的文件。包括makefile,depend.bspname,config.h,bspname.h,romInit.s,sysALib.s,sysLib.c,sysSerial.c等,其中config.h中包含特定CPU板的所有包含文件和定义。
VxWorks支持多种处理器平台,用户可以针对不同的目标系统,通过修改这些文件来完成BSP与 VxWorks在不同平台上的移植。
3 Vxworks映像分类及其启动过程
VxWorks在启动过程中涉及到两个映像文件:bootrom映像和VxWorks映像。这两个映像文件都要使用BSP代码。bootrom文件是从ROM引导VxWorks的引导目标模块,用于对目标板进行初始化,加载VxWorks操作系统映像。VxWorks image包含VxWorks OS,最终运行于目标板上。VxWorks映像按加载类型可分为:可下载映像和可引导映像;按运行方式分为在ROM中和在RAM中两种。
可下载映像(Loadable Image),它实际包括两部分,一是VxWorks,二是boot ROM,两部分是独立创建的。可引导映像(Bootable Image)是将引导程序和VxWorks融为一体的映像,一般为最终产品,包括不驻留ROM的映像和驻留ROM的映像两种类型。
图3 VxWorks加载映象流程
4 MPC850介绍
4.1 850CPU概述
MPC850具有一个带有内存管理单元(MMU)和指令数据Cache,32位的PowerPC结构的CPU。并内嵌有CPM(Communication Processor Module), 其主要的功能模块可分为3大部分:
1) 32为的PowerPC核心及所带的MMU及指令,数据Cache。在40MHz时钟时为52MIPS的指令速度,在50MHz时钟时为66MIPS的指令速度。一般我们的应用都不涉及浮点运算。
2) 系统接口单元(SIU)
3) 通讯处理器模块(CPM)
其功能及结构框图如图4-1
图4-1 MPC850的内部结构图
4.2 MPC 850最小系统
典型的MPC 850最小系统用于程序启动和加载的BOOT FLASH,用于存贮数据及版本的FLASH和用于暂存数据的SDRAM;由一个或两个SCC口构成的以太网口用于系统内部通讯,一个SMC口构成的RS232用于调试。同时每个单板上都有一个BDM调试接口,另外还有复位和时钟电路。如图4-2。
图4-2 带有MPC860的单板电路框图
由MPC850CPU、Flash、Sdram、串口、网口、复位、初始配置、系统时钟等组成。通过仿真器VisionProbeII把程序下载到SDRAM中,然后再通过仿真器把程序下载到FLASH中,FLASH主要是存储程序或Vxworks操作系统。当上电时,通过上电复位,配置MPC850CPU的初始配置。然后把存储在FLASH中的程序或Vxworks操作系统,复制到SDRAM中,这时只要MPC850 CPU运行起来,可以让MPC850 CPU在SDRAM中执行各种用户或系统的需求功能。通过标准RS232接口完成对MPC850 CPU进行控制。原理图见 图4-3,4-4
单元电路的功能:
1. CPU
CPU芯片MPC850对各电路进行操作和控制,实现各项功能。
2. 电源单元
MPC850需要的电压为3.3V,整板供电压3.3V。
3. 串口
MPC850自带串口。经过MAX3221做RS232线路驱动。串口的主要功能就是进行数据的串/并转换,并执行RS232口数据的输入/输出操作。
4. 网口
网口是由变压器 23Z467SM、LXT905和MPC850中的SCC2中的以太网控制器组成。其中LXT905相当于PHY层,MPC850中的SCC2中的以太网控制相当于MAC层。双绞线来的信号,经过变压器进入到LXT905中进行曼切斯特解码,再进入到SCC2中的以太网控制器,然后通过该控制器把以太网帧存储在缓冲区内;反之,存储在缓冲区的以太网帧经过以太网控制器,发送到LXT905,然后经过曼切斯特编码,经过变压器发送到双绞线中。
5. SDRAM
MPC850提供对SDRAM的支持,能够自动完成动态存储器的刷新等操作。支持多种方式的行列地址宽度;支持8,16,32BIT数据线宽。2块SDRAM,大小共为32M Byte。
图4-3最小系统接ETHERNET接口原理图
图4-4最小系统接RS232接口
5 MPC850 VxWorks BSP的执行流程
底层控制软件由windKernel,BSP组成。windKernel是实时系统的内核,BSP则是整个CPU盘的硬件初始化包,它完成MPC850的Microprocessor、Hardware Interface和Communications Processor的初始化,网口和串口的收发控制程序等组成,它们结合在一起生成BOOTROM,存放在CPU盘上的AM29LV017D或SST39VF016 (FLASH)芯片中。当CPU盘加电时直接跳到上面运行这一文件。
1) WindKernel是这个实时系统的内核,是别的程序运行的基础,由于软件并不提供它的源码,我们并不需要对它进行开发,只是在硬件初始化时运行这个内核即可。
图5-1 接收数据的流程
发送数据是在程序运行过程中需要时,即当接收的数据处理和内部程序运行过程中需要通过网口或串口发送数据时,自主调用相应的发函数来出来完成。
图5-2 下载操作系统、应用软件过程
6 MPC850 VxWorks BSP的设计与应用程序加载
6.1 BSP设计过程
BSP开发处于整个嵌入式开发的前期,是后面系统上应用程序能够正常运行的保证。大体上,BSP的设计与开发可以分为以下几个步骤:
1)建立开发环境。安装 VxWorks 集成开发环境 Tornado,采用宿主机目标机交叉开发。
2)选择合适的BSP模板。一个合适相近的BSP模板可以大大减少开发周期。
3)bootrom的运行。修改、添加WIND内核激活前的初始化代码。
4)VxWorks的配置。修改或添加所需要组件及驱动程序,激活内核,实现基本的操作系统功能。
5)测试与验证。正确实现bootrom及VxWorks的下载,根据不同需要,进行修改与测试。
结合实际中的工程VxWorks主机工具与目标记交互关系如图6-1所示。
图6-1 VxWorks主机工具与目标机交互关系
6.2 MPC850 BSP具体设计流程
1)地址映射
850共有8个片选信号,即可支持8个Memory bank,其中片选0为启动片选,即我们常说的BOOT,850支持一种General-purpose chip-select machine(GPCM)和两种user-programmable machines( UPMs )。
在vxWorks中,修改/bspname/ads860.h文件,内部存储器修改宏。以下为一段的bank配置:
SDRAM(2M) 0x00000000-0x01FFFFF
BootFlash(512K) 0x0-0x0287FFFF
Flash(2M) 0x0-0x071FFFFF
物理芯片 0x0-
内部存储器 0x0-0x03003fff
/*CS0: bootflash 512K,8bit,start address 0x0*/
#define BR0_VAL 0x0 /*Chip select 0 for BOOT memory */
#define OR0_VAL 0xFFF00974 /*Operation register 0 initial value*/
/*CS1: Flash,2M,16bit,0x0*/
#define BR1_VAL 0x0 /* Chip select 1 for Flash memory */
#define OR1_VAL 0xFFC00954 /* Operation register 1 initial value */
/*CS2:SDRAM,2M,16bit,0x0*/
#define BR2_VAL 0x00000881 /* Chip select 1 for SDRAM 4MB */
#define OR2_VAL 0xFFE00800 /* Operation register 2 initial value */
/* CS3: PHY 8BIT */
#define BR3_VAL 0x0
#define OR3_VAL 0xFFFf8970
#define INTERNAL_MEM_MAP_ADDR 0x0
#define INTERNAL_MEM_MAP_SIZE 0x00010000 /* 64 K bytes */
在配置片选时,提供掩码能更灵活地分配地址空间。
SDRAM的刷新频率在ads860.h中设定
#define SDRAM_REFRESH_FREQ 64000 /* 64 Khz */
2)频率设置
850系统可以通过系统锁相环将晶振倍频后提供系统时钟,对系统锁相环的设定是通过寄存器PLPRCR来完成。在PLPRCR的MF比特中设定倍频因子。
倍频因子=系统时钟/晶振频率-1;
例如:锁相环要把4M倍频成48M,倍频因子就是11;
操作系统的设定:
在ads86.h和config.h中设定系统频率和倍频因子
#define CRISTAL_FREQ
#define FREQ_50_MHZ /* 50 Mhz */
#define SPLL_FREQ_REQUESTED FREQ_50_MHZ /* 50 Mhz */
#define SPLL_MUL_FACTOR ((SPLL_FREQ_REQUESTED / CRISTAL_FREQ) - 1)
锁相环的设定在romInit.s中完成。
3)中断
PowerPC上的中断大致可以分成两大类:一类是由某些系统条件或事件引起的,它是异步的,这就是我们通常所说的中断;另一类是指令执行引起的,它是同步的,一般称之为异常(exception)。
我们经常处理的中断是外部中断, 即external Interrupt, 这一中断是由SIU中的中断控制器通过IREQ向PowerPC内核报告的,它管理了第二级中断, 这一级中断共16个,按优先级次序为:
(IRQ0>ILEVL0>IRQ1>…>IRQ7>ILEVL7)
其中IRQ0为非屏蔽中断。
VxWorks中要求BSP 实现的中断接口有:
intConnect : 将指定的中断服务程序连接于指定的中断向量
intEnable :使能指定中断向量对应的中断
intDisable :禁止指定中断向量对应的中断
另外,vxWorks自身根据不同的CPU平台提供了一个全局的中断控制函数:
intLock:禁止系统中的所有外部中断
intUnlock:使能系统中断功能
以下为一段的程序(IRQ1沿触发)
*SIEL (vxImmrGet()) &= ~( SIEL_ED1 );
intConnect( IV_IRQ1, (VOIDFUNCPTR)IntIrq1ISR,0 );
*SIMASK (vxImmrGet()) |= SIMASK_IRM1;
注:850系统只能是下降沿或低电平触发。IV_IRQ1等宏定义在ppc860siu.h中。
4)CPM功能
850的CPM是通过使用buffer descriptors(BDs)作为和通信buffer的接口,BD位于双口RAM内的一端空间内,如果使用多个BD就是我们称作的BD环。
网口和串口是850最小系统中的CPM功能,在驱动程序中使用BD作为控制接口。CPM在双口RAM内有一段参数区,包含了USB、SCC、SPI、I2C和IDMA通道的操作参数,表6-2给出了参数区的划分。
Offset from IMMR |
Page |
Offset from DPRAM |
Controller/Peripheral |
0x3C00 |
1 |
0x1C00-0x1C7F |
USB |
0x1C80-0x1CAF |
I2C |
||
0x1CB0-0x1CBF |
Miscellaneous |
||
0x1CC0-0x1CFF |
IDMA1 |
||
0x3D00 |
2 |
0x1D00-0x1D7F |
SCC2 |
0x1D80-0x1DAF |
SPI |
||
0x1DB0-0x1DBF |
RICS timer table |
||
0x1DC0-0x1DFF |
IDMA2 |
||
0x3E00 |
3 |
0x1E00-0x1E7F |
SCC3 |
0x1E80-0x1EBF |
SMC1 |
||
0x1EC0-0x1EFF |
DSP1(Rx) |
||
0x3F00 |
4 |
0x1F00-0x1F7F |
Reserved |
0x1F80-0x1FBF |
SMC2 |
||
0x1FC0-0x1FFF |
DSP2(Tx) |
表6-2 参数区的划分
5)串口功能
为帮助调试,一般单板都提供一个调试串口;常常用于和PC机的超级终端相连,用于程序的调试.
如果所使用的串口数小于等于2个,一般直接将MPC8xx的SMC口作为串口(如果有必要,也可以用SCC作为串口,即配置为UART模式).如MPC860集成的SMC,其驱动程序也位于drv\sio目录下。一般也不需修改。最多是串口的收发引脚配置需要修改,目前我们使用的RS232串口大都是采用收发和地三根线的连接方式,如果RS422或485则要做不同的处理。
VxWorks中对于串口驱动的配置程序部分,位于BSP目录的sysSerial.c文件中,其中定义了一个参数数组devParas,用以定义串口的配置参数,如果要增加多个串口,只需在数据中添加多个元素接口。系统在引导过程中,在sysHwinit函数里会调用sysSerialHwInit来完成对各个串口的硬件初始化。在usrRoot中完成SIO设备的加载。
串口通常配置为8位数据,一位停止位,无校验位,波特率9600,软件流控。如果要改变波特率,请修改波特率发生器BRGs的CD bits和DIV16 bit。
6) 网口
因为网口速度较快,一般单板都提供网口,可以用于调试,同时也可以用于单板与PC机之间的其他通讯,例如网管维护,程序/版本加载等。
一般MPC850的SCC口作为10Mbps以太网口时,UAS以太网接口芯片采用LXT908。
在vxWorks中SCC作为以太网口的驱动程序在motCpmEnd.c中,一般不需要作修改,如果要修改SCC网口驱动,建议将motCpmEnd.c拷贝到bspname的目录下,然后修改makefile。
在网口发送中,必须先申请一个 mBlk-clBlk-cluster的三元组,然后才能通过发送函数将数据包从SCC口发送出去。
END_CTRL *pDrvCtrl;
M_BLK_ID pMblk;
pMblk = netTupleGet(pDrvCtrl->endObject.pNetPool, END_BUFSIZ, M_DONTWAIT,
MT_DATA, FALSE);
motCpmEndSend(pDrvCtrl , pMblk)
6.3 MPC850 BSP应用程序加载
一个可下载的应用程序包含一个或多个目标对象模块,这些模块可以下载和动态链接到VxWorks,并从shell或调试器中启动。即允许目标模块装载到一个运行的系统中。通过创建一个可下载的工程,构建该工程,使用适当的映像启动目标。下载工程所产生的部分链接和变换的.out文件。
一个可启动的应用程序包含一个链接到VxWorks映像的应用程序。目标机启动时,可启动的应用程序开始运行。通过创建一个可启动的工程添加应用程序文件,然后编辑VxWorks初始化文件usrAppInit.c,为应用程序的初始化和启动工程添加调用。
4.2.1 构造一个基于AMD79C97 网卡的BSP
将下载得到的 AMD 公司的 vxworks_end.exe 解压到 Torando 安装目录下的Target 目录中进行覆盖,覆盖前请做好原Target 的备份工作,便于恢复原开发环境,编译新的网卡驱动,过程如下:
a) 先定位到tornado 目录执行 Tornado2.2\ host\x86-win32\bin\torVars.bat ;
b) 再定位到tornado2.2\target\src\drv\end 目录执行make CPU=PENTIUM tool=gnu ln97xend.o
c) 定位到tornado2.2\target\lib\pentium\PENTIUM\common 目录,并将上一步生成的文件ln97xend.o 复制到此目录下。备份此目录下的文件libdrv.a;
d) 运行命令arpentium -d libdrv.a ln97xEnd.o,删除libdrv.a 中原有的ln97xEnd模块;
e) 运行命令 arpentium -ra iOlicomEnd.o libdrv.a ln97xEnd.o 将我们刚刚创建的新ln97xEnd 模块添加进去。
4.2.2 修改 Tornado 编译配置文件 config.c
a) 定位到目录C:\tornado2.2\target\config\pcPentium 并打开该目录下Config.h 文件;
b) 查找到定义DEFAULT_BOOT_LINE 宏的地方,修改预处理条件CPU ==PENTIUM 分支下的
"lnPci(0,0)your_host_name:d:\\vxWorks h=192.168.80.169 e=192.168.80.254
u=target pw=target tn=target"
host :指定你的主机的名字,可任意指定;
d:\\vxWorks :指定了VxWorks 映象在主机上下载的完整路径;
h=192.168.80.169:是宿主机的IP 地址,可以根据实际情况修改;
e=192.168.80.254:是目标机的IP 地址,可以根据实际情况修改;
u=target :指定了FTP 服务器的用户名,这个FTP 就是用来下载VxWorks映象的;
pw=vxworks :是FTP 服务器与用户名target 对应的密码;
tn=target:指定目标机的名字,任意指定即可。
4.2.3编译Vxworks 映像
编译生成bootrom 后,还要创建一个VxWorks 映象(image),也就是VxWorks 操作系统本身的代码,步骤为:
a) 创建一个“bootable VxWorks image ”的工程,注意BSP 选择pentium;
b) 打开工程,选择Vxworks 组件,注意需要包括两个重要的组件:Telnet server和 Target shell 。前者使我们可以通过Telnet 协议登录到VxWorks 操作系统中; 后者则可以让我们通过命令行控制VxWorks 系统。另外,需要把所有C++相关的选项都包含进去。
4.2.4 建立调试环境
a) 设置FTP 服务器
宿主机上的FTP 服务器用于在系统成功引导后,下载VxWorks 的运行时映象,最好使用 Tornado 开发环境自带的 FTP 服务软件。FTP 需正确设置 Vxworks 映像路径和用户密码,与config.h 中的DEFAULT_BOOT_LINE 宏定义中的路径以及用户名密码保持一致。打开FTP 的LOG 功能,在logging->Logging Option 中选择除WinSock 以外的所有选项。正确设置完成后,可使用虚拟软盘或软盘映像启动Vxworks 虚拟机.
由于在Vxworks 映像中包含了Telnet Server 的功能,因此在局域网范围内任何一台计算机都可登陆目标机查看目标机当前状态:在任何一台计算机命令行模式下执行Telnet 10.134.8.4 命令.
b) 配置target server
打开 Tornado 开发环境,选择“Tools->Target Server->Configure”菜单,在 “Description”中任意填写一个名字,这里是“Virtual Machine”;在“Available Back”
7 总结
本文详细叙述了使用VMware 软件配置桌面Vxworks 系统调试平台的过程和使用。最后的结果是使用我所内部局域网构建虚拟目标机,使得大部分和底层无关的上层应用程序的调试可以在桌面展开,对于软硬件协同工作十分有利。从这个典型实例可以看出VMware 工具的应用非常广泛,除了充当虚拟的目标机之外,还可以在多操作系统平台的开发、网络应用程序的开发、网络应用程序的测试、操作系统的功能测试等方面有很大的用途,本文起到的只是抛砖引玉的作用。充分利用虚拟计算机技术可以给我们的软件调试带来极大的方便。