本文档简要介绍了VxWorks的BSP组织结构和配置,以及VxWorks各种可执行映象的启动过程,为开发者学习和理解VxWorks系统映象提供入门级的指引,从而能够在项目中正确的区分和使用VxWorks系统映象。
1. BSP组织结构和配置
1.1. 主要BSP主要文件目录的组成及主要文件的作用
这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件。
l configAll.h
缺省定义了所有VxWorks的设置.如果不用缺省的设置,可在BSP目录下的config.h文件中用#define或#undef方式来更改设置。
l bootInit.c
在romInit.s后,完成BootROM的第二步初始化。程序从romInit.s中的romInit( )跳到这个文件中的romStart( ),来执行必要的解压和ROM image的放置。
l bootConfig.c
完成BootROM image的初始化和控制。
l usrConfig.c
VxWorks image的初始化代码.
1.1.2. 目录target/config/comps/src
涉及系统核心的components,主要由target/config/All中usrConfig.c中函数调用。
1.1.3. 目录target/config/bspname
包含系统或硬件相关的BSP文件。
l Makefile
定义了一些命令行和编译目标,用来控制images的生成,参见 BSP设置部分及生成下载。
l README
BSP发布纪录,版本,总的文档。
l config.h
包括所有涉及CPU主板的设置及定义(includes,definations),参见 BSP设置文件及生成下载。
l configNet.h
网络驱动的主要设置文件,主要对END驱动设置。
l romInit.s
汇编语言文件,是VxWorks BootROM和ROM-based image的入口,参见系统启动部分。
l sysALib.s
汇编语言文件,程序员可以把自己的汇编函数放在这个文件里,在上层调用。VxWorks image的入口点_sysInit在这个文件里,是在RAM中执行的第一个函数。
l sysLib.c
包含一些系统相关的函数例程,提供了一个board-level的接口,使得VxWorks和应用程序可以以system-indepent的方式生成。这个文件还能包含目录target/config/comps/src的驱动。
l sysScsi.c
可选文件用于Scsi设备设置和初始化。
l sysSerial.c
可选文件用于所有的串口设置和初始化。
l bootrom.hex
ASIC文件包含VxWorks Boot ROM代码。
l VxWorks
运行在目标机上,完整的,连结后的VxWorks二进制文件。
l VxWorks.sym
完全的,连结后带有符号表的VxWorks二进制文件。
l VxWorks.st
完全的,连结后,standalone,带有符号表的VxWorks二进制文件。
1.2. BSP配置
1.2.1. BSP被设置支持的驱动
中断控制interrupt controller,计时器timer(sys/aux),串口UART(serial),显示屏LCD,键盘Keyboard(可选),触摸屏touch-screen(可选)。前面三个是BSP的主要部分。
BSP默认的下载VxWorks RAM image方式是从Ethernet。
串口电缆需要用来和开发板(COM1)通信,通过协议WDB。
Loadable images——可下载映像;
compressed/uncompressed ROM-based images——基于ROM的压缩或者非压缩映像;
ROM-Resident images——ROM驻留映像。
ROM驻留映像对一些系统内存RAM资源较少的情况下,为了节省资源,只拷贝image中的数据部分(data segment)到内存RAM,留下程序部分(text segment)在ROM中执行。这样空出更多的RAM空间给应用程序。并不是所用得板子都支持这种VxWorks image。
1.2.3. VxWorks Image文件类型的说明
Uploaded images(通过网口或串口下载到RAM):
vxWorks——basic Tornado,shell和symbol table在主机端;
vxWorks.st(文件很大)——独立的image,包含shell和symbol table在目标板运行。
ROM based images(直接烧入ROM的VxWorks):
vxWorks_rom——Tornado in ROM,非压缩,在 RAM 中运行;
vxWorks.res_rom_nosym——Tornado in ROM,非压缩,在 ROM 中运行;
vxWorks.st_rom——Stand-alone in ROM,压缩,RAM 中运行;
vxWorks.res_rom——Stand-alone in ROM,非压缩,ROM 中运行。
2. VxWorks系统启动过程
VxWorks image分为在ROM中运行和在RAM中运行两种,两者启动顺序的区别在于sysInit( )函数的调用,该函数在RAM运行的VxWorks中初始化RAM。
2.1. ROM中运行的VxWorks
VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压,系统直接跳到ROM的首地址,运行VxWorks。注意:ROM运行的VxWorks并不支持所有的主扳,应以主扳手册为准。
文件romInit.s中的romInit( )
——>文件bootInit.c中的romStart( )
——>文件usrConfig.c中的usrInit( )
——>sysHwInit( )
——>usrKernelInit( )
——>KernelInit(usrRoot,...)
VxWorks在ROM中运行主要是为了节省RAM空间,以便应用程序有更大的空间运行。只把VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS,text部分留在ROM并在ROM中执行。
ROM中运行的VxWorks缺点是运行速度慢。
2.2. RAM中运行的VxWorks
VxWorks在RAM中运行,即写入ROM中的Boot或VxWorks Image是压缩的,需要先解压copy所有的text和data到RAM的LOCAL_LOW_ADRS中,下面sysInit( )主要是初始化RAM用的,系统直接跳到RAM的首地址,运行VxWorks。
usrInit( )前面不压缩,即romInit( )、romStart( )不能压缩。
文件romInit.s中的romInit( )
——>文件bootInit.c中的romStart( )
——>sysaLib.s中的sysInit( )
——>文件usrConfig.c中的usrInit( )
——>sysHwInit( )
——>usrKernelInit( )
——>KernelInit(usrRoot,...)
RAM运行的Boot或VxWorks image的text段或data段会从ROM复制到RAM,在RAM中运行。
其中usrRoot( )是VxWorks启动的第一个任务,由它来初始化 driver、network等。
romStart( )开始装载和解压image到RAM,sysaLib.s是在RAM中执行的第一个函数。
最少的系统初始化,主要用于启动装载VxWorks image。一般有压缩和不压缩两种形式,如bootrom和boot_uncmp。与前面两节描述的VxWorks image是基本一样,区别在于Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c。
文件romInit.s中的romInit( )
——>文件bootInit.c中的romStart( )
——>文件bootConfig.c中的usrInit( )
——>sysHwInit( )
——>usrKernelInit( )
——>KernelInit(usrRoot,...)
其中 /target/config/all/bootConfig.c是Boot ROM设置模块。用于通过网络加载VxWorks image。
usrRoot( )
——>bootCmdLoop(void)命令行选择,或autobooting
——>bootLoad(pLine,&entry)加载模块到内存(网络,TFFS,TSFS...)
——>netifAttach( )
——>go(entry)
——> (entry)( )从入口开始执行,不返回。