云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > VxWorks启动过程描述

VxWorks启动过程描述

  • 62 次阅读
  • 3 次下载
  • 2025/6/18 18:30:56

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

搜索更多关于: VxWorks启动过程描述 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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系统,标准输入输出,异

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com