VxWorks启动过程描述.docx
- 文档编号:7095839
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:20
- 大小:187.94KB
VxWorks启动过程描述.docx
《VxWorks启动过程描述.docx》由会员分享,可在线阅读,更多相关《VxWorks启动过程描述.docx(20页珍藏版)》请在冰豆网上搜索。
VxWorks启动过程描述
VxWorks启动过程描述及主要宏开关含义
1三种不同的VxWorks映象比较
VxWorks是一种灵活的、可裁剪的嵌入式实时操作系统。
用户可以根据需要创建自己的VxWorks映象,由它来引导目标系统,而后下载并运行应用程序。
根据应用场合的不同,VxWorks映象可分为三类:
可加载的VxWorks映象、基于ROM的VxWorks映象和驻留ROM的VxWorks映象。
1.1可加载的VxWorks映象
这是一种运行于RAM的VxWorks映象。
它不包含搬移程序,需要借助于一些外部的程序如bootRom才能加载到RAM的低端RAM_LOW_ADRS地址处。
这是缺省的开发映象。
在开发的初期阶段,用户可以根据需要添加或删除一些VxWorks组件,生成自己的可加载的VxWorks映象,存放在开发主机的某个目录下。
目标板上电后,由烧结在BOOT中的起始引导程序(BootStrapPrograms)将BOOT中的ROM引导程序(ROMBootPrograms)拷贝到RAM的高端地址RAM_HIGH_ADRS处,并跳转至该地址执行ROM引导程序,配置好所选的加载方式(缺省为网络方式),将指定的主机目录下的可加载的VxWorks映象下载到目标板的RAM地址RAM_LOW_ADRS处,并跳转到此处执行。
如图1所示。
这种映象的优点是生成的VxWorks映象可以存放在开发主机PC机上,不用烧到BOOT中,节省了BOOT容量,也便于随时修改不同的VxWorks映象,适用于调试的初期阶段。
不足之处是需要在主机上维护一个正确的VxWorks映象,对于调试硬件无关的上层应用程序显得不是很方便。
在Tornado工作台的Build窗口中,选择Rules属性页中的VxWorks即可生成可加载的VxWorks映象。
1.2基于ROM的VxWorks映象
这是一种运行于RAM中,但起初存放于ROM中的VxWorks映象。
即该映象需要和搬移程序一起固化在BOOT中。
目标板上电后,首先运行BOOT中的引导搬移程序,将整个VxWorks映象拷贝到RAM地址RAM_LOW_ADRS处,并跳转到此处执行。
如图2所示。
该映象根据是否被压缩又可分为:
●基于ROM的未压缩的VxWorks映象,可直接从ROM拷贝到RAM中
●基于ROM的压缩的VxWorks映象,这种映象主要是为了节约BOOT空间,在从ROM拷贝到RAM的过程中需要解压缩,因此与上述未压缩的映象相比,它的引导过程相对较慢,但两者在RAM中的运行速度是一样的。
1.3驻留ROM的VxWorks映象
这种映象起初也和搬移程序一起固化在BOOT中。
目标板上电后,首先运行BOOT中的引导搬移程序,但仅将VxWorks映象的数据段和BSS段拷贝到RAM地址RAM_LOW_ADRS处,映象的代码段仍旧留在ROM中,从ROM中开始执行。
如图3所示。
这种映象的优点是具有最快的引导速度,占用最少的RAM空间,适用于RAM空间有限的目标板。
但是由于该映象在ROM中运行,运行速度在三种映象中是最慢的。
2几种不同的BOOTROM的比较
针对上述三种不同的VxWorks映象,可以生成以下几种不同的BOOTROM,主要体现在执行搬移程序romStart()(位于bootInit.c文件中)时不同:
2.1用于可加载VxWorks映象的BOOTROM
由图1所示可知,用于可加载VxWorks映象的BOOTROM包含两部分:
起始引导程序(BootStrapPrograms)和ROM引导程序(ROMBootPrograms)。
起始引导程序驻留在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|BuildBootROM…可以选择生成以上
三种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引导程序数据段的起始位置。
2.2用于基于ROM的VxWorks映象的BOOTROM
由图2所示可知,用于该映象的BOOTROM包含两部分:
起始引导程序(BootStrapPrograms)和基于ROM的VxWorks映象。
搬移程序bootInit.c负责将VxWorks映象的文本段和数据段搬移到用户定义的低端内存地址RAM_LOW_ADRS,如果需要进行必要的解压缩,然后直接启动VxWorks映像。
因此BOOTROM的容量相对于2.1中描述的BOOTROM要大一些,但无需在主机目录下维护一个可用的VxWorks映象。
基于ROM的VxWorksBOOTROM有压缩和未压缩之分。
在Tornado工作台的Build窗口中,选择VxWorks映象Rules属性页中的VxWorks_rom即可生成基于ROM的未压缩的VxWorksBOOTROM,选中VxWorks_romCompress即可生成基于ROM的压缩的VxWorksBOOTROM。
2.3用于驻留ROM的VxWorks映象的BOOTROM
由图3所示可知,用于该映象的BOOTROM包含两部分:
起始引导程序(BootStrapPrograms)和驻留ROM的VxWorks映象,VxWorks系统文本段驻留在ROM,搬移程序bootInit.c负责将数据段和bss段搬移到用户定义的低端内存地址RAM_LOW_ADRS,直接启动VxWorks映像(含符号表)。
此时,RAM_LOW_ADRS是VxWorks映象的加载点,它也是VxWorks数据段的起始点。
在Tornado工作台的Build窗口中,选择VxWorks映象Rules属性页中的VxWorks_romResident即可生成驻留ROM的VxWorksBOOTROM。
3VxWorks的启动过程
根据上述所采用的BOOTROM的不同,VxWorks的启动过程会有所不同。
3.1使用可加载VxWorks映象的启动过程
此时,从目标板上点复位到启动用户定义的任务的整个流程如下:
此时,从目标板上电复位到启动用户定义的任务的整个流程如下:
3.1.1BOOTROM的启动过程
1、目标板加电之后,程序指针指向RESET中断程序入口处,开始执行初始化程序romInit.s,设置机器状态字及其它硬件相关寄存器,关闭中断,禁止程序和数据CACHE,初始化内存,并设置堆栈指针,保存启动类型,调用romStart()。
2、程序跳到第一个C程序bootInit.c的函数romStart()入口地址,根据堆栈中的参数决定是否清零内存RAM(如是冷启动(coldstart)则清零),根据不同的bootrom文件,把ROM中数据段和文本段拷贝到RAM(如果ROM代码是压缩的,还要解压);
3、程序跳到RAM入口地址(文件bootConfig.c中函数usrInit()),根据用户配置来设置cache的工作模式,清零bss段,初始化异常处理程序,进行板级硬件初始化sysHwInit()。
4、启动多任务内核KernelInit(),执行usrRoot任务。
在该任务中初始化串口,创建console终端设备。
创建bootCmdLoop任务,根据单板设计选择不同方式加载VxWorks映像文件,如通过串口、网口、硬盘等方式。
3.1.2VxWorks映象的启动过程
VxWorks进入点sysInit()
启动VxWorks系统的第一步就是将系统映象加载到主内存。
这通常是在VxWorksbootRom的控制下,从开发主机上下载。
接着,bootRom将控制权交给VxWorks的起始进入点:
sysInit()。
在makefile和config.h文件里,已将这个进入点设置成位于地址RAM_LOW_ADRS。
函数sysInit()位于系统特定的汇编语言模块sysALib.s中。
它可以锁住中断,关闭cache(如果使用了话),初始化处理器的寄存器(包括C堆栈指针)至缺省值。
它还会关闭跟踪,清除所有未决的中断,并调用一个位于usrConfig.c模块的C语言子程序:
usrInit()。
对于某些目标板,sysInit()还执行一些必要的与系统有关的硬件初始化,以便在usrInit()中执行完剩余的初始化内容。
仅供usrInit()使用的初始堆栈指针,被设置成位于系统映象(RAM_LOW_ADRS)以下,向量表以上的位置。
初始化代码usrInit()
函数usrInit()(位于usrConfig.c中),储存有关引导类型的信息,处理在内核启动之前必须执行的初始化,而后启动内核执行。
它是运行于VxWorks内的第一个C函数。
此时,所有的中断都已被锁住。
许多VxWorks工具在usrInit()中都不能使用。
这是因为此时还没有任务的上下文(没有TCB和任务堆栈),那些需要任务上下文的工具无法被调用。
函数usrInit()仅做一些创建初始化任务usrRoot()所必须的工作。
然后由usrRoot()完成启动过程。
usrInit()中的初始化过程如下所述:
Cache初始化
usrInit()的起始代码初始化cache,设置cache模式,并将cache放置在一个安全的位置。
在usrInit()结束时,缺省情况下,指令cache和数据cache被使能。
对系统的BSS段清零
C和C++语言规定所有未初始化的变量缺省的初始值为零。
这些未初始化的变量被放置在一个称为bss的段内。
由于usrInit()是系统执行的第一个C代码,在它的一开始对包含bss段的内存清零。
VxWorks的bootROM也会清内存,但VxWorks映象假设没有采用bootROM,仍然执行清内存的操作。
初始化中断向量
异常向量必须在使能中断和启动内核之前建立。
首先,调用intVecBaseSet()建立向量表基地址。
而后,调用excVecInit()初始化所有的异常向量至缺省句柄,以便安全地捕获和报告由程序错误或意外的硬件中断导致的异常。
初始化硬件至静止状态
通过调用系统相关函数sysHwInit()初始化系统硬件。
该函数复位并关闭那些在中断使能(内核启动时)以后可能产生中断的硬件设备。
这一点很重要,因为VxWorksISRs(用于I/O设备,系统时钟等)直到在任务usrRoot()中完成系统初始化以后,才被连接到它们的中断向量上。
不要在sysHwInit()调用中试图为一个中断连接一个中断句柄(也就是不能使用intConnect()),因为此时内存池还没有初始化。
初始化内核
函数usrInit()结束时调用了两个内核初始化函数:
usrKernelInit()(在usrKernel.c中定义)为每个指定的可选内核组件调用合适的初始化代码。
详见表1。
kernelInit()(kernelLib.c的一部分)初始化多任务环境,不用返回。
函数参数包括:
●用以产生作为根任务的应用程序,典型的为usrRoot()
●使用的堆栈大小
●可用的起始内存地址,一般位于VxWorks映象的代码段,数据段和bss段之后,如果包含可选的主机内存池,则还要加上WDB_POOL_SIZE。
●由sysMemTop()定义的内存顶部
●中断堆栈的大小
●中断封锁级别
kernelInit()调用intLockLevelSet(),关闭循环模式,创建一个中断堆栈(如果结构支
持的话)。
然后从内存池的顶部创建一个根堆栈和TCB,创建一个根任务,usrRoot,并终止usrInit()线程的执行。
此时使能中断,所有的中断源已被关闭,未决中断已被清除。
初始化内存池
内存池的初始化是由kernelInit()来完成的。
kernelInit()的参数指定了初始内存池的起始和终止地址。
在缺省的usrInit()中,将内存池设置在紧接于引导的系统映象之后,并包含所有剩余的可用内存。
可用内存的大小由sysMemTop()决定。
如果你的系统有其它的不连续的内存片,你可以在usrRoot()任务中通过调用memAddToPool()将它们包含进通用的内存池。
VxWorks包含了一个位于memPartLib模块中的内存分配工具,它管理一个可用内存池。
用户可以调用malloc()函数从内存池中获得可变大小的内存块。
VxWorks也利用malloc()函数来动态分配内存。
许多VxWorks工具在初始化过程中需要分配数据结构。
因此,内存池必须在任何其他的VxWorks工具初始化之前初始化。
Tornado目标服务器也管理一部分目标内存以支持目标模块的下载和其他开发功能。
VxWorks使用malloc()函数为已下载的模块分配空间,为已产生的任务分配堆栈,在初始化时分配数据结构。
用户也可以使用malloc()函数为自己的应用程序分配所需的内存空间。
因此,推荐将所有的未用内存分配给VxWorks内存池,除非必须为一个特殊的应用保留一片固定的绝对内存。
初始任务usrRoot()
当多任务内核启动执行以后,所有的VxWorks多任务工具就可以用了。
控制权被传送至usrRoot()任务,并完成初始化系统。
usrRoot()执行以下操作:
●初始化系统时钟
●初始化I/O系统和驱动
●创建控制台设备
●设置标准输入和标准输出
●安装异常处理和登陆
●初始化管道驱动器
●初始化标准I/O
●创建文件系统设备并安装磁盘驱动器
●初始化浮点支持
●初始化性能监视工具
●初始化网络
●初始化可选的工具
●初始化WindView
●初始化目标代理
●执行一个用户提供的启动脚本
●初始化VxWorksShell
下面对各个步骤进行详尽的描述:
初始化系统时钟
usrRoot()任务执行的第一个操作就是初始化VxWorks时钟。
通过调用sysClkConnect()
将系统时钟的中断向量连接到usrClock()函数上。
调用sysClkRateSet()将系统时钟率设置为60Hz。
sysClkConnect()函数调用sysHwInit2()。
风河的BSP采用sysHwInit2()执行在sysHwInit()中未完成的进一步的板级初始化。
例如,可以利用intConnect()连接ISR,因为此时已经分配了内存,系统处于多任务环境。
初始化I/O系统
如果在configAll.h中定义了INCLUDE_IO_SYSTEM,就可以调用iosInit()函数初始化VxWorks的I/O系统。
该函数的参数指定了可被顺序安装的最大驱动器的数目,可以在系统中同时打开的最大文件数目,和VxWorks的I/O系统包含的“空”设备的名字。
包含或去除INCLUDE_IO_SYSTEM还会影响是否创建控制台设备,是否设置标准的输入、输出和标准的出错信息。
创建控制台设备
如果包含了板上串口驱动器(定义了INCLUDE_TTY_DEV),就可以通过调用驱动器的初始化函数(典型的是ttyDrv())将它安装进I/O系统。
实际的设备是通过调用驱动器的设备创建函数(典型的是ttyDevCreate())来创建和命名的。
这个函数的参数包括设备名称,一个串行I/O通道描述字(从BSP获得),和输入输出缓存大小。
宏NUM_TTY定义了tty口的数量(缺省是2)。
宏CONSOLE_TTY指定了哪个口作为控制台口(缺省是0),宏CONSOLE_BAUD_RATE指定了其比特率(缺省是9600bps)。
这些宏都在configAll.h中定义,但对于那些具有非标口数的单板可以在config.h中对它们进行重新定义。
设置标准输入、标准输出和标准出错信息
系统级的标准输入、标准输出和标准错误信息的配置是通过打开控制台设备并调用ioGlobalStdSet()来建立的。
这些配置作为VxWorks的缺省设备用于与应用开发人员通讯。
为了使控制台设备成为一个交互式的终端,调用ioctl()将设备选项设为OPT_TERMINAL。
安装异常处理和登录
初始化VxWorks的异常处理工具(由excLib模块提供)和登录工具(由logLib库提供)。
这些工具检查在根任务内部或者初始化各种工具时产生的程序错误。
当定义了宏INCLUDE_EXC_HANDLING和INCLUDE_EXC_TASK后,调用excInit()初始化异常处理工具。
excInit()函数产生一个异常支持任务excTask()。
初始化以后,可以安全地捕获和报告导致硬件异常的程序错误,报告并解除没有初始化向量的中断。
当定义了INCLUDE_SIGNALS后,调用sigInit()初始化VxWorks的信号工具,该工具用于任务的异常处理。
当定义了INCLUDE_LOGGING宏以后,调用logInit()初始化登录工具。
其参数定义了显示登录信息的设备的文件描述字,和分配的登录信息缓存数。
登录初始化还创建了一个登录任务logTask()。
初始化管道驱动
如果需要所谓的管道,在configAll.h中定义INCLUDE_PIPE,就会自动地调用pipeDrv()初始化管道。
而后任务就可以利用管道通过标准的I/O接口互相通讯了。
管道必须由pipeDevCreate()函数创建。
初始化标准I/O
当定义了宏INCLUDE_STDIO以后,VxWorks就会包含一个可选的标准I/O包。
创建文件系统设备并初始化设备驱动
许多VxWorks配置至少包含一个磁盘驱动器,或带有dosFs/rt11Fs/rawFs文件系统的RAM磁盘。
首先,通过调用驱动器的初始化代码安装一个磁盘驱动器。
而后,驱动器的设备创建代码会定义一个设备。
这个调用会返回一个指向描述设备的BLK_DEV结构的指针。
然后就可以调用文件系统的设备初始化代码-dosFsDevInit(),rt11FsDevInit(),orrawFsDevInit()(如果定义了宏INCLUDE_DOSFS,INCLUDE_RT11FS和INCLUDE_RAWFS)初始化和命名设备。
在初始化一个设备之前,必须用dosFsInit(),rt11FsInit()或rawFsInit()初始化文件系统模块。
文件系统的设备初始化函数的参数取决于特定的文件系统,但典型的包括设备名称,由驱动器的设备创建代码产生的一个指向BLK_DEV结构的指针,可能还有一些文件系统特定的配置参数。
初始化浮点支持
如果在configAll.h中包含了INCLUDE_FLOATING_POINT宏定义,则调用floatInit()函数初始化浮点I/O支持。
当定义了INCLUDE_HW_FP,调用mathHardInit()初始化对浮点协处理器的支持。
当定义了INCLUDE_SW_FP,调用mathSoftInit()初始化对软件浮点仿真的支持。
包含性能仿真
VxWorks具有两个内嵌的性能监视工具。
一个由spyLib提供的任务活动综述,一个由timexLib提供的子程序执行定时器。
如果在configAll.h中定义了宏INCLUDE_SPY和INCLUDE_TIMEX,就会包含这些工具。
初始化网络
如果配置头文件中定义了INCLUDE_NET_INIT,usrRoot()就会调用usrNetInit()函数初始化网络(usrNetInit()的源代码位于installDir/target/src/config/usrNetwork.c)。
usrNetInit()函数使用了一个配置字符串作为它的参数。
这个配置字符串通常是一条“引导行”,用于VxWorks的bootROM引导系统。
根据这个字符串,usrNetInit()函数执行以下操作:
●调用netLibInit()初始化网络子系统
●连接并配置合适的网络驱动器
●添加网关路由
●初始化远程文件存取驱动器netDrv,并添加一个远程文件存取设备
●初始化远程登录工具
●可选地初始化远端程序调用(RPC)
●可选地初始化网络文件系统(NFS)工具
如前所述,是否包含这些网络工具由configAll.h中的宏定义决定。
初始化可选产品和其它组件
可选产品VxMP可提供共享内存目标。
如果定义了宏INCLUDE_SM_OBJ,usrRoot()
就会调用usrSmObjInit()函数(源代码位于installDir/target/src/config/usrSmObj.c),初始化共享内存目标。
共享内存目标库需要VxWorks引导行中的域值。
这些函数包含在usrNetwork.c文件中。
如果不包含网络服务,usrNetwork.c就不会被包含,共享内存初始化就会失败。
工程工具计算所有的依存关系,但如果使用手工配置,可以将INCLUDE_NETWORK添加进configAll.h,或是从usrNetwork.c文件中将引导行代码提取出来放置到其他地方。
如果定义了INCLUDE_MMU_BASIC,就可以提供基本的MMU支持。
如果定义了INCLUDE_MMU_FULL,可选产品VxVMI就可以提供代码保护,向量表保护和一个虚拟内存接口。
MMU由函数usrMmuInit()初始化,该函数位于installDir/target/src/config/usrMmuInit.c文件中。
如果还定义了宏INCLUDE_PROTECT_TEXT和INCLUDE_PROTECT_VEC_TABLE,就会初始化代码保护和向量表保护。
初始化WindView
可选产品WindView可提供内核测试工具。
如果在configAll.h中定义了宏INCLUDE_WINDVIEW,就可以在usrRoot()中调用windviewConfig()初始化WindView。
其它的WindView常量控制特定的初始化步骤。
初始化目标代理
如果定义了INCLUDE_WDB,调用函数wdbCo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VxWorks 启动 过程 描述