VxWorks BSP和启动过程简介

来源:互联网 发布:淘宝客开通的利弊 编辑:程序博客网 时间:2024/03/28 21:07

 本文档简要介绍了VxWorksBSP组织结构和配置,以及VxWorks各种可执行映象的启动过程,为开发者学习和理解VxWorks系统映象提供入门级的指引,从而能够在项目中正确的区分和使用VxWorks系统映象

1.     BSP组织结构和配置

1.1. 主要BSP主要文件目录的组成及主要文件的作用

1.1.1. 目录target/config/All

这个目录下的文件是所有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/AllusrConfig.c中函数调用。

1.1.3. 目录target/config/bspname

       包含系统或硬件相关的BSP文件。

l         Makefile

       定义了一些命令行和编译目标,用来控制images的生成,参见 BSP设置部分及生成下载。

l         README

       BSP发布纪录,版本,总的文档。

l         config.h

       包括所有涉及CPU主板的设置及定义(includesdefinations),参见 BSP设置文件及生成下载。

l         configNet.h

       网络驱动的主要设置文件,主要对END驱动设置。

l         romInit.s

       汇编语言文件,是VxWorks BootROMROM-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

1.2.2. VxWorks Image的种类

       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 Tornadoshellsymbol table在主机端;

       vxWorks.st(文件很大)——独立的image,包含shellsymbol table在目标板运行。

 

ROM based images(直接烧入ROMVxWorks)

       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

VxWorksROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压,系统直接跳到ROM的首地址,运行VxWorks。注意:ROM运行的VxWorks并不支持所有的主扳,应以主扳手册为准。

文件romInit.s中的romInit( )

——>文件bootInit.c中的romStart( )

——>文件usrConfig.c中的usrInit( )

——>sysHwInit( )

——>usrKernelInit( )

——>KernelInit(usrRoot...)

VxWorksROM中运行主要是为了节省RAM空间,以便应用程序有更大的空间运行。只把VxWorks imagedata段复制到RAMLOCAL_LOW_ADRStext部分留在ROM并在ROM中执行。

ROM中运行的VxWorks缺点是运行速度慢。

2.2. RAM中运行的VxWorks

VxWorksRAM中运行,即写入ROM中的BootVxWorks Image是压缩的,需要先解压copy所有的textdataRAMLOCAL_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运行的BootVxWorks imagetext段或data段会从ROM复制到RAM,在RAM中运行。

其中usrRoot( )VxWorks启动的第一个任务,由它来初始化 drivernetwork等。

romStart( )开始装载和解压imageRAMsysaLib.s是在RAM中执行的第一个函数。

2.3. BootROM映像

最少的系统初始化,主要用于启动装载VxWorks image。一般有压缩和不压缩两种形式,如bootromboot_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.cBoot ROM设置模块。用于通过网络加载VxWorks image

usrRoot( )

——>bootCmdLoop(void)命令行选择,或autobooting

——>bootLoad(pLine&entry)加载模块到内存(网络,TFFSTSFS...)

——>netifAttach( )

——>go(entry)

——> (entry)( )从入口开始执行,不返回。