《基于VxWorks嵌入式系统的数据通信》课件第8章_第1页
《基于VxWorks嵌入式系统的数据通信》课件第8章_第2页
《基于VxWorks嵌入式系统的数据通信》课件第8章_第3页
《基于VxWorks嵌入式系统的数据通信》课件第8章_第4页
《基于VxWorks嵌入式系统的数据通信》课件第8章_第5页
已阅读5页,还剩160页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章VxWorkshopBSP基础及其开发过程8.1BSP基础理论知识8.2BSP的基本配置和VxWorks的初始化8.3BSP的开发要求及开发过程8.4BSP中设备驱动程序的开发8.5本章小结8.1BSP基础理论知识从本章开始,我们将讨论VxWorks的一个重要组成部分——BSP(BoardSupportPackage)。在目标机系统加电以后,首先执行的代码就是BSP,它的重要性是不言而喻的。8.1.1BSP概述

BSP即板级支持包,通常是指针对具体的硬件平台,用户所编写的启动代码和部分设备驱动程序的集合,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好地运行于硬件主板上。它来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于具体的硬件平台,与硬件相关的代码都被封装在BSP中,由BSP向上提供虚拟的硬件平台,BSP与操作系统通过定义好的接口进行交互。以上是从BSP的功能去理解BSP,但是到目前为止还没有对BSP得出明确的定义。在VxWorks系统中,对BSP的简单描述为介于底层硬件环境和VxWorks之间的一个软件接口。BSP的主要特点是硬件相关性和操作系统相关性。因此BSP与操作系统是相对应的,不同的操作系统就应该对应于不同定义形式的BSP。例如,VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该操作系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好地支持上层OS。最基本的BSP仅需要支持处理机复位、初始化、驱动串口和必要的时钟处理。在VxWorks中,它的主要功能是系统加电后初始化目标机硬件、初始化操作系统及提供部分硬件的驱动程序,具体的功能包含如下:

(1)初始化。所谓初始化是指从系统上电复位直到VxWorks开始初始化用户应用时(即WindKernel和tUsrroot启动)的一段时间内系统所执行的过程。这个过程主要包括三个部分的工作。图8.1具体描述了VxWorks系统BSP的初始化过程。①CPU初始化。初始化CPU的内部寄存器(如状态寄存器、控制寄存器、高速缓存等)。②目标机初始化。初始化控制芯片的寄存器(如BUS、DMA、DRAM)和I/O设备寄存器(驱动各设备),为整个软件系统提供底层硬件环境的支持,打开设备。③系统资源初始化。为操作系统及系统的正常运行做准备,进行资源初始化(如操作系统初始化、空间分配等)。

(2)使VxWorks能够访问硬件驱动程序。这主要是指BSP包含部分必要的设备驱动程序和相关设备的初始化操作。我们可以将VxWorks系统的驱动程序抽象为三个层次:常规操作、与I/O系统的接口、与Component的接口。VxWorks系统驱动程序的抽象逻辑如图8.2所示。图8.1VxWorks系统BSP的初始化过程图8.2VxWorks系统驱动程序的抽象逻辑在VxWorks系统驱动程序的抽象逻辑中,常规操作是设备的固有操作逻辑,具有两层含义。它在微观上表现为CPU操作设备的寄存器。如图8.3所示,CPU对控制电路、数字电路和I/O处理器的各种寄存器进行操作,例如对I/O进行编址。在宏观上它表现为具体的驱动操作。在VxWorks系统驱动程序的抽象逻辑中,驱动程序与I/O系统的接口、驱动程序与Component的接口有如下三层含义:①I/O管理。②操作类型规定。③参数规定。驱动程序与I/O系统的接口使驱动程序具有更好的层次性,驱动程序与Component的接口使驱动程序具有更好的抽象性。图8.3CPU对设备寄存器的操作示意图

WindRiver公司提供大量预制的支持许多商业主板及评估板的BSP。同时,VxWorks的开放式设计以及高度的可移植性使得用户在使用不同的目标板进行开发时,所做的移植工作量非常小。到目前为止,WindRiver公司能够提供超过200个的BSP,当用户在为自己的目标板开发BSP时,可以从WindRiver公司的标准BSP中选一个最接近的来加以修改。另外,WindRiver还提供了BSPDevelopKIT,包括流行标准板的BSPsourcecode,以及BSP开发效果的校验工具,以方便用户。图8.4为基于VxWorks操作系统的系统运行时的结构,说明了BSP在系统中的位置。从图中可以看出,BSP向上层提供的接口有:①与Wind的接口。②与VxWorks系统组件的接口。③与应用程序的接口(可以提供,但一般情况下不提倡使用)。

(3)在VxWorks系统中,集成了与硬件相关(Hardware-dependent)的软件和部分硬件无关(Hardware-independent)的软件。图8.4基于VxWorks操作系统的系统运行时的结构在以后所讨论的BSP中,如果未加说明都是指VxWorks所包含的BSP。既然BSP是相对于操作系统而言的,那么BSP和VxWorks之间的关系到底是怎样的呢?图8.5所示的BSP在系统中的层次清楚地展现了BSP与VxWorks之间的具体关系以及在目标机应用系统中BSP所处的地位。从图中可以发现BSP不是一个设备驱动程序,因为设备驱动程序能够访问硬件设备(例如网络设备驱动程序、SCSI设备驱动程序),同时相同类型设备的驱动程序,可以不做修改从一个目标环境中移植到另一个目标环境中(例如网卡驱动程序);而BSP则是只能运行在指定设备的硬件环境中。就BSP开发而言,简单地说BSP开发人员需要完成以下两方面的工作:①完全支持BSP管理的设备。②通用设备驱动程序的集成工作。图8.5BSP在系统中的层次8.1.2BSP所要实现的功能

BSP既然有如此重要的地位,那么它到底有哪些功能呢?概括起来,主要有下面几个要点。

1.目标机硬件环境的初始化

VxWorks的引导顺序具体过程将随着处理器和硬件环境的变化而变化,目标机通用初始化的必要条件是:

(1)在存储器里的特殊地址处提供一段代码,当复位或加电目标机时处理器将立即执行这段代码。

(2)设置处理器为某个具体的状态。

(3)初始化存储器并对存储器进行编址。

(4)关闭中断。

(5)将控制权移交给附加的引导代码。

(6)装载需要的VxWorks段到RAM中,例如把数据段从ROM拷贝到RAM中。

(7)在初始化VxWorks内核前,使目标机硬件处于一个静止状态。

2.硬件驱动程序的集成访问硬件设备驱动程序,BSP必须包含设备驱动程序的相关支持、设备的配置管理等。这主要是指下面几个方面:

(1) BSP里提供了一些驱动程序支持。在BSP里包含了一些驱动程序的支持,其中包括驱动程序的中断服务程序、驱动程序相关的结构以及宏定义等。①除BSP包含与中断向量表关联的中断服务程序外,还包含驱动程序定义的中断服务程序。②BSP为驱动程序初始化创建的结构对象。③为硬件寄存器定义的偏移常量和访问宏,驱动程序将使用它们。

(2)为硬件驱动程序提供可移植性的代码。可移植性的网络设备驱动程序代码将允许开发者把它移植到新的硬件环境上,或者使开发者为常见的硬件环境提供新的网络设备驱动程序。

(3)设备配置管理。包括:①可使用设备的全部特点。②将产品的开发与配置分开。

3.与硬件相关软件的集成一个好的BSP不但功能齐全,它的灵活性、可读性、可移植性等方面也是需要考虑的问题。

(1)提供代码的适应性和可移植性。适应性和可移植性在这里是指:①编译时的适应性。②执行时的可移植性。

(2)编译时的适应性。编译时的适应性主要从两个方面来说明。①使用预处理宏定制系统。使用预处理宏,用户可以根据自己的需要对BSP系统进行定制。例如:

#defineINCLUDE_ATA/*包含IDE/EIDE(ATA)硬盘驱动程序*/

#defineINCLUDE_FD/*包含软盘驱动程序*/

②在不改变源程序的情况下,提供优化目标模块的能力。这主要是指程序可根据用户的配置,进行目标模块的优化操作,如下所示:

voiduSRR0ot

(

Char*pMemPoolStart,/*系统内存块的起始位置*/ unsignedmemPoolSize/*初始化内存池的大小*/

)

{

#ifdefINCLUDE_WDB WdbConfig();/*配置和初始化目标机调试代理——WDB*/ vxBootFile[0]=NULL;/*清除引导行*/

}

(3)执行时的可移植性。执行时的可移植性主要包括两个方面。①使用指针访问程序。使用指针访问程序,大大提高了程序的执行速度,减少了系统开销。②提供编译对象模块的可移植性。8.1.3BSP的文件结构

BSP包含的程序是提供VxWorks访问目标机硬件环境的主要接口。因此,了解BSP的文件组成和结构是十分必要也是十分重要的。在这之前,由于VxWorks系统是运行于Tornado开发环境下的,因此我们首先介绍在开发环境Tornado软件包安装后的模块组成和目录结构。

1.Tornado的模块组成

Tornado开发系统包含三个高度集成的部分:

(1)运行在宿主机和目标机上功能强大的交叉开发工具和实用程序。

(2)运行在目标机上的高性能、可剪裁(用户可根据自己的需要配置系统)的实时操作系统VxWorks。

(3)连接宿主机和目标机的多种通信方式,如以太网、串口线、ICE(在线仿真器)、ROM仿真器或用户定制的连接方式等。而这些部分主要由以下模块组成:

·宿主机支持的包(HSP,HostSupportPackage)。

·通用(与目标机无关)的VxWorks。

·体系结构模块(与目标机无关)

·板级支持包——BSP。

·目标机调试代理(WindDebuggAgent,WDB)。这些模块在移植性、裁剪性、可维护性等方面非常方便,它们之间的层次如图8.6所示。图8.6Tornado模块

Tornado的整个目录结构如图8.7所示。通过上面的介绍,相信大家对Tornado的模块组成和软件结构有了较为清晰的认识,下面我们将在这一基础上详细描述BSP文件的结构组成。图8.7Tornado软件目录结构图

2.BSP的组成

BSP主要由以下几类文件组成。

1)源文件源文件主要是用C语言编写的代码所组成的文件。同时,有一部分文件是由体系结构相关且执行最优化的汇编语言编写的代码组成。例如C语言编写的bootConfig.c、usrConfig.c,汇编语言编写的romInit.s、sysALib.s文件等。

2)头文件头文件包含针对CPU板的硬件定义及内存定位定义的文件,例如config.h、configAll.h等文件。

3) makefile文件

makefile文件控制构造所有类型映像的文件,例如makefile文件。

4)派生文件派生文件包括由源文件、头文件等其他文件衍生而成的文件和VxWorks存档库模块。这些文件分为下面几类:

(1)硬件初始化对象模块。

(2) VxWorks引导对象模块。

(3) VxWorks映像。

(4) VxWorks二进制符号表。

BSP的组成文件主要包含在以下四个目录里。

·…\Tornado\target\config\all

·…\Tornado\target\config\comps\VxWorks

·…\Tornado\target\config\comps\src

·…\Tornado\target\config\bspname下面我们将详细描述这些文件目录下的具体内容。

3.BSP的源文件

1) …\target\config\all目录下的文件这个目录下的文件作为VxWorks体系结构产品的一部分而提交给用户。如果不是特殊需要的话没有必要更改这些文件。其中,比较特殊的是configAll.h文件。这个文件设置了所有类型VxWorks映像的默认配置。在这个文件里定义的宏是一些通用设置,如果所需的VxWorks映像不同于默认配置,可以使用config\bspname目录下的config.h文件中所定义(#define或#undef)的宏来替换configAll.h的默认配置。通常,构造工程并不直接使用config\all目录下的文件,只有新建一个可引导型工程时才使用它们。用户创建工程后,config\all目录下文件的任何修改都不会影响工程。如果希望改变,则必须在工程区域直接进行修改。更改configAll.h文件将影响通过开发环境新创建的可引导型映像工程。所以一般情况下,在config.h文件中根据工程需要定义宏来替换configAll.h的默认宏定义,而不是直接修改configAll.h文件。

2) …\target\config\bspname目录下的文件这个子目录包含系统或硬件相关的BSP文件。其主要由下面的文件组成:

(1) Readme。Readme文件包含了BSP发布记录。它记录了每次发布版本、修改版本和在新版本上所做的工作。

(2) makefile和depend.bspname文件。makefile文件控制使用命令行方式构造映像。从VxWorks5.2开始,标准的make工具是GNUmake,并且当前的make技术继承了许多GNUmake的优点。BSPmake系统包含了位于target\h\make目录下的make子文件。如果某个相关性文件不存在,make将自动产生depend.bspname文件,它可以用来追踪所有模块的相关性。depend.bspname相关性文件并不包含在BSP文件中,它是一个自动产生的文件。

(3) config.h文件。config.h文件包含了所有的头文件和与CPU板相关的特殊定义。标准的config.h包含下面的内容:①BSP版本号和修订版本号。

#defineBSP_VERSION“1.2”

#defineBSP_REV“/0”/*0为第一次修订版本*/②包含configAll.h文件。

#define“configAll.h”③高速缓冲存储器和MMU的配置。

#defineUSER_I_CACHE_ENABLE

#defineUSER_D_CACHE_ENABLE

#defineUSER_B_CACHE_ENABLE

#defineUSER_I_MMU_ENABLE

#defineUSER_D_MMU_ENABLE

④共享内存网络定义。

#defineINCLUDE_SM_SEQ_ADDR⑤目标板上的内存地址和大小。

#defineLOCAL_MEM_LOCAL_ADRS0x00000000

#defineLOCAL_MEM_BUS_ADRS0x00000000

#defineLOCAL_MEM_SIZE0x00800000/*8MB或更低内存*/⑥ROM地址和大小。

#defineROM_BASE_ADRS0xfff20000/*ROM的基地址*/

#defineROM_SIZE0x0007fe00/*ROM大小*/⑦非易失性RAM(NVRAM,non-volatilememory)参数。例如:

#defineNV_RAM_SIZENONE/*没有NVRAM*/⑧默认引导参数。

#defineDEFAULT_BOOT_LINE

\“fd=0,0(0,0)host:/fd0/VxWorksh=e=0u=target”⑨时间戳(timestamp)驱动程序支持。

#defineINCLUDE_TIMESTAMP/*包含时间戳定时器,提供给WindView工具*/外部总线地址映射。网络设备和中断向量。

#defineINCLUDE_END/*使用增强型网络驱动*/

#defineINCLUDE_FET/*包含IntelEtherExpressPR0100BPCI*/

#defineNUMBER_OF_IRQS24

#defineINT_NUM_IRQ00xe0/*IRQ0的向量号*/包含bspname.h文件。

#include“pc.h”注意,config.h文件应包含configAll.h和bspname.h文件。

(4) romInit.s文件。该文件包含引导ROM和基于ROM的VxWorks映像的入口初始化汇编代码。romInit.s文件的入口点为romInit()函数,是系统加电启动后首先执行的代码。同时它也设置了启动类型参数BOOT_COLD,并把该参数传递给通用的romStart()函数。如果硬件需要立即进行内存映射或设置特殊的寄存器,则在这里处理。大部分硬件初始化操作在sysLib.c文件中的sysHwinit()函数里进行。在romInit()函数中,有三个必须执行的主要功能:①屏蔽中断,初始化CPU。②初始化内存系统,通常包括关闭高速缓存和初始化内存控制器。对于SPARC体系结构的目标机,必须打开MMU。③初始化堆栈指针和其他寄存器以便能够执行C代码,然后调用romStart()函数。值得注意的是,romInit()函数必须设计成与地址无关的代码(Position-IndependentCode,PIC)。它需要支持综合的VxWorks引导策略。如果必须使用绝对地址,通常会通过ROM_ADRS(x)宏对地址重新计算。该宏定义如下:

#defineROM_ADRS(x)((x)-_romInit+ROM_TEXT_ADRS)一个普遍的错误是BSP开发人员试图在romInit.s里进行过多的初始化操作。实际上大部分其他初始化功能应推迟到sysHwinit()函数中进行。另外,romInit.s中的代码不应当被其他模块或函数调用。另一个普遍的错误是BSP开发人员认为在romInit.s里初始化过的设备不需要在sysALib.s或sysLib.c中重新初始化。实际上VxWorks映像并不认为它是由引导映像程序引导的。因此,它必须重新设置和重新初始化所有它自己需要使用的设备。一般情况下,VxWorks的引导映像主要用于VxWorks映像的调试和开发阶段。当VxWorks映像开发结束后,VxWorks的引导映像也就完成了它的使命。注意,产品中的VxWorks映像尽量不要依赖于引导ROM映像。

(5) sysAlib.s。这个文件包含目标机体系结构决定的、与系统有关的汇编程序。所有BSP程序应当用C语言编写,然而如果由于编译等原因需要用汇编语言编写程序,那么可以把所编写的汇编程序放到sysALib.s文件里。

sysALib.s文件里的sysInit()函数是VxWorks映像的入口点,系统引导后,首先执行该段代码。sysALib.s所执行的所有功能类似于romInit.s的工作,但它不执行系统内存初始化操作。系统应当在程序启动阶段初始化内存系统。与romInit.s不同的是,不需要把sysALib.s中的代码编写成与PIC无关的代码或使用ROM_ADRS宏重新映射绝对地址。它可以调用其他模块和程序。

(6) sysLib.c。这个文件包含目标机体系结构决定的、与系统有关的C程序。这些程序提供板级接口,基于这些板级接口,VxWorks和应用程序的构造与系统无关。sysLib.c文件可以包含src/drv目录下的驱动程序。驱动程序的安装和初始化通常在子文件中完成,在sysLib.c中包含了这些操作。这些子文件通常的命名是sysSerial.c、sysScsi.c、sysNet.c等。使用子文件的目的是为了保持设备驱动程序的安装和初始化不随结构的变化而改变。一块目标板上的设备安装子文件应该能被另一块板上同样的设备所使用。

(7) sysSerial.c。这是一个可选文件,包含所有SIO设备串行I/O驱动程序的安装和初始化。系统没有单独编译它,而是将其包含在sysLib.c文件中。如果把串行设备初始化从sysLib.c中独立出来形成一个模块,则允许在BSP之间重复使用这个代码。

(8) sysScsi.c。这是一个可选文件,包含SCSI-2设备驱动程序的安装和初始化。它像sysSerial.c文件一样包含在sysLib.c文件中。

(9) sysNet.c。这是一个可选文件,包含网络接口驱动程序的安装和初始化。

(10) bspname.h。这个文件包含与目标板有关的特殊信息定义,例如串行接口、时钟、I/O设备。许多相关信息包含在target/h/drv目录下,这些VxWorks所要使用的目标板(包含设备的驱动程序头文件)应当包含在bspname.h文件的开始。这个文件预定的常量信息不应该影响用户的配置。如果定义在bspname.h文件里的任何宏或值可以改变系统的定制,那么应该由定义在config.h文件中的同样的宏或值所替代。使用一个样本头文件是非常有用的,因为大多数已经被定义的常量名、基本设备地址等已经定义,只需要根据实际情况修改。bspname.h文件中应定义下面的信息:①中断向量、中断级别。②I/O设备地址。③设备寄存器位的含义。④系统时钟和辅助时钟参数(最大和最小速率)。同样,可使用一个目标板描述来说明目标板所需要的特殊宏定义(例如以“PCI_”为开头定义相应的设备)。

3) …\target\config\camps\vxWorks目录下的文件这个目录下的文件是VxWorks实时内核基本模块描述文件(CDF文件)。有关详细信息参考有关模块描述语言(ComponentDescriptionLanguage,CDL)的相关书籍。

4) …\target\canfig\camps\src目录下的文件这个目录下的文件是VxWorks实时内核模块配置文件,这些文件提供的代码被usrConfig.c文件所使用。

4.派生文件所谓派生文件,是指从源文件、系统头文件、驱动程序源文件和VxWorks文档库中的模块衍生而来的文件。这些文件仅仅是为示范目的而衍生出来的文件,当配置一个系统时,可以重新创建这些文件中的部分文件或所有文件。通过Tornado2.0开发环境创建工程时,这些派生文件被放置在工程目录下。只有通过命令行方式构造工程时,系统才会使用在BSP目录下的派生文件副本。下面是一些派生文件。

(1) bootInit.o、bootInit_res.o、bootInit_uncmp.o。ROM型映像有三个引导策略,分别是:压缩的ROM型、非压缩的ROM型、ROM驻留型。这三个引导策略可以被引导ROM映像或ROM型VxWorks映像所使用。模块的名字指出了所使用的引导策略。

(2) bootrom,是一个包含二进制的VxWorks引导ROM的对象文件。

(3) bootrom.hex,是一个包含VxWorks引导ROM代码的ASCII文件,适合于通过串行连接PROM编程器来进行下载。默认的编码使用MotorolaS记录文件格式。

(4) bootrom.Z.s和bootrom.Z.o.,是压缩型bootrom.o映像模块的源程序和对象文件。

(5) ctdt.o,是管理C++构造/析构函数的模块。

(6) dataSegPad.o,是保证代码段和数据段不会共享同一个内存页的模块。使用VxVMI模块时,这个模块强制数据段和代码段处于不同的MMU页中。

(7) symTbl.c和sysALib.o,是内置符号表的源程序和对象文件。

(8) sysLib.o和sysALib.o,这两个模块总是一起成对出现。它们是sysLib.c和sysALib.s文件的输出模块。

(9) romInit.o,这个模块是引导映像或VxWorks映像的启动代码。对于Tornado2.0而言,它联合romStart.o模块一起工作,替代了bootInit.o。

(10) VxWorks和vxWorks.sym,VxWorks文件是链接好的、完整的VxWorks二进制文件,可以在目标机上运行。vxWorks.sym是VxWorks二进制文件的符号表文件。系统通过配置文件创建这两个文件。

(11) vxWorks.st,是一个链接好的、完整的、内置符号表的VxWorks二进制文件。

(12) target/proj/bspname_vx/*.*,这个目录包含BSP工程文件和默认构造输出。有两种方式创建一个新的工程:一种是使用工程工具;另一种是通过命令行的方式执行make来实现。

(13) doc/vxworks/bsp/bspname/*.*,这个目录包含了用户帮助系统的HTML文档文件。在命令行方式下执行makeman命令可以产生这些文档。

5. BSP里的函数

BSP里包括下面几类函数。

1)初始化函数通过初始化函数进行三类操作:

(1)初始化硬件到已知状态。

(2)标识系统。

(3)初始化设备,如SCSI或常规设备。

2)内存/地址空间函数通过内存/地址空间函数主要获得下面的信息:

(1)得到板上内存大小。

(2)总线地址空间。

(3)设定/获得非易失性RAM(NVRAM)。

(4)定义板的内存位图(可选)。

(5)为有MMU的处理器定义虚拟内存到物理内存的映射。

3)总线中断函数总线中断函数主要实现下述功能:

(1)打开/关闭总线中断。

(2)产生总线中断。

4)时钟/定时器函数时钟/定时器函数主要对时钟/定时器进行两步操作:

(1)打开/关闭定时中断。

(2)设置定时器的周期性。

5)邮箱/位置监视函数(可选)该函数用于打开邮箱/位置监视中断。8.1.4BSP开发工具嵌入式系统开发的目标之一就是使硬件运行得更快,因此必须开发BSP程序。随着嵌入式系统应用领域的扩大,WindRiver公司不可能向用户提供所有的功能实现方法,所以开发者需要一种帮助自己快速、简便地开发BSP的工具。板级支持包开发工具BSPDeveloper'sKit可以帮助开发者进行设计、归档和测试新设备的驱动程序和BSP的工作。下面我们将具体阐述板级支持包开发工具BSPDeveloper’sKit。板级支持包开发工具基本包(BSPDeveloper’sKitBaseOption)主要面向的是嵌入式系统开发者,其主要组成部分包括:

(1)板级支持包测试工具(BSPvalidationtestsuite):以源代码形式提供给开发者,用来检查BSP和驱动程序的基本功能以及报告存在的问题。

(2)板级支持包开发模板(TemplateBSP)。

(3)驱动程序开发模板(TemplateDriver)。

(4) SCSI测试工具(SCSITestSuite):主要提供一些SCSI的测试程序。

(5)板级支持包开发工具文档(DocumentationSet):主要阐述如何设计设备驱动程序、如何实现目标机上的VxWorks的最小配置等。板级支持包开发工具高级包(BSPDeveloper’sKitValueOption)向开发者提供了WindRiver公司的一般驱动程序源代码作为开发驱动程序和BSP的基础,其中包括了几乎所有现成的标准驱功程序,例如:Ethernet、SCSI等驱动程序源代码。其主要组成部分包括:

(1)板级支持包开发工具基本包。

(2) Ethernet驱动程序源代码。

(3) SCSI驱动程序源代码。8.2BSP的基本配置和VxWorks的初始化8.2.1BSP的基本配置用户在开发目标机的BSP之前,必须了解在VxWorks操作系统下BSP的配置,只有在熟悉BSP的配置后才可以正确地对BSP进行移植和修改工作,并根据自己的需求成功配置BSP。下面我们主要对目标机硬件环境及硬件相关的参数进行配置。

1.ROM和RAM的布局用户可以根据目标机的具体情况对ROM和RAM的空间布局进行配置,配置过程主要是通过修改地址宏定义的值而达到目的,在config.h文件中定义了这些宏,主要有ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADRS、RAM_HIGH_ADRS等,具体配置如下:/*在makefile文件中定义了如下参数。这些参数在config.h中的定义值必须与makefile中定义的值相一致。*/#ifdefBOOTCODE_IN_RAM#defineROM_BASE_ADRS0x00008000/*ROM基地址*/#defineROM_TEXT_ADRS(ROM_BASE_ADRS)/*启动点*/#defineROM_SIZE0x00090000/*ROM空间大小*/#else#defineROM_BASE_ADRS0xfff20000/*ROM基地址*/#defineROM_TEXT_ADRS(ROM_BASE_ADRS)/*EPROM启动点*/#defineROM_SIZE0x0007fe00/*ROM空间大小*/#endif#defineRAM_LOW_ADRS0x00108000/*VxWorks映像入口点*/#defineRAM_HIGH_ADRS0x00008000/*引导映像入口点*/

2.内存配置内存的配置包括用户驻留程序的内存基地址、局部总线内存基地址、内存基地址以及内存大小等,具体配置如下:

/*内存地址*/

/*用户保留内存。读取sysMemTop()*/

#defineUSER_RESERVED_MEM0

/*本地到总线内存地址常量:本地内存地址总是为0;它并非双口内存*/

#defineLOCAL_MEM_LOCAL_ADRS0x00000000 /*目标机本地RAM起始地址*/

#defineLOCAL_MEM_BUS_ADRS0x00000000/*总线本地内存起始地址*/

#defineLOCAL_MEM_SIZE0x00000000/*本地RAM大小为8MB*/

/*当定义这个选项时,支持自动分配内存带大小。在这种情况下系统忽视

LOCAL_MEM_SIZE。相关信息请参考sysyPhysMemTop()函数。*/

#defineLOCAL_MEM_AUTOSIZE

3.启动设备及参数配置启动设备及参数配置主要包含引导参数的配置,即从哪里下载VxWorks映像、系统热启动后从什么设备上启动系统以及与设备相关的其他参数配置等,具体配置如下。

1)默认引导参数设置下面以目标机通过IntelEtherExpressPRO100BPCI接口的网卡,从宿主机“rainbow”上下载VxWorks映像为例进行默认引导参数配置说明。有关该参数的详细说明请参考相关书籍。

#defineDEFAULT_BOOT_LINE“fei(0,0)rainbow:VxWorksh=19e=20u=userpw=usertn=user”

2)热启动设备和参数设置

/*热启动(重新启动)设备和参数*/

#defineSYS_WARM_BIOS0/*从BIOS热启动*/

#defineSYS_WARM_FD1/*从软盘热启动*/

#defineSYS_WARM_ATA2/*从ATA硬盘热启动*/

#defineSYS_WARM_TFFS3/*从片上系统(Diskonchip)热启动*/

#defineSYS_WARM_TYPESYS_WARM_FD/*热启动设备*/

#defineSYS_WARM_FD_DRIVE0/*0=驱动a:,1=b:*/

#defineSYS_WARM_FD_TYPE1/*0=3.2"2HD,1=5.25"2HD*/

#defineSYS_WARM_ATA_CTRL0/*控制器0*/

#defineSYS_WARM_ATA_DRIVE0/*0=c:,1=d:*/

#defineSYS_WARM_TFFS_DRIVE1/*0=c:(DOC)*/

4.外围设备驱动程序及相关参数设置外围设备驱动程序配置和相关参数配置描述了在配置文件中如何配置外围设备,包括软盘驱动器、硬盘、并行端口、时钟、协处理器等驱动程序的配置。其中还包含了一些相关参数的配置,例如设备寄存器基地址、终端级等。具体一些配置如下。

1)配置TrueFFS驱动程序

#undefINCLUDE_TFFS/*包含TrueFFS驱动程序*/

2)配置软盘驱动程序

#defineINCLUDE_FD/*包含软盘驱动程序*/

/*软盘驱动器(FD)相关参数宏定义,见文件pc.h*/

#defineFD_INT_LVL0x06 /*中断号*/

#defineFD_DMA_BUF_ADDR0x2000/*软驱DMA缓冲区地址*/

#defineFD_DMA_BUF_SIZE0x3000/*软驱DMA缓冲区大小*/

3)并行端口驱动程序配置

#defineINCLUDE_LPT /*包含并行端口驱动程序*/

4)时钟配置

/*SYS_CLK_RATE_MAX依赖于CPU的功率,应用程序可以对它进行控制*/

(1)配置辅助时钟。

#defineINCLUDE_AUX_CLK #defineAUX_CLK_RATE_MIN2 /*辅助时钟最小tick数*/ #defineAUX_CLK_RATE_MAX8192 /*辅助时钟最大tick数*/

(2)配置系统时钟。

#defineINCLUDE_SYSCLK_INIT #defineSYS_CLK_RATE_MIN19 /*系统时钟最小tick数*/ #defineSYS_CLK_RATE_MIN(PIT_CLOCK/256)/*系统时钟最大tick数*/ #defineSYS_CLK_RATE60 /*系统时钟tick数*/

(3)配置时间戳。

#undefINCLUDE_TIMESTAMP/*包含时间戳定时器驱动程序,以便提供给WindView*/

(4)时钟相关地址定义。

/*定时器(PIT)*/

#definePIT_BASE_ADR0x40 /*定时器寄存器基地址*/

#definePIT0_INT_LVL0x00 /*中断级*/

#definePIT_REG_ADDR_INTERVAL1

#definePIT_CLOCK1193180 /*定时器频率*/

/*实时时钟(RTC)*/

#defineRTC_INDEX0x70 /*实时时钟控制寄存器地址*/

#defineRTC_DATA0x71 /*实时时钟数据寄存器地址*

#defineRTC_INT_LVL0x08 /*中断级*/

5)硬盘设置通过下面的宏定义可以配置系统支持ATA/IDE接口的硬盘。

#defineINCLUDE_ATA /*包括IDE/EIDE(ATA)接口硬盘驱动程序*/

5.文件系统配置

VxWorks系统中的文件系统是作为设备的驱动程序安装在系统中的,它使用与设备驱动程序相同的标准I/O,但是它又是一个独立的系统。这样的设计使得一个VxWorks应用可以使用多种文件系统而不发生冲突。同时根据这些标准接口协议,用户还可以根据自己的需要编写文件系统,并将文件系统与相关的驱动程序相结合。它包含与MS-DOS系统兼容的文件系统、dosFs文件系统、原始文件系统、rawFslib文件系统、磁盘文件系统、tapeFs文件系统等。配置如下:

#defineINCLUDE_DOSFS/*包含dosFs文件系统*/

#undefINCLUDE_CDROMFS/*包含cdromFs文件系统*/

#defineINCLUDE_TAPEFS/*包含tapeFs文件系统*/

6.网络驱动程序配置在VxWorks网络系统运转中,以太网是其中的一个介质,也是众多厂商所支持的一个局域网规范。它是大多数VxWorks网络应用中的理想选择,但是某些协议除外,比如BOOTP和DHCP,在VxWorks或主机网络系统中它们固有地约束了以太网。至于以太网驱动程序的配置,WindRiver提供了一些厂商的以太网驱动程序,其中包括3COM、AMD、Intel等公司的网卡设备驱动程序,通常以库文件或源代码的形式安装在Tornado目录下,用户通过配置后可以把它们包含到系统中去。

7.高速缓存配置如果硬件配置支持且系统又需要使用高速缓存,则需要对高速缓存进行配置。配置过程及相关要求、注意事项等说明如下:所有的高速缓存首先是关闭的,在BSP的基本功能完成以后,才激活高速缓存。高速缓存打开的步骤是首先打开指令高速缓存,接下来打开数据高速缓存。高速缓存最先处于非探听状态工作下,打开它们以后,如果目标板支持才可以探听。注意:当MMU打开时,通过sysPhysMemDesc[]中的MMU表入口控制高速缓存,而不是通过高速缓存模式宏定义来控制。

8.堆栈配置在BSP的配置过程中,堆栈的配置也是应关心的问题。因为系统需要使用堆栈,而用户有时也需要保留一些堆栈来存放一些重要信息等,所以要对VxWorks系统如何布局堆栈有所了解。8.2.2VxWorks的初始化对于一个确定目标系统的VxWorks,它的初始化按一定的时间顺序进行,但对于不同版本的VxWorks其初始化序列也稍微不同。本节描述了一个典型的应用配置中VxWorks的初始化序列,这些初始化步骤以VxWorks运行为序。为了清晰起见,这个序列分为多个主要阶段或过程调用,关键过程以标题列出,并且以排列顺序进行描述。

1.VxWorks入口sysInit()

VxWorks系统开始运行的第一步是将VxWorks加载到主内存。在VxWorksROM的控制下,通常从开发宿主机下载。下一步,引导ROM将控制权转到VxWorks的启动入口sysInit()。这个入口由在makefile和config.h中的配置参数RAM_LOW_ADRS定义。VxWorks内存规划随不同的目标体系结构而不同。

sysInit()是与系统相关的用汇编语言编写的模块,该过程在文件sysALib.s中。它首先关闭所有中断,禁止高速缓冲存储器,并且将处理器寄存器(包括C堆栈指针)初始化为默认值。同时它也禁止跟踪,清除所有挂起的硬件中断,转而调用usrInit(),该子程序是一段C程序,包含在文件usrConfig.c中。对于某些目标机,sysInit()也完成一些小部分与系统相关的硬件初始化,以便能够执行sysInit()其余的初始化。它使用的初始堆栈指针占用的空间是在VxWorks系统映像的下部,但在中断向量区的上面。

2.初始程序usrInit()在文件usrConfig.c的程序usrInit()中保存引导类型信息,在多任务内核启动前必须完成所有初始化,然后启动内核执行。它是VxWorks运行的第一个C代码,并且是在禁止所有硬件中断下调用的。许多VxWorks服务不能由usrInit()程序调用,因为它没有任务上下文(没有TCB和任务堆栈),这包括能引起可抢占调度的服务,如信号量,或使用该服务的服务,如printf()。相反地,usrInit()需要建立一个初始任务usrRoot(),并启动该任务。

usrInit()中的初始化包括下述内容:高速缓冲存储器初始化,usrInit()的开始初始化高速缓冲存储器,设置高速缓冲存储器的模式并且置为安全状态。在usrRoot()的最后,允许使用指令与数据高速缓冲。系统BSS段初始化为0,C和C++语言指定所有未初始化的变量值为0。这些未初始化的变量被放在称为BSS的段中。该段在引导时实际上是不加载的,usrInit()执行后第一个任务是将含有BSS的内存清为0。在ROM引导VxWorks时清除所有内存。中断向量初始化,在允许中断和执行内核前必须建立异常中断向量。首先,程序intVecBaseSet()被调用来建立向量表基地址;接着,excVecInit()初始化所有异常向量为默认中断处理,以便能安全捕获和处理当程序出错或硬件中断引起的异常情况。将系统硬件初始化为静止状态,系统硬件初始化由调用子程序sysHwinit()完成,这主要包含复位和禁止硬件设备,在内核启动后允许产生中断。这很重要,直到usrRoot()任务完成系统初始化,VxWorksISRs的中断服务程序还没有连接到中断向量。但是,不要试图在sysHwint()过程中连接中断向量,因为此时存储池仍未初始化。

3.初始化内核

usrInit()程序以调用两个内核初始化函数宣告结束,这两个函数为:

usrKernelInit()程序(在文件usrKernel.c中),用于调用适当的初始化子程序。

kernelInit()程序,用于初始化多任务环境中,并且永远不返回,它需要以下参数:被生成的作为根任务的应用程序,典型的为usrRoot()。

(1)堆栈的大小。

(2)开始使用的内存地址。也就是说,在VxWorks映像的主程序区、数据、BSS之后。在该区域之后的所有内存都加到系统存储池,由memPartLib管理。用于分配下载的动态模块、任务控制块等,都出自该区域。

(3)由sysMemTop()指出的内存高端地址。

(4)中断堆栈大小。

(5)中断级。

kernelInit()调用intLockLevelSet(),禁止轮询模式,建立中断堆栈;然后在存储池的高端创建根任务的堆栈和TCB,启动根任务usrRoot();usrInit()运行结束后,允许中断;禁止所有中断源和清除挂起的中断,这一点非常关键。初始化存储池,VxWorks包括一个在memPartLib模块中的内存分配工具,用于管理可用的存储器池。malloc()函数允许从存储池中申请获得可变大小的内存块。在内部,VxWorks使用malloc()动态分配内存,尤其许多VxWorks服务在初始化时使用它分配数据结构。因此,存储池初始化必须在其他任何VxWorks服务的初始化之前进行。注意,Tomado目标服务器使用和管理一部分存储器,用来支持目标模块下载和开发其他功能。

VxWorks大量使用malloc(),包括下载模块分配的空间,任务启动堆栈的分配,初始化分配的数据结构。同时使用malloc()来分配任何应用系统所需的内存。除非必须为特殊用途保留一些绝对的存储器区域外,建议将所有未使用的内存部分配到VxWorks的存储池。存储池在程序kernelInit()中进行初始化。kernelInit()的参数指明了初始化存储池的开始和结束地址。VxWorks采用usrInit()的默认分配,存储池开始地址被设置为引导系统结束之后的部分,并且包含了所有剩余可用的存储器。可用存储器的范围由程序sysMemTop()决定,这是一个系统相关的程序,它定义可用存储器的大小。如果系统还有其他不连续的存储区域,一般地,可以在usrRoot()任务之后调用memAddToPool()并将它们加到系统存储池,以便使用。

4.初始化任务usrRoot()当多任务内核开始执行时,所有VxWorks多任务服务是可用的。在控制权转到任务usrRoot()后,完成系统的初始化。主要初始化有:

(1)系统时钟的初始化。

(2) I/O系统和设备驱动的初始化。①控制台设备的创建。②标准输入/输出的设置。③异常出路与登录的安装。④管道设备驱动的初始化。⑤标准I/O的初始化。⑥文件系统设备和磁盘驱动安装的创建。⑦浮点运算支持的初始化。⑧性能监视服务的初始化。

(3)可选服务的初始化。①WindView的初始化。②目标调试机构的初始化。③用户提供的启动脚本的初始化。参见文件config/all/usrConfig.c,并回顾usrRoot()完成的初始化序列,可以根据自己的目标系统修改这些初始化。关于初始化的每一步含义和各种参数的意义将在以下的部分详细介绍。

(4)系统时钟的初始化。在任务usrRoot()中的第一个动作是初始化VxWorks时钟,通过调用sysClkConnect()将系统时钟中断向量与中断处理程序usrClock()建立连接。而后,系统时钟的频率(通常为60Hz)由sysClkRateSet()设置。大多数的目标板允许时钟频率小于30Hz(有些甚至小于1Hz)或大于几千赫兹。但通常不希望使用高于1000Hz的时钟频率,因为这样会加重系统的额外开销。当时钟频率太快时,处理器要花费很多时间来处理中断,且应用程序因抢不到CPU而得不到运行。定时器驱动程序由WRS公司提供,包括一个sysHwInit2()调用,它是sysClkConnect()的一部分。BSP使用sysHwInit2()完成对目标板的进一步初始化,而这些初始化在函数sysHwinit()中没有完成。

(5) I/O系统的初始化。如果在configAll.h中定义了INCLUDE_IO_SYSTEM,那么可通过调用iosIni()程序进行VxWorks的I/O系统初始化。调用参数指明了安装设备驱动的最大数目,在系统中能够同时打开的最大文件数目,在VxWorks的I/O系统中所希望的设备名称。包含与不包含INCLUDE_IO_SYSTEM也会影响是否创建控制台设备、标准输入、标准输出、标准错误的建立。

(6)控制台设备的创建。如果在配置中包括了INCLUDE_TTY_DEV板上串口设备驱动,就可以通过函数ttyDrv()调用初始化时安装在系统中的I/O设备驱动程序。实际设备的建立与命名是通过设备创建程序来完成的,典型调用为ttyDevCreate()。这个程序的调用参数包括设备名,一个串行I/O通道的描述,输入/输出缓冲区的大小。宏NUM_TTY指定了TTY端口的数目(默认是2),CONSOLE_TTY指定了控制台的端口(默认为0),CONSOLE_BAUD_RATE指定了波特率(默认为9600)。这些宏在文件configAll.h中定义,但是对于非标准端口的目标板可以在config.h文件中重写。

(7)标准输入、输出、错误的设置。这些功能的分配是由操作控制台和调用ioGlobalStdSet()来建立的。这是VxWorks作为默认设备用来与应用开发系统进行通信,并将控制台作为一个交互式中断,通过设置选项OPT_TERMINAL和调用ioctl()进行设置。

(8)异常处理与登录安装。

VxWorks的异常处理服务(由模块excLib提供)和登录服务(由logLib提供)的初始化早在根任务执行前已进行。它们检查根任务本身或者各种服务在初始化过程中的程序错误。当INCLUDE_EXC_HANDLING和INCLUDE_EXC_TAS在配置文件中定义后,异常处理通过调用excInit()进行初始化。excInit()函数启动异常支持任务exctask()。初始化之后,由硬件异常造成的程序错误能被安全地捕获和报告,此外没有被初始化的硬件中断向量也能进行处理。VxWorks通过发信号量来使用指定的一场处理任务,该信号量由sigInit()完成初始化,当然必须定义INCLUDE_SIGNALS选项。当INCLUDE_LOGGING被定义后,登录服务调用logInit()进行初始化。参数指定了登录信息写入的设备文件描述符及非匹配登录信息缓冲区的个数。登录初始化过程也包括启动一个登录任务logTask()。

(9)管道设备驱动的初始化。如果希望有一个命名的管道,那么可在文件configAll.h中定义INCLUDE_PIPE选项,管道驱动程序pipeDrv()自动被调用,进而进行初始化管道服务。管道必须用pipeDevCreate()来创建,而后,任务就能够使用管道相互通信。

(10)文件系统设备驱动的创建和设备驱动器程序的初始化。许多VxWorks配置至少包括一个磁盘或RAM盘,采用dosFs、rtllFs或rawFs文件系统。首先磁盘驱动程序通过调用驱动初始化程序进行安装;其次设备创建程序并定义一个设备,这个调用返回指向描述该设备的数据结构BLK_DEV。然后,新的设备能够通过调用系统设备初始化程序(osFsDevInit(),rtllFsDevInit(),rawFsDevInit())进行初始化和命名,各种文件格式由INCLUDE_DOSFS、INCLUDE_RTLLFS和INCLUDE_RAWFS定义(在设备初始化前,文件系统模块应先采用osFsDevInit()、rtllFsDevInit()、rawFsDevInit()进行初始化)。文件系统设备初始化参数与特殊的文件系统相关,包括设备名、一个指向由设备创建程序建立的数据结构BLK_DEV,还有一些特定的文件系统配置参数。

(11)浮点支持的初始化。在文件configAll.h中定义NCLUDE_FLOATING_POINT后,浮点I/O由调用floatInit()进行初始化,当包含INCLUDE_HW_FP时,支持浮点的协处理器由调用mathHardInit()进行初始化。

(12)网络初始化。在使用网络之前,必须使用usrNetInit()进行初始化。当一个头文件中包含INCLUDE_NET_INIT时,usrRoot()将调用该函数(usrNetInit()的源程序在src/config/usrNetwork.c文件中)并以配置字符行为参数。配置字符行通常称为引导行,它在VxWorks的ROM引导系统中指定。基于这个字符行,usrNetInit()执行以下网络初始化:①调用程序netLibInit()初始化网络子系统。②连接和配置适当的网络驱动程序。③添加网关通道。④初始化远程文件存取驱动程序netDrv,并添加远程文件存取设备。⑤初始化远程登录工具。⑥可选择的初始化远程调用服务(RPC)。⑦可选择的初始化网络文件系统服务(NFS)。

(13)可选择产品与其他服务的初始化。共享存储器由可选产品VxMP提供,在使用共享存储器的目标之前,必须使用程序usrSmObjInit()(在文件src/config/usrSmObj.c中)对它们进行初始化,如果包括了INCLUDE_SM_OBJ,则由usrRoot()调用;如果选项INCLUDE_MMU_BASIC已被定义,则初始化程序保护和向量表保护。

Tornado移植了GNUC++编译器,对于GNU编译器或可选的CenterLine编译器,要初始化以支持C++,由INCLUDE_CPLUS或INCLUDE_CPLUS_MIN定义。若要包括一个或更多类库,则定义适当的选项INCLUDE_CPLUS_library。

(14) WindView的初始化。内核分析器由可选的WindView提供,当在文件configAll.h中定义INCLUDE_INSTRUMENTATION时,由程序usrRoot()初始化。

(15)目标机调试机构的初始化。如果定义了INCLUDE_WDB,则文件src/config/usrWdb.c中的wdbConfig()可被调用。改变程序初始化通信接口,然后运行调试机构,以配置调试机构的信息及其初始化序列。

(16)启动脚本的执行。如果将驻留目标系统的命令解释程序配置到VxWorks中,usrRoot()函数运行用户提供的脚本,定义宏INCLUDE_STSRTUP_SCRIPT和启动脚本的参数,脚本的文件名在引导时指定,如果没有参数,则脚本不被执行。

5.初始化序列总结典型配置的VxWorks整个实时系统初始化包括以下几个方面:

(1)系统初始化函数sysInit(),该函数在文件sysALib.s中,包含:①关闭所有中断。②禁止高速缓冲存储器。③初始化系统的中断表。④初始化系统默认的表。⑤初始化CPU寄存器为已知默认值。⑥禁止跟踪。 ⑦清除所有未处理的中断。⑧用指定的引导类型调用usrInit()函数。

(2) usrInit(),该函数在文件usrcongfig.c中,包含:①将bss未初始化的段清0。②将引导类型保存到sysStartType中。③调用异常向量初始化函数excVecInit(),初始化所有系统和默认的中断向量。④调用系统的硬件设备初始化函数sysHwinit()。⑤调用核心库初始化函数usrKernelInit()。⑥调用内核初始化函数kernelInit()。

(3) usrKernelInit(),该函数在文件usrkernel.c中,如果定义了相应的配置,则调用以下的子程序:①classLibInit()。②taskLibInit()。③taskHookInit()。④semBLibInit()。⑤semMLibInit()。⑥semCLibInit()。⑦semOLibInit()。⑧wdLibInit()。

(4) kerneInit()初始化并启动内核:①调用intLockLevelSet()。②在存储池高端创建根任务和任务控制块TCB。③调用任务初始化函数taskInit()。④调用任务激活函数taskActivate()。⑤转到函数usrRoot()。

(5) usrRoot()初始化I/O系统,安装设备的驱动,根据配置文件configAll.h和config.h中的配置创建指定的设备。①调用函数sysClkConnect(),建立系统时钟中断处理。②调用函数sysClkRateSet(),初始化系统时钟频率。③调用函数iosInit(),初始化I/O设备控制块。④如果在配置中定义了INCLUDE_TTY_DEV和NUM_TTY,则可调用函数ttyDrv()。建立控制台标准输入、标谁输出、标准错误接口:STD_IN、STD_OUT、STD_ERR。⑤初始化异常处理,调用函数excInit()、logInit()、sigInit()。⑥调用函数pipeDrv()初始化管道设备。⑦标谁I/O库初始化函数stdioinit()。⑧初始化数学函数库,初始化软件仿真函数mathSoftInit()或硬件支持函数mathHardInit()。⑨调用函数wdconfig()进行配置并初始化目标机调试器。⑩如果配置了驻留目标机的命令解释,则启动该脚本。

(6)初始化应该注意的问题。首先,应该避免在romInit.s中进行过多的初始化操作。该文件中只是进行必要的最小硬件初始化,大部分硬件的初始化都是在sysHwinit()中完成的。另外,romInit.s中的代码不应当被其他模块或函数调用。其次,应该避免sysAlib.s中的工作太少。BSP开发人员通常错误地认为在romInit.s里初始化过的设备不需要在sysAlib.s中重新初始化。实际上,VxWorks映像并不认为它是由引导映像程序引导的,因此,它必须重新设置和初始化所有它自己需要使用的设备。sysInit()是该文件中最主要的一个函数,也是第一个函数。该例程中很多工作与romInit()是相同的,目的是保证内核映像在运行与冷启动时,软硬件环境高度一致。8.3BSP的开发要求及开发过程8.3.1开发要求

BSP的开发包含很多模块,当许多人共同设计一个由许多模块组成的系统时,不同时间内会出现不同的版本,不同的人会有不同的编程风格及文档

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论