当前位置:首页 > VxWorks启动过程描述
BootStrap程序 在ROM中执行 ROM Boot程序 被搬移到RAM中执行 开始在RAM中运行 VxWorks romInit.s : romInit 设置机器状态字及其它硬件相关寄存器,关闭中断,禁止程序和数据CACHE,初始化内存,并设置堆栈指针 bootInit.c : romStart( ) 将ROM中的程序搬移至RAM中 bootConfig.c : usrInit( ) 设置cache的工作模式,板级硬件初始化,调用sysHwInit( ),usrKernelInit( ),KernelInit( ),初始化Win内核,产生根任务usrRoot( ) bootConfig.c : usrRoot( ) 初始化内存,系统时钟,I/O系统,标准输入输出,异常处理,外围设备初始化,产生任务bootCmdLoop bootConfig.c : bootCmdLoop( ) 调用自动引导程序autoboot( ),此函数若成功则不返回 bootConfig.c: autoboot( ) 延时7s,以默认参数启动 等待超时 用户按键中断 bootConfig.c: bootLoad( ) 加载VxWorks映象,并转向它进行重启 bootConfig.c :bootCmdLoop( ) 启动命令行用于配置VxWorks启动参数 用户输入‘@ ’ sysALib.s : sysInit( ) 锁住中断,关闭cache(如果使用了话),初始化处理器的寄存器(包括C堆栈指针)至缺省值 usrConfig.c : usrInit( ) 设置cache的工作模式,板级硬件初始化,初始化Win内核,启动usrRoot( ) usrConfig.c : usrRoot( ) 初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,添加用户应用程序 5 3.1 可加载VxWorks映象的BOOT过程 Boot中几个关键宏定义:
#define LOCAL_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时, 从该起始地址读取加载要用到的tBootParams #define 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中的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 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, r8, LO(CCSBAR_INIT) /* IMMR now at CCSBAR */ stw r4,0(r8) isync
6
/*set windows size and attribute, config boot at 0xfff00000~0xffffffff */ 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(r17,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/(16×0x06c8)=9600 2、 romStart( )
sync程序跳到第一个C程序romStart.c的函数romStart( )入口地址,根据堆栈中的参数决定是否清零内存RAM(如是冷启动cold start,则清零),根据不同的bootRom文件,把ROM中数据段和文本段拷贝到RAM(如果ROM代码是压缩的,还要解压); 3、 usrInit( )
程序跳到RAM入口地址(usrConfig.c中的函数usrInit( ) ),usrInit( )中清零bss段(这也是未赋初始值的全局变量在编译后初始值为0的原因),调用excVecInit() 安装异常向量(excVecInit会将excIntHandle注册到相应的异常上),初始化异常处理程序,调用cacheLibInit(),设置cache的指令与数据工作模式,调用sysHwInit( )对板级硬件初始化,调用usrKernelInit( )配置wind Kernel, 调用KernelInit( ) 进行内核初始化。 4、 KernelInit( )
初始化内核及内存池, 主要是中断堆栈及根任务堆栈初始化,初始化任务Tcb 并生成根任务usrRoot( )。
*kernelInit - initialize the kernel. The routine kernelRoot() is called before the user's root routine so *that memory management can be initialized.
*The memory setup is as follows For _STACK_GROWS_DOWN: *
- HIGH MEMORY -
* ---------------------------------- <--- pMemPoolEnd
* | | We have to leave room for this block headers * | 1 BLOCK_HDR | * ---------------------------------- * | WIND_TCB |
* ---------------------------------- <--- pRootStackBase; * | ROOT STACK | * ----------------------------------
* | 1 FREE_BLOCK | We have to leave room for these block headers * | 1 BLOCK_HDR | * ----------------------------------
* ~ FREE MEMORY POOL ~ pool initialized in kernelRoot()
* ---------------------------------- <--- pMemPoolStart + intStackSize; vxIntStackBase
7
so we can add the root task memory to the pool.
* ---------------------------------- <--- pRootMemStart;
so we can add the root task memory to the pool.
* | INTERRUPT STACK |
* ----------------------------------- <--- pMemPoolStart; vxIntStackEnd * - LOW MEMORY -
kernelInit( ) 函数参数包括:
FUNCPTR rootRtn, /* user start-up routine */
Unsigned rootMemSize, /* memory for TCB and root stack */ char * pMemPoolStart, /* beginning of memory pool */ char * pMemPoolEnd, /* end of memory pool */ unsigned intStackSize, int
lockOutLevel
/* interrupt stack size */ /* interrupt lock-out level (1-7) */
? rootRtn: 用以产生作为根任务的应用程序,典型的为usrRoot( ) ? rootMemSize: 使用的堆栈大小
? pMemPoolStart: 可用的起始内存地址,位于VxWorks映象( bootRom启
动过程中, 位于从ROM中搬迁过来的boot镜像)的代码段,数据段和bss 段之后,如果包含可选的主机内存池,则还要加上WDB_POOL_SIZE。 ? pMemPoolEnd: 由sysMemTop( )定义的内存顶部 ? intStackSize: 中断堆栈的大小 ? lockOutLevel: 中断封锁级别
kernelInit( ) 调用intLockLevelSet( ),关闭循环模式,创建一个中断堆栈(如果结构支持的话)。然后从内存池的顶部创建一个根堆栈和TCB,创建一个根任务usrRoot,并终止usrInit( )线程的执行。此时使能中断,所有的中断源已被关闭,未决中断已被清除。
VxWorks RAM空间分配图,斜线部分可以被malloc申请:
sysPhyMemTop()HighUser ReservedsysMemTop()=SYS_MEM_TOP=LOCAL_MEM_LOCAL_ADRS+LOCAL_MEM_SIZE-USER_RESERVED_MEMEmpty(Free address)Boot Rom ImageEmptySTACK_SAVEWDB_POOLVxWorks ImageInitial StackRAM_HIGH_ADRS=RAM_DST_ADRS(Free address)(Free address)FREE_RAM_ADRS+WDB_POOL_SIZEFREE_RAM_ADRSRAM_LOW_ADRS(Free address)Other:Interrupt Vector,Exception, bootline parameter,etcSYS_MEM_BOTTOM=LOCAL_MEM_LOCAL_ADRS+RESERVEDLOCAL_MEM_LOCAL_ADRSLow
ReservedVxWorks RAM
8
共分享92篇相关文档