基于VxWorks的BSP开发指南1BSP概述一个成熟的商用操作系统,其被广泛应用的必要条件之一就是能够支持众多的硬件平台,并实现应用程序的硬件无关性。
一般来说,这种无关性都是由操作系统实现的。
但对于嵌入式系统来说,它没有像PC机那样具有广泛使用的各种工业标准,各种嵌入式系统其不同的应用需求就决定了它一般都选用了各自定制的硬件环境,这种诸多变化硬件的环境就决定了无法完全由操作系统来实现上层软件与底层硬件之间的无关性。
因此各种商用实时操作系统,都采用了分层设计的方法,它将系统中与硬件直接相关的一层软件独立出来,称之为Board Support Package即简称BSP。
顾名思义,BSP是针对某个单板而设计的,并且它对于用户(指开发者)也是开放的,用户可以根据不同的硬件需求对其作改动或二次开发,而操作系统本身仅仅提供了CPU内核的无关性。
BSP在系统中的角色,很相似于BIOS在PC系统中的地位。
定义BSP就是为软件操作系统正常运行提供最基本、最原始的硬件操作的软件模块,它和操作系统息息相关,但又不属于操作系统的一部分。
BSP可以分为三大部分:1:系统上电时的硬件初始化。
2:为操作系统访问硬件驱动程序提供支持。
3:集成的硬件相关和硬件无关的操作系统所需的软件模块。
BSP的表现形式BSP主要以两种形式来表现:1:源代码(C代码、汇编代码)、系统编译连接依靠文件。
2:二进制的目标代码和目标代码库。
BSP在软件系统中的位置BSP在软件系统中的位置可以用下图来表示,BSP为操作系统和硬件设备的互操作建了一个桥梁,操作系统通过BSP来完成对指定硬件的配置和管理。
2 vxWorks系统中的BSP 目录结构BSP软件与其他软件的最大区别在于BSP软件有一整套模板和格式,开发人员必须严格遵守,不允许任意发挥。
在BSP软件中,绝大部分文件的文件名和所要完成的功能都是固定的。
所以,BSP软件的开发一般来说都是在一个基本成型的BSP软件上进行修改,以适应不同单板的需求。
针对某类CPU的硬件单板,vxWorks通常提供有其DEMO板的BSP, 这些程序位于指定的目录之下。
也就是我们所说的最小系统BSP。
一般来说,我们在硬件系统设计好之后,都会先找到一个与自己系统相近的DEMO板BSP(最起码是使用相同的CPU)。
并以此为基础,开发自己单板的BSP。
VxWorks BSP的目录结构:BSP文件主要位于Tornado安装之后的Target目录下,具体目录结构如下:• config目录:用于vxWorks核心的配置及编译的文件。
其中又包含多个子目录。
all目录:通用的配置文件comps目录:用于Tornado工程管理工具配置的源文件bspname目录:每个单板都有一个相应目录,命名可根据单板而定,其中包含有关此单板BSP的代码文件,目标文件及编译文件等,这也就是我们通常所说的单板BSP。
• h目录:其中包含所有vxWorks操作系统的头文件及通用编译文件。
其中的各个子目录表示了vxWorks中不同模块的头文件。
• lib目录:由vxWorks为不同平台提供的库文件及目标文件。
• src目录:vxWorks提供的部分硬件芯片驱动程序的源代码文件,其又包含多个子目录:config目录:有关vxWorks操作系统的一些通用的源代码文件。
drv目录:vxWorks中一些硬件芯片的通用驱动程序源代码文件,其根据不同功能的芯片分为若干个子目录,例如end 表示网口驱动,sio表示串口驱动等• unsupported目录:其中包含一些较古老的硬件BSP代码。
3三种不同的VxWorks映象比较理解VxWorks映象是开发VxWorks BSP的基础。
VxWorks映象通常由三个部分组成:BSP、操作系统内核和上层应用。
从文件的组织形式上可以将映象分为三段:BSS段、Data段和Text段。
其中,BSS 段存放的是未初始化的全局变量或静态变量,Data段存放的是已经初始化的全局变量或静态变量,Text段存放的是可执行的代码。
根据应用场合的不同,VxWorks映象可分为三类:Loadable imagesRom-based imagesRom-resident images其中,Loadable images通过烧写在ROM中的Bootrom装载到RAM中来启动;Rom-based images使用自身带的启动代码把自己装载到RAM中来启动;而Rom-resident images在ROM中启动,只是把需要动态修改的Data段和BSS段装载到RAM中去。
3.1 可加载的VxWorks映象这是一种运行于RAM的VxWorks映象。
它不包含搬移程序,需要借助于一些外部的程序如bootRom才能加载到RAM的低端RAM_LOW_ADRS地址处。
这是缺省的开发映象。
在开发的初期阶段,用户可以根据需要添加或删除一些VxWorks组件,生成自己的可加载的VxWorks映象,存放在开发主机的某个目录下。
目标板上电后,由烧结在BOOT中的起始引导程序(BootStrap Programs)将BOOT中的ROM 引导程序(ROM Boot Programs)拷贝到RAM的高端地址RAM_HIGH_ADRS处,并跳转至该地址执行ROM引导程序,配置好所选的加载方式(缺省为网络方式),将指定的主机目录下的可加载的VxWorks映象下载到目标板的RAM地址RAM_LOW_ADRS处,并跳转到此处执行。
如图1所示。
图1、可加载的VxWorks映象这种映象的优点是生成的VxWorks映象可以存放在开发主机PC机上,不用烧到BOOT中,节省了BOOT容量,也便于随时修改不同的VxWorks映象,适用于调试的初期阶段。
不足之处是需要在主机上维护一个正确的VxWorks映象,对于调试硬件无关的上层应用程序显得不是很方便。
在Tornado工作台的Build窗口中,选择Rules属性页中的VxWorks即可生成可加载的VxWorks映象。
3.2 基于ROM的VxWorks映象这是一种运行于RAM中,但起初存放于ROM中的VxWorks映象。
即该映象需要和搬移程序一起固化在BOOT中。
目标板上电后,首先运行BOOT中的引导搬移程序,将整个VxWorks映象拷贝到RAM地址RAM_LOW_ADRS处,并跳转到此处执行。
如图2所示。
图2 基于ROM的VxWorks映象该映象根据是否被压缩又可分为:●基于ROM的未压缩的VxWorks映象,可直接从ROM拷贝到RAM中●基于ROM的压缩的VxWorks映象,这种映象主要是为了节约BOOT空间,在从ROM拷贝到RAM的过程中需要解压缩,因此与上述未压缩的映象相比,它的引导过程相对较慢,但两者在RAM中的运行速度是一样的。
3.3 驻留ROM的VxWorks映象这种映象起初也和搬移程序一起固化在BOOT中。
目标板上电后,首先运行BOOT中的引导搬移程序,但仅将VxWorks映象的数据段和BSS段拷贝到RAM地址RAM_LOW_ADRS处,映象的代码段仍旧留在ROM中,从ROM中开始执行。
如图3所示。
这种映象的优点是具有最快的引导速度,占用最少的RAM空间,适用于RAM 空间有限的目标板。
但是由于该映象在ROM中运行,运行速度在三种映象中是最慢的。
图3 驻留ROM的VxWorks映象4几种不同的BOOTROM的比较针对上述三种不同的VxWorks映象,可以生成以下几种不同的BOOTROM,主要体现在执行搬移程序romStart( )( 位于bootInit.c文件中)时不同:4.1 用于可加载VxWorks映象的BOOTROM由图1所示可知,用于可加载VxWorks映象的BOOTROM包含两部分:起始引导程序(BootStrap Programs)和ROM引导程序(ROM Boot Programs)。
起始引导程序驻留在ROM中,主要包含:●汇编级的硬件初始化程序romInit.s,用于系统的基本初始化,设置一些重要寄存器的初始值,进行存储器的映射●搬移程序bootInit.c,将ROM引导程序拷贝至RAM的高端地址RAM_HIGH_ADRS,然后跳转到此处执行ROM引导程序。
ROM引导程序起初存放在ROM中,初始化时被拷贝到RAM中,主要用于系统的进一步初始化,并配置加载方式,将VxWorks映象加载至RAM。
可分为三种不同的类型:●压缩的ROM引导程序,在拷贝的过程中需要解压缩,在RAM中执行●未压缩的ROM引导程序,可直接拷贝,在RAM中执行●驻留ROM的ROM引导程序,仅拷贝ROM引导程序的数据段,代码段仍旧在ROM中执行在Tornado开发环境中,通过在主窗口点击Build|Build Boot ROM…可以选择生成以上三种BOOTROM,分别为:bootrom_uncmp.hex(未压缩的BOOTROM),bootrom.hex(压缩的BOOTROM),bootrom_res.hex(驻留的BOOTROM)。
静态连接到可加载的VxWorks映象的系统初始化代码执行并完成整个初始化过程。
引导过程成功以后,RAM中ROM引导程序占用的空间(从RAM_HIGH_ADRS开始)可以重新被系统利用。
图1中所示的各地址含义为:●LOCAL_MEM_LOCAL_ADRS是RAM的起始地址●RAM_LOW_ADRS是VxWorks的加载点,也是VxWorks代码段的起始位置●FREE_RAM_ADRS是VxWorks映象的结束点。
通常也是系统内存池和目标服务器内存池的起始地址●RAM_HIGH_ADRS是ROM引导程序的加载点。
它也是ROM引导程序(除驻留ROM引导程序之外)的代码段的起始位置,或驻留ROM引导程序数据段的起始位置。
4.2用于基于ROM的VxWorks映象的BOOTROM由图2所示可知,用于该映象的BOOTROM包含两部分:起始引导程序(BootStrap Programs)和基于ROM的VxWorks映象。
搬移程序bootInit.c负责将VxWorks映象的文本段和数据段搬移到用户定义的低端内存地址RAM_LOW_ADRS,如果需要进行必要的解压缩,然后直接启动VxWorks映像。
因此BOOTROM的容量相对于1节中描述的BOOTROM要大一些,但无需在主机目录下维护一个可用的VxWorks映象。
基于ROM的VxWorks BOOTROM有压缩和未压缩之分。
在Tornado工作台的Build窗口中,选择VxWorks映象Rules属性页中的VxWorks_rom即可生成基于ROM的未压缩的VxWorks BOOTROM,选中VxWorks_romCompress即可生成基于ROM的压缩的VxWorks BOOTROM。