ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:158.88KB ,
资源ID:11057108      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11057108.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VxWorks启动过程描述.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VxWorks启动过程描述.docx

1、VxWorks启动过程描述VxWorks启动过程描述及主要宏开关含义1 三种不同的VxWorks映象比较VxWorks是一种灵活的、可裁剪的嵌入式实时操作系统。用户可以根据需要创建自己的VxWorks映象,由它来引导目标系统,而后下载并运行应用程序。根据应用场合的不同,VxWorks映象可分为三类:可加载的VxWorks映象、基于ROM的VxWorks映象和驻留ROM的VxWorks映象。1.1 可加载的VxWorks映象这是一种运行于RAM的VxWorks映象。它不包含搬移程序,需要借助于一些外部的程序如bootRom才能加载到RAM的低端RAM_LOW_ADRS地址处。这是缺省的开发映象。

2、在开发的初期阶段,用户可以根据需要添加或删除一些VxWorks组件,生成自己的可加载的VxWorks映象,存放在开发主机的某个目录下。目标板上电后,由烧结在BOOT中的起始引导程序(BootStrap Programs)将BOOT中的ROM引导程序(ROM Boot Programs)拷贝到RAM的高端地址RAM_HIGH_ADRS处,并跳转至该地址执行ROM引导程序,配置好所选的加载方式(缺省为网络方式),将指定的主机目录下的可加载的VxWorks映象下载到目标板的RAM地址RAM_LOW_ADRS处,并跳转到此处执行。如图1所示。图1、可加载的VxWorks映象这种映象的优点是生成的VxW

3、orks映象可以存放在开发主机PC机上,不用烧到BOOT中,节省了BOOT容量,也便于随时修改不同的VxWorks映象,适用于调试的初期阶段。不足之处是需要在主机上维护一个正确的VxWorks映象,对于调试硬件无关的上层应用程序显得不是很方便。 在Tornado工作台的Build窗口中,选择Rules属性页中的VxWorks即可生成可加载的VxWorks映象。1.2 基于ROM的VxWorks映象这是一种运行于RAM中,但起初存放于ROM中的VxWorks映象。即该映象需要和搬移程序一起固化在BOOT中。目标板上电后,首先运行BOOT中的引导搬移程序,将整个VxWorks映象拷贝到RAM地址R

4、AM_LOW_ADRS处,并跳转到此处执行。如图2所示。图2 基于ROM的VxWorks映象该映象根据是否被压缩又可分为: 基于ROM的未压缩的VxWorks映象,可直接从ROM拷贝到RAM中 基于ROM的压缩的VxWorks映象,这种映象主要是为了节约BOOT空间,在从ROM拷贝到RAM的过程中需要解压缩,因此与上述未压缩的映象相比,它的引导过程相对较慢,但两者在RAM中的运行速度是一样的。1.3 驻留ROM的VxWorks映象这种映象起初也和搬移程序一起固化在BOOT中。目标板上电后,首先运行BOOT中的引导搬移程序,但仅将VxWorks映象的数据段和BSS段拷贝到RAM地址RAM_LOW

5、_ADRS处,映象的代码段仍旧留在ROM中,从ROM中开始执行。如图3所示。这种映象的优点是具有最快的引导速度,占用最少的RAM空间,适用于RAM空间有限的目标板。但是由于该映象在ROM中运行,运行速度在三种映象中是最慢的。图3 驻留ROM的VxWorks映象2 几种不同的BOOTROM的比较针对上述三种不同的VxWorks映象,可以生成以下几种不同的BOOTROM,主要体现在执行搬移程序romStart( )( 位于bootInit.c文件中)时不同:2.1 用于可加载VxWorks映象的BOOTROM由图1所示可知,用于可加载VxWorks映象的BOOTROM包含两部分:起始引导程序(Bo

6、otStrap Programs)和ROM引导程序(ROM Boot Programs)。起始引导程序驻留在ROM中,主要包含: 汇编级的硬件初始化程序romInit.s,用于系统的基本初始化,设置一些重要寄存器的初始值,进行存储器的映射 搬移程序bootInit.c,将ROM引导程序拷贝至RAM的高端地址RAM_HIGH_ADRS,然后跳转到此处执行ROM引导程序。ROM引导程序起初存放在ROM中,初始化时被拷贝到RAM中,主要用于系统的进一步初始化,并配置加载方式,将VxWorks映象加载至RAM。可分为三种不同的类型: 压缩的ROM引导程序,在拷贝的过程中需要解压缩,在RAM中执行 未压

7、缩的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开始)可以重新被系

8、统利用。图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包含两部分:起始引导程序(BootStrap Progr

9、ams)和基于ROM的VxWorks映象。搬移程序bootInit.c负责将VxWorks映象的文本段和数据段搬移到用户定义的低端内存地址RAM_LOW_ADRS,如果需要进行必要的解压缩,然后直接启动VxWorks映像。因此BOOTROM的容量相对于2.1中描述的BOOTROM要大一些,但无需在主机目录下维护一个可用的VxWorks映象。基于ROM的VxWorks BOOTROM有压缩和未压缩之分。在Tornado工作台的Build窗口中,选择VxWorks映象Rules属性页中的VxWorks_rom即可生成基于ROM的未压缩的VxWorks BOOTROM,选中VxWorks_romCo

10、mpress即可生成基于ROM的压缩的VxWorks BOOTROM。2.3 用于驻留ROM的VxWorks映象的BOOTROM由图3所示可知,用于该映象的BOOTROM包含两部分:起始引导程序(BootStrap Programs)和驻留ROM的VxWorks映象,VxWorks系统文本段驻留在ROM,搬移程序bootInit.c负责将数据段和bss段搬移到用户定义的低端内存地址RAM_LOW_ADRS,直接启动VxWorks映像(含符号表)。此时,RAM_LOW_ADRS是VxWorks映象的加载点,它也是VxWorks数据段的起始点。在Tornado工作台的Build窗口中,选择VxWo

11、rks映象Rules属性页中的VxWorks_romResident即可生成驻留ROM的VxWorks BOOTROM。3 VxWorks的启动过程根据上述所采用的BOOTROM的不同,VxWorks的启动过程会有所不同,下面主要介绍一下使用可加载VxWorks映像的启动过程。此时,从目标板上电复位到启动用户定义的任务的整个流程如下:ROM Boot程序 被搬移到RAM中执行usrConfig.c : usrRoot( ) 初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,添加用户应用程序3.1 可加载VxWorks映象的BOOT过程Boot中几个关键宏定义:#define LOCA

12、L_MEM_LOCAL_ADRS 0x00000000#define ROM_TEXT_ADRS 0x100 ROM Boot程序执行起始地址( romStart( ) )#define ROM_OFFSET(adr) (UINT)adr - (UINT)romInit) + ROM_TEXT_ADRS)define BOOT_LINE_OFFSET 0x1200#define BOOT_LINE_ADRS (char *) (LOCAL_MEM_LOCAL_ADRS+BOOT_LINE_OFFSET) ldFileFromMch时, 从该起始地址读取加载要用到的tBootParamsdefi

13、ne RAM_LOW_ADRS 0x10000 boot Rom将控制权交给VxWorks的起始进入点( usrInit( ) ). boot启动之后,将系统映像从Flash上copy或解压到RAM_LOW_ADRS地址处,并跳转到该地址执行define VERSION_START_ADRS 0x10000 版本加载完后的执行入口地址.# define FREE_RAM_ADRS (end) start right after bss of VxWorks # define FREE_MEM_START_ADRS (FREE_RAM_ADRS + WDB_POOL_SIZE) bootRom中

14、的pMemPoolStart在本系统中, BPC以及FS单板的启动流程可概括如下:3.1.1 BOOTROM的启动过程1、 romInit.s目标板加电之后,程序指针指向RESET中断程序入口处,开始执行初始化程序romInit.s,设置机器状态字及其它硬件相关寄存器,关闭中断,禁止程序和数据CACHE,初始化内存,并设置堆栈指针,保存启动类型,调用romStart.c中的romStart( )。 The default base address for the internal memory map register(IMMR) is 0xFF40_0000. Because IMMRBAR

15、 is at offset 0x0 from the beginning of the local access registers, IMMRBAR always points to itself., 在romInit中首先会将这个默认值改为我们自定义的一个内存映像基地址,在本系统中这个歌基地址定义为0xE0000000。 /* initialize the IMMR register */lis r4, HI (CCSBAR)ori r4, r4, LO (CCSBAR) lis r8,HI(CCSBAR_INIT) /* IMMR was at 0xff400000 */ori r8,

16、r8, LO(CCSBAR_INIT) /* IMMR now at CCSBAR */ stw r4,0(r8)isync/*set windows size and attribute, config boot at 0xfff000000xffffffff */WRITEADR(r6,r7,M83XX_LBLAWBARn(CCSBAR,0), 0x80000000) WRITEADR(r6,r7,M83XX_LBLAWARn(CCSBAR,0),(LAWAR_ENABLE|LAWAR_SIZE_2GB )/* DUART波特率设定 0x6c8 for 266M */WRITEADRB(r

17、17,r18,MPC83XX_UDMB1(CCSBAR),0x06) WRITEADRB(r17,r18,MPC83XX_UDLB1(CCSBAR),0xc8)SPMF 4:1 ie 4*66.67Mhz = 266Mhz CSB. the desired baud rate = platform clock frequency / (16 x UDMB|UDLB= 266M/(160x06c8)=96002、 romStart( )sync程序跳到第一个C程序romStart.c的函数romStart( )入口地址,根据堆栈中的参数决定是否清零内存RAM(如是冷启动cold start,则清

18、零),根据不同的bootRom文件,把ROM中数据段和文本段拷贝到RAM(如果ROM代码是压缩的,还要解压);3、 usrInit( )程序跳到RAM入口地址(usrConfig.c中的函数usrInit( ) ),usrInit( )中清零bss段(这也是未赋初始值的全局变量在编译后初始值为0的原因),调用excVecInit() 安装异常向量(excVecInit会将excIntHandle注册到相应的异常上),初始化异常处理程序,调用cacheLibInit(),设置cache的指令与数据工作模式,调用sysHwInit( )对板级硬件初始化,调用usrKernelInit( )配置wi

19、nd Kernel, 调用KernelInit( ) 进行内核初始化。4、 KernelInit( )初始化内核及内存池, 主要是中断堆栈及根任务堆栈初始化,初始化任务Tcb 并生成根任务usrRoot( )。*kernelInit - initialize the kernel. The routine kernelRoot() is called before the users root routine so *that memory management can be initialized. *The memory setup is as follows For _STACK_GRO

20、WS_DOWN:* - HIGH MEMORY -* - - pMemPoolEnd* | | We have to leave room for this block headers* | 1 BLOCK_HDR | so we can add the root task memory to the pool.* -* | WIND_TCB |* - - pRootStackBase;* | ROOT STACK |* -* | 1 FREE_BLOCK | We have to leave room for these block headers* | 1 BLOCK_HDR | so w

21、e can add the root task memory to the pool.* - - pRootMemStart;* -* FREE MEMORY POOL pool initialized in kernelRoot()* - - pMemPoolStart + intStackSize; vxIntStackBase* | INTERRUPT STACK |* - - pMemPoolStart; vxIntStackEnd* - LOW MEMORY -kernelInit( ) 函数参数包括:FUNCPTR rootRtn, /* user start-up routine

22、 */Unsigned rootMemSize, /* memory for TCB and root stack */char * pMemPoolStart, /* beginning of memory pool */char * pMemPoolEnd, /* end of memory pool */unsigned intStackSize, /* interrupt stack size */int lockOutLevel /* interrupt lock-out level (1-7) */ rootRtn: 用以产生作为根任务的应用程序,典型的为usrRoot( ) ro

23、otMemSize: 使用的堆栈大小 pMemPoolStart: 可用的起始内存地址,位于VxWorks映象( bootRom启动过程中, 位于从ROM中搬迁过来的boot镜像)的代码段,数据段和bss 段之后,如果包含可选的主机内存池,则还要加上WDB_POOL_SIZE。 pMemPoolEnd: 由sysMemTop( )定义的内存顶部 intStackSize: 中断堆栈的大小 lockOutLevel: 中断封锁级别kernelInit( ) 调用intLockLevelSet( ),关闭循环模式,创建一个中断堆栈(如果结构支持的话)。然后从内存池的顶部创建一个根堆栈和TCB,创建

24、一个根任务usrRoot,并终止usrInit( )线程的执行。此时使能中断,所有的中断源已被关闭,未决中断已被清除。VxWorks RAM空间分配图,斜线部分可以被malloc申请:VxWorks for PowerPC的内存分配图:PowerPC体系结构的内存结构包括5大部分,分别为系统映像(System Image)之前的系统启动相关的低端内存,系统映像,Host Memory Pool,中断堆栈以及系统内存池(System Memory Pool)。下面就各部分进行介绍。1. 系统映像之前的低端内存包括中断向量表(Interrupt Vector Table),共享内存标志(SM An

25、chor),启动参数(Boot Line),异常信息(Exception Message)和初始化堆栈(Initial Stack)。中断向量表(异常向量表)占据0x0到0x3000地址的12KB的空间,保存有重要的中断向量信息;共享内存标志占据0x4100到0x4200地址的100字节,它的作用是标志是否有网络共享内存和VxMP共享内存对象;启动参数是保留VxWorks启动的时候所用的参数,如:qefcc(0,0)host:vxWorks h=192.1.1.1 e=192.254.0.4 u=cca pw=cca tn=cca异常信息,起始地址是0x4300,如果启动过程中出现致命异常,则

26、系统将异常信息保留在这段内存中。如果系统启动过程中失败,我们首先要看的是这段地址中记录的异常信息,可以使用d 0x4300命令查看其中记录的内容。初始化堆栈,是给usrInit()使用的初始化堆栈,直到usrRoot()分配堆栈。起始地址是0x4C00。2. 系统映像系统映像是ELF格式的文件,boot启动之后,将系统映像(boot映像或版本映像)从Flash上copy或解压(如果是压缩版本)到RAM_LOW_ADRS地址处,并跳转到该地址执行。系统映像包括三部分:TEXT段、DATA段、BSS段。其中TEXT段是代码段,使用的内存基本是必须的;DATA段是数据段,包括已经初始化的全局变量和数

27、组;而BSS段是未初始化的数据段,包括未初始化的全局变量和数组,实际上基本不占用Flash存储空间,在VxWorks系统启动的时候在内存将其进行扩展为全零。代码段的起始地址:RAM_LOW_ADRS,终止地址:VxWorks定义的char etext;数据段的起始地址:VxWorks定义的char etext,终止地址:VxWorks定义的char edata;BSS段的起始地址:VxWorks定义的char edata,终止地址:VxWorks定义的char end。FREE_RAM_ADRS指向VxWorks定义的char end,即BSS段的最后,也是映像的最后。end是由loader在

28、动态加载时确定的,从源码里找不到。首先取得end变量的地址,再减去低RAM_LOW_ADRS的空间,即得到系统映像的大小:dwImageSize = (WORD32)end - RAM_LOW_ADRS;3. Host Memory PoolHost Memory Pool是在VxWorks上驻留的调试工具使用的内存空间,可以根据WDB_POOL_SIZE宏值得到。该部分大小一般有十几M左右。起始地址:VxWorks定义的char end,终止地址:end+WDB_POOL_SIZE。4. 中断堆栈:中断堆栈的大小可以由宏ISR_STACK_SIZE定义可以得出。5. 系统内存池这部分是给Vx

29、Works用户程序使用的存储空间,用户通过malloc动态申请获得,这部分可以说是最大的内存空间,当物理内存不够需要优化时需要重点考虑。5、 usrRoot( )本系统的根任务函数usrRoot( )在prjConfig.c中。在该任务中初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,外围设备等。BPC初始任务usrRoot具体所处理的内容如下:void usrRoot (char *pMemPoolStart, unsigned memPoolSize)excIntNestLogInit(); vxMsrSet(vxMsrGet() | taskMsrDefault); /* E

30、nable interrupts at appropriate point in root task */usrKernelCoreInit (); /* core kernel facilities */memInit (pMemPoolStart, memPoolSize); /* full featured memory allocator */memPartLibInit (pMemPoolStart, memPoolSize); /* core memory partition manager */usrMmuInit (); /* basic MMU component */sysClkInit (); /* System clock component */selectInit (NUM_FILES); /* select */usrIosCoreInit (); /* core I/O system */usrKernelExtraInit (); /* extended kernel facilities */usrIosExtraInit (); /* extended I/O system */usrNetworkInit (); /* Initialize the network subsystem */selTaskDeleteHoo

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1