1、目标板加电运行(汇编语言) 目标板加电之后,程序指针指向RESET中断程序入口处,开始执行初始化程序romInit.s,设置机器状态字及其它硬件相关寄存器,关闭中断,禁止程序和数据CACHE,初始化内存,并设置堆栈指针,保存启动类型,调用romStart.c中的romStart( )。 2、开始运行第一个C程序 第一个C程序romStart.c的函数romStart( )入口地址,根据堆栈中的参数决定是否清零内存RAM(如是冷启动cold start,则清零),根据不同的bootRom文件,把ROM中数据段和文本段拷贝到RAM(如果ROM代码是压缩的,还要解压)。 3、运行RAM中的程序 程序跳到RAM入口地址(usrConfig.c中的函数usrInit( ) ),usrInit( )中清零bss段(这也是未赋初始值的全局变量在编译后初始值为0的原因),调用excVecInit() 安装异常向量(excVecInit会将excIntHandle注册到相应的异常上),初始化异常处理程序,调用cacheLibInit(),设置cache的指令与数据工作模式,调用sysHwInit( )对板级硬件初始化,调用usrKernelInit( )配置wind Kernel, 调用KernelInit( ) 进行内核初始化。 4、创建第一个根任务 初始化内核及内存池, 主要是中断堆栈及根任务堆栈初始化,初始化任务Tcb 并生成根任务usrRoot( )。kernelInit( ) 调用intLockLevelSet( ),关闭循环模式,创建一个中断堆栈(如果结构支持的话)。然后从内存池的顶部创建一个根堆栈和TCB,创建一个根任务usrRoot,并终止usrInit( )线程的执行。此时使能中断,所有的中断源已被关闭,未决中断已被清除。 本系统的根任务函数usrRoot( )在prjConfig.c中。在该任务中初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,外围设备等。BPC初始任务usrRoot具体所处理的内容如下: void usrRoot (char *pMemPoolStart, unsigned memPoolSize)
{
excIntNestLogInit();
vxMsrSet(vxMsrGet() | taskMsrDefault);
usrKernelCoreInit ();
memInit (pMemPoolStart, memPoolSize);
memPartLibInit (pMemPoolStart, memPoolSize);
usrMmuInit ();
sysClkInit ();
selectinit (NUM_FILES);
usrIosCoreInit ();
usrKernelExtraInit ();
usrIosExtraInit ();
usrNetworkInit ();
selTaskDeleteHookAdd ();
usrToolsInit ();
cplusCtorsLink ();
usrAppInit ();
}最后会调用usrAppInit.c中的usrAppInit ( )进行用户级应用模块的初始化。 usrAppInit( )最后会调用BootApp.c中的BootAppStart( )进入autoboot或bootLoad, 根据单板设计选择不同方式加载VxWorks映像文件,如通过串口、网口、硬盘等方式加载。
VxWorks系统启动流程
5、系统开始启动运行 启动VxWorks系统的第一步就是将系统映象加载到主内存, 在开发初期, 这通常是在VxWorks boot Rom 的控制下,从开发主机上下载, 我们正式运行的系统中。VxWorks映象被加载到ram后, boot Rom会复位系统并将控制权交给VxWorks的起始进入点sysInit()。 在makefile和 config.h文件里,已将这个进入点设置成位于地址RAM_LOW_ADRS。 函数sysInit()位于系统特定的汇编语言模块sysALib.s中。它可以锁住中断,关闭cache(如果使用了话),初始化处理器的寄存器(包括C堆栈指针)至缺省值。它还会关闭跟踪,清除所有未决的中断,并调用一个位于usrConfig.c 模块的C语言子程序:usrInit()。对于某些目标板,sysInit()还执行一些必要的与系统有关的硬件初始化,以便在usrInit()中执行完剩余的初始化内容。仅供usrInit()使用的初始堆栈指针,被设置成位于系统映象(RAM_LOW_ADRS)以下, 向量表以上的位置。 函数usrInit()(位于usrConfig.c中),储存有关引导类型的信息,处理在内核启动之前必须执行的初始化,而后启动内核执行。它是运行于VxWorks内的第一个C函数。此时,所有的中断都已被锁住。
多任务
6、启动第一个任务 当多任务内核启动执行以后,所有的VxWorks多任务工具就可以用了。控制权被传送至usrRoot( )任务,并完成初始化系统。usrRoot( ) 执行以下操作: 1) 初始化系统时钟 2) 初始化I/O系统和驱动 3) 创建控制台设备 4) 设置标准输入和标准输出 5) 安装异常处理和登陆 6) 初始化管道驱动器 7) 初始化标准I/O 8) 创建文件系统设备并安装磁盘驱动器 9) 初始化浮点支持 10) 初始化性能监视工具 11) 初始化网络 12) 初始化可选的工具 13) 初始化WindView 14) 初始化目标代理 15) 执行一个用户提供的启动脚本 16) 初始化VxWorks Shell
|