vxWorks-BSP培训文档.doc
- 文档编号:14662554
- 上传时间:2023-06-25
- 格式:DOC
- 页数:10
- 大小:159.54KB
vxWorks-BSP培训文档.doc
《vxWorks-BSP培训文档.doc》由会员分享,可在线阅读,更多相关《vxWorks-BSP培训文档.doc(10页珍藏版)》请在冰点文库上搜索。
vxWorksBSP培训资料
1BSP的概念
1.1什么是BSP
一个成熟的商用操作系统,其被广泛应用的必要条件之一就是能够支持众多的硬件平台,并实现应用程序的硬件无关性。
一般来说,这种无关性都是由操作系统来实现的。
但是,对于嵌入式系统来说,它没有像PC机那样所遵循的各种工业标准,各种嵌入式系统其具有的不同应用需求就决定了它一般都选用了各自定制的硬件环境,这种诸多变化硬件的环境就决定了无法完全由操作系统来实现上层软件与底层硬件之间的无关性。
因此当今的各种商用实时操作系统,都采用了分层的设计方法,它将系统中与硬件直接相关的一层软件独立出来,称之为BoardSupportPackage即简称BSP。
顾名思义,这部分软件是针对某个单板而设计的,并且这一层软件对于用户(指开发者)也是开放的,用户可以根据不同的硬件需求对其作改动或二次开发,而操作系统本身仅仅提供了CPU内核的无关性。
1.2BSP的功能
一个采用分层设计方法的典型系统,其结构如下(以UAS系统为例):
BSP位于硬件平台与操作系统之间,用于对上层软件屏蔽各种硬件相关性。
BSP的主要功能在于配置系统硬件使其工作于正常的状态,完成硬件与软件之间的信息交互,为OS及上层应用程序提供一个与硬件无关的软件平台。
因此从执行角度来说,其可以分为两大部分:
1)目标系统启动时的硬件初始化例程,只在系统启动过程中执行一次。
用于配置系统内硬件工作于指定状态。
2)目标板上控制各个硬件设备正常运行的设备驱动程序,由它来完成硬件与软件之间的信息交互。
其在整个软件系统中随着这种交互的发生而执行。
虽然通常BSP是为OS服务的,但实际上,BSP软件包中的部分程序对OS也并不是必须的,从这个角度,又可以将BSP划分为两部分功能,
1)提供OS运行所必须的硬件初始化例程及驱动程序,如单板最小系统BSP等。
2)为满足OS之上的应用程序的需求而提供的一些外围设备的驱动程序,如网口,HDLC控制器Driver等,这些驱动程序一般需要应用程序通过OS层与BSP交互,当然可能还包括直接与应用程序交互的一些硬件驱动,如对各种控制信号的存取,自定义的驱动程序接口等,不经过OS层。
采用这种功能的划分,实际上也体现了BSP调试的一个策略,即先调试最小系统的BSP,然后再利用各种调试工具调试其他外围设备的驱动程序。
1.3BSP开发的意义
操作系统是应用软件运行的平台,而BSP又是操作系统正常运行的前提。
BSP程序的效率,稳定性直接影响到整个软件系统的性能及稳定性,因此BSP对于整个系统是非常重要的。
而且调试BSP同样具有挑战性,之所以这样,是因为在BSP运行之前,所有的操作系统调试工具都不可用,正是BSP的前期工作,使得各种应用调试工具得以在具体的硬件环境上运行。
2vxWorks中BSP的体系结构
vxWorks为了最大限度的支持不同的硬件环境,它也提供了一些常用硬件芯片的驱动程序,它们通常是与具体CPU无关的设备,如一些网口芯片,串口芯片等。
我们一般将其简称为芯片驱动程序。
而针对某类CPU的硬件单板,vxWorks也通常提供有DEMO板的BSP,这些程序分别位于指定的目录之下。
我们通常就将其简称为这个单板的BSP。
一般来说,我们在硬件系统设计好之后,都会先找到一个与自己系统相近的DEMO板BSP(最起码是使用相同的CPU)。
并以此为基础开发自己单板的BSP。
config
target
all
comps
Bspname
…
h
lib
src
unsupported
config
drv
end
intrCtl
sio
…
BSP文件主要位于Tornado安装之后的Target目录下,具体目录结构如下:
各个目录又包含不同的子目录,不同的目录中保存有vxWorks提供的有关BSP的各种功能的代码文件,目标文件及编译文件等。
说明如下:
1)config目录:
用于vxWorks核心的配置及编译的文件。
其中又包含多个子目录。
²all目录:
通用的配置文件
²comps目录:
用于Tornado工程管理工具配置的源文件
²bspname目录:
每个单板都有一个相应目录,命名可根据单板而定,其中包含有关此单板BSP的代码文件,目标文件及编译文件等,这也就是我们通常所说的单板BSP。
2)h目录:
其中包含所有vxWorks操作系统的头文件及通用编译文件。
其中的各个子目录表示了vxWorks中不同模块的头文件。
3)lib目录:
由vxWorks为不同平台提供的库文件及目标文件。
4)src目录:
vxWorks提供的部分硬件芯片驱动程序的源代码文件,其又包含多个子目录:
²config目录:
有关vxWorks操作系统的一些通用的源代码文件。
²drv目录:
vxWorks中一些硬件芯片的通用驱动程序源代码文件,其根据不同功能的芯片分为若干个子目录,例如end 表示网口驱动,sio表示串口驱动等
5)unsupported目录:
其中包含一些较古老的硬件BSP代码。
对于我们为自己的系统而开发的BSP来说,仅仅需要修改和添加的程序都位于在config目录下。
其中all和comps目录对于所有的BSP来说是共用的,对其内容的修改将会影响到所有系统的BSP。
而bspname是为各个系统实现的BSP文件,对其的修改仅仅影响到本单板的BSP。
如我们UAS中的各单板BSP目录,交换板:
Spb;主控板:
cpb;等。
3BSP的调试方法及步骤
3.1.1BSP的调试步骤
BSP的开发步骤不同于其他应用软件,由于它与硬件直接相关,因此必须采用一种渐进的方式进行。
一般来说分为两个步骤:
1)最小系统的调试
所谓一个单板的最小系统,一般是指具有CPU+Bootrom+RAM+网口+串口这样一些器件的系统,最小系统是操作系统得以运行,调试工具可以正常使用的前提条件。
这一步也是BSP调试中比较困难的一步,一定程度上说,这是一个硬件调试的过程。
由于最小系统的调试手段有限,因此一般我们建议单板的最小系统都使用与DEMO板相同的硬件结构,这样我们就只需对DEMO板BSP相关的文件进行修改,以适应于自己的目标板即可,另外这一阶段可能有许多硬件问题尚未完全解决,只有通过在BSP软件调试过程中才表现出来,如果在此时添加过多的软件功能的调试,无疑会很难定位各种故障。
除非有硬件调试器的支持,否则,不建议最小系统中使用过多未曾用过的硬件芯片。
2)外围设备驱动程序的调试
这部分程序由于不同的芯片功能差异,相应的驱动程序开发差别很大。
也可以分为两步来进行:
首先通过一些简单的配置及测试程序,验证硬件工作状态是否正常,即进行硬件调试,这一阶段尽可能排除各种硬件故障。
接着就是调试驱动程序本身。
由于通常各种外设驱动程序都会与操作系统交互信息,而且随着信息量的增大,使得驱动程序的运行频率会变得非常高,因此,设计驱动程序时,一定要注意程序的稳定性及效率,它将直接影响到整个系统的性能及稳定性。
这是开发驱动程序时应特别注意的。
另外,驱动程序的开发需要对整个操作系统有较深入的理解并且需具备CPU方面的相关知识,这样非常有助于程序的设计。
一般来说,操作系统都定义了各种标准的驱动程序接口,如Windows中的NDIS,vxWorks中的END,pSOS中的NI等。
这种接口一定程度上也就屏蔽了操作系统对底层硬件驱动的相关性。
其实对于大部分通用设备的驱动程序,其都可以由两部分来实现,一部分是与CPU相关的代码,这一部分主要一些的配置参数,以及其他一些存取CPU资源的相关的代码功能,如中断开关等,这些程序很少。
另一部分就是与CPU不相关的驱动程序代码,它实现了与OS的绝大部分接口。
这种实现方式可以使得驱动程序较容易移植于不同的CPU平台。
VxWorks中的大部分驱动程序,都采用这样方式实现的,其CPU无关部分位于drv目录下,而配置部分位于BSP目录下。
3.1.2BSP的调试方法
BSP软件的调试方法主要有如下几种:
²硬件仿真器调试
一般来说,CPU在设计时都会有一个硬件调试口,如JTAG,BDM等。
通过它硬件仿真器(如BDM仿真器,EST仿真器等)就可以控制CPU,下载程序到内存中,并执行。
仿真器软件都提供有一些常用的调试手段,如断点,单步运行,查看内存等。
其连接方式如下图:
PC机
硬件仿真器
目标板
JTAG/BDM
网口/并口
图2仿真器原理
调试时,我们可以利用要调试的BSP编译生成一个vxWorks核,然后利用仿真器下载到目标板RAM中,即可进行调试。
由于仿真器在与目标板建立连接之前已经对CPU进行了配置(一般都有一个配置脚本文件)。
其入口点为sysInit,因此这种方法不适用于对bootrom的调试(二者流程不一样,以后会讲到)。
²纯软件方法调试
对于没有硬件调试器的单板,或者调试其bootrom时,都只有采用软件方法,不断的烧写bootrom,来实验。
一般都使用点灯,硬件信号测试,串口显示等方法来调试程序的执行流程。
这也是最痛苦的一个时期,在最小系统调试中,有时必须使用这样较原始的方法。
²软件调试器调试
在最小系统调试结束后,各种操作系统提供的调试工具都能使用了,因此我们可以将外设驱动程序的调试作为应用程序,来利用这些调试工具进行。
一般来说都是使用一个网口或串口作为调试口。
4BSP的执行流程
调试BSP软件,首先必须对整个操作系统从上电开始的执行流程有一个清晰的了解,vxWorks其BSP执行流程如下图所示:
一般来说,任何一个CPU,其都存在Reset向量,当系统上电后,CPU会固定到某个内存地址去执行,如MPC8240为0xFFF00100;860为0x02800100;x86为0xFFFF0;M68302为0x200100等。
这段地址空间物理上总是对应于一块Bootrom。
其中保存着操作系统的引导代码,vxWorks即按上图所示的流程引导的,其他系统也很类似。
romInit位于CPU的复位向量中,一个向量一般最多为256字节,因此不能放太多的程序在此位置。
这里仅仅完成如下工作:
1)关闭中断,初始化CPU的一些基本寄存器,如Cache,FPU等。
2)配置SDRAM,使其可以使用。
3)初始化堆栈指针,调用romStart。
SysIint函数中继续完成对于CPU的一些初始化。
系统真正的板级硬件初始化,一般都放在sysHwinit函数中,它位于BSP目录的sysLib.c文件中,它是BSP调试中修改最多的地方。
所有的板级硬件初始化完成后,就开始操作系统核心代码的加载,由其建立多任务环境,创建根任务usrRoot。
在根任务中,继续完成一些设备驱动的加载工作,如标准IO设备,网络协议栈及设备驱动等。
在vxWorks引导成功后,它会在根任务usrRoot中调用usrAppinit函数,用户可以在这个函数中创建自己的任务或者启动相应的软件模块。
BSP执行流程中,公共程序部分有bootconfig.c,usrConfig.c等文件中的例程,以及comps目录中的例程。
而与具体单板有关的程序位于BSP目录下,如sysLib.c,sysALib.s等文件中的例程。
5配置BSP
每个BSP目录下都有一个关于此BSP的配置文件config.h,通过修改其中的参数我们可以简单的定制系统的配置参数,主要参数如下:
配置参数
含义
LOCAL_MEM_LOCAL_ADRS
RAM起始地址
LOCAL_MEM_SIZE
RAM的大小
USER_RESERVED_MEM
用户保留RAM的大小
RAM_HIGH_ADRS
Bootromimages复制到RAM中的起始地址
RAM_LOW_ADRS
VxWorkskernel复制到RAM中的起始地址
ROM_TEXT_ADRS
BootRom入口点
ROM_SIZE
BootRom的大小
ROM_BASE_ADRS
ROM的基地址
DEFAULT_BOOT_LINE
BootRom启动配置行参数
NUM_TTY
系统中串口个数
CONSOLE_TTY
控制台串口号(从0开始编号)
另外,在BSP目录下的madkfile文件,也有一些参数,需与config.h中一致
配置参数
含义
RAM_HIGH_ADRS
Bootromimages定位到RAM中的起始地址,必须与config.h文件中一致
RAM_LOW_ADRS
VxWorkskernel定位到RAM中的起始地址,必须与config.h文件中一致
ROM_TEXT_ADRS
BootROM入口点,必须与config.h文件中一致
ROM_SIZE
ROM的大小,必须与config.h文件中一致
注意事项:
1)当我们使用命令行方式编译时,我们对BSP中config.h的改变,会立即影响到我们以后对BSP的编译结果。
2)当我们使用Tornado工程管理工具,依据某个BSP生成一个bootableimage工程时,仅仅当你生成工程时,config.h中配置参数影响到工程中相应的参数,以后对此BSP的config.h配置参数的改变不会影响到工程,同样对工程参数的改变也不会影响到依此BSP生成的其他工程或命令行编译结果。
3)以上所说的仅仅指配置参数(上面所列以及模块配置等参数)而言。
4)建议一般不要直接改变configAll.h的内容,尽量使用Tornado的工程配置工具。
在命令行编译方式时,可以在BSP目录的config.h中先#undef一个宏,然后再#define之即可。
5)在BSP目录下一般都有一个target.nr文件,其中有关于此单板BSP的一些说明和注意事项。
我们最好实时维护它的内容,以供以后使用。
6)当我们需要更改config/all目录下的文件时,由于它是所有BSP所公用的,最好不要直接更改,而是先把要更改的文件拷贝到你自己的BSP目录下,然后在BSP的makefile文件的HEX_FLAGS项后作如下相应的定义即可:
USRCONFIG =usrConfig.c
BOOTCONFIG=bootConfig.c
BOOTINIT =bootInit.c
这样你以后对这些文件的改动不会再影响到其他BSP。
7)当用BDM调试BSP时,应该在makefile中将-g编译选项变为-gwarf,以使得SingleStep可以识别编译生成的符号表。
另外当前850/860系统中的Cache都必须禁止。
8)如果我们要在BSP中增加一个文件,例如有一个目录,叫做dir1(其可以是一个绝对路径,如d:
\prj\app1等,当然也可以是相对路径),其内有文件file1.c,则添加过程为:
²定义MYDIR=dir1
²定义VPATH=$(MYDIR)
²MACH_EXTRA=……file1.o
以后无论是命令行编译,还是生成工程时,这个文件都会包含于其中。
当有多个文件时,只要如此定义即可:
VPATH=$(MYDIR1)$(MYDIR2)。
6BSP的开发内容
由于BSP是操作系统与硬件之间的接口,因此BSP的开发,其就包含了对系统中可能出现的所有硬件类型的驱动,可以根据不同的功能分为如下几类:
6.1中断处理
支持中断处理是实时系统中的一个重要的特征。
中断的硬件支持是由系统中的中断控制器完成的。
VxWorks采用向量的方式来管理中断,它维持了一个软件的中断向量表,为每个中断都分配了相应的向量,通过它就可以找到这个中断对应的中断服务程序。
在PCI系统中,还支持中断的复用,即一个向量对应多个中断服务程序,可以根据不同中断设备的状态来确定是谁产生了中断。
VxWorks中要求BSP实现的中断接口有:
intConnect:
将指定的中断服务程序连接于指定的中断向量
intEnable:
使能指定中断向量对应的中断
intDisable:
禁止指定中断向量对应的中断
另外,vxWorks自身根据不同的CPU平台提供了一个全局的中断控制函数:
intLock:
禁止系统中的所有外部中断
intUnlock:
使能系统中断功能
6.2Memory驱动
当前一些硬件系统中,主要使用了如下几类存储器
1)RAM
RAM是一个计算机系统所必备的资源,一般又可以分为DRAM,SDRAM,SRAM等。
系统中一般都有一个Memory控制器,需要BSP对其进行配置以后,才可以使其管理的RAM资源可以使用,对于vxWorks,这一部分工作都是在romInit中完成的。
最常用的就是对片选的设置,SDRAM时序参数的配置等。
2)ROM
系统 中的Bootrom程序一般都放置于ROM中,但是,由于FLASH成本的降低,并具有可擦写性,因此现在大多数系统中不再有ROM,都使用各种类型的FLASH。
FLASH可以像访问RAM一样直接读取,但是对于FLASH的的写操作需要特殊的命令来完成。
大部分系统中,我们将bootRom在硬件上加了写保护,变为真正的ROM。
而数据FLASH可以进行擦写。
ROM通常只需要配置片选即可使用。
3)NVRAM
NVRAM实际并不是物理上定义的一类存储器,而是一种功能的定义(non-volatile)即非易失性的存储器,也就是单板掉电后,仍可以保留内容。
一般来说,我们可以使用EEPROM或FLASH来作为NVRAM。
NVRAM中主要保存了系统的一些配置参数,如BIOS的CMOS等。
大部分CPU在硬件上都具有内存管理单元即MMU,vxWorks中实现了MMU的大部分功能,如内存保护等,并留给用户一个接口进行配置。
在BSP目录的sysLib.c文件中有一个结构数据sysPhysMemDesc,如果系统中增加了一块存储器资源,则必须在此数据中添加相应的一项,这样MMU就会对此块资源进行管理。
6.3总线
任何一个计算机系统,都有总线的概念,它是连接系统各个部件之间的通讯通路,只不过对于一些集成的处理器,它对用户基本屏蔽了大多数总线操作。
当今已经成为工业标准的总线主要有:
1)PCI总线
PCI总线是当今PC行业的工业标准总线,硬件上就表现为一个主总线控制器以及总线上的各种外设。
BSP中对于PCI总线的驱动,首先是对系统中总线控制器(也称之外主桥)的配置。
其次就是提供访问及配置总线上其他设备的接口。
由于PCI总线协议由详细的国际标准定义,因此vxWorks实现了协议所定义的PCI总线所有控制功能,BSP中只需实现针对具体CPU及主桥的代码即可。
2)ISA总线
ISA总线现在一般仅作为一种慢速设备的总线,它最初是专为x86CPU而设计的,当前PCI规范中定义了向下兼容的机制,通过一个PCI/ISA桥,而使得PCI系统中仍然使用ISA总线设备。
ISA总线为各种类型的设备定义了具体的地址空间范围,因此,其很难实现通用的驱动程序,只能由BSP根据具体系统来编写。
6.4串口
串口是绝大多数嵌入式系统都具备的一个器件,它是一个简洁的调试显示方式及应用的控制接口。
由于串口已经产生很长时间,其功能上基本没有太多可以改进的地方,因此绝大多数串口芯片都是与8250芯片软件兼容的,其驱动可以共用。
VxWorks中已经提供的其通用部分的SIO接口驱动程序,位于drv\i8250Sio.c。
对于其他一些串口,如MPC860集成的SMC,其驱动程序也位于drv目录下。
一般也不需修改。
vxWorks中对于串口驱动的配置程序部分,位于BSP目录的sysSerial.c文件中,其中定义了一个参数数组devParas,用以定义串口的配置参数,如果要增加多个串口,只需在数据中添加多个元素接口。
系统在引导过程中,在sysHwinit函数里会调用sysSerialHwInit来完成对各个串口的硬件初始化。
在usrRoot中完成SIO设备的加载。
6.5网口
网口作为一种较高速的通讯端口,也广泛应用于嵌入式系统中。
VxWorks为网口设备定义了一个标准的驱动程序接口,称之为END接口。
并且它还提供一些网口芯片的通用驱动程序,位于drv\end目录下。
网口驱动程序一般分为两部分,一部分称之为通用驱动部分,它一般可以做到与CPU无关,如位于drv\end目录下的各种PCI网口驱动程序。
另一部分是与平台相关的代码(网口设备在PCI总线上的初始化等)及参数配置部分,其位于BSP目录下,文件名一般为sysXXXEnd.c。
通过这部分程序来定义本单板中网口驱动的一些特定代码和参数等。
如果要开发自己的END驱动程序,则必须遵循vxWorks所定义的END接口标准,其难度还是比较大的。
应该主要注意一下几点:
1)程序的稳定性是第一位的,注意各种异常和边界处理
2)注重程序的效率,尽量减少内存拷贝。
3)中断处理函数尽量简洁,将大部分处理工作放在任务中执行
4)注意Cache的使用,所有采用Dma方式访问的内存,一定要使用cacheDmaMalloc来申请。
END接口的驱动程序开发好之后,还需将其添加到vxWorks的协议栈之中,才可以被上层应用使用,vxWorks对网络设备做了如下的约定,同一类设备使用相同的设备名,如I82559为er,860的网口为cpm等,多个同类设备间编号,从0开始,递增。
这样一个完整的设备名即为cpm0,cpm1等。
添加一个网口驱动的过程,可以简化为如下几个步骤:
例如添加一个i82559网扣驱动到系统中。
1)在configNet.h文件中有一个结构数组endDevTbl,添加一项如下:
{0,END_LOAD_FUNC,END_LOAD_STRING,1,NULL,FALSE},
其中:
END_LOAD_FUNC:
表示驱动的Load函数
END_LOAD_STRING:
表示初始化参数,一般为空
其他几项一般固定如上填写
2)用于boot网口,无需其他操作,系统引导后,网口驱动即被加载,具体参数如IP地址由bootline指定。
3)对于非boot的网口,则需在应用程序中执行:
ipAttach(0,”er”); /*0表示设备号,”er”表示设备名*/
ifAddrSet(“er0”,”136.1.64.88”);/*er0表示vxWorks网络设备名,”136.1.64.88”表
示这个网口的IP地址*/
6.6CACHE和MMU
1、Cache的基本概念
计算机系统,一般是由CPU,存储器,I/O以及连接他们的总线构成,随着CPU主频的不断提高,存储器访问速度逐渐成为系统性能的瓶颈。
为了解决这一问题,人们除了在设计更快的存储器芯片以外,还提出了Cache的概念,以达到从整体上提高访问存储器平均存取时间的目的。
Cache就是利用一些容量较小,存取速度较快,但价格较贵的存储器作为主存储器(如RAM)的补充。
Cache中存放主存储器中的部分副本。
当CPU试图从存储器中读取一个字时,首先检查这字是否在Cache中,如果是,则直接将其传送给CPU。
如果不是,则将主存储器中一块固定数目的字读入Cache中,然后把这个字传送给CPU。
由于访问的局部性,当一块数据取入Cache以满足某次存储器访问时,将来访问块中的其他字是极有可能的。
CPU
主存储器
Cache
字传送
块传送
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vxWorks BSP 培训 文档
![提示](https://static.bingdoc.com/images/bang_tan.gif)