VxWorks 6.8启动过程详解

第一步: romInit( )
romInit 函数作为系统冷启动的第一个函数,会初始化CPU和一段内存,当romInit函数正常初始化成功后,从LOCAL_MEM_LOCAL_ADRS 到 LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE的内存可以正常进行读写访问。

第二步: romStart( )
将代码从ROM移植到RAM中,然后,跳到VxWorks 镜像中。romStart函数将跳转到ursInit 函数中。
1. 将数据段和text段的内容拷贝到ROM中。
2. 清除未使用的RAM。
3. romStart函数跳转到RAM的入口函数usrInit。

第三步: usrInit( )
usrInit 函数初始化CPU,关闭其他硬件,为内核初始化做准备。当前有很多功能不能使用,包括(printf 函数)。没有任务上下文,任务控制块(TCB),进程栈,usrInit 函数仅仅只做必要的初始化,ursRoot函数完成整个设备。
1. 初始cache寄存器,在usrInit函数结束时,指令cache和数据cache将被使能。
2. 清空BSS段。在C语言中,所有的未初始化的变量将存在BSS段。代码运行时将未初始化的变量设置为0。
3. 初始中断向量。在使能中断和启动内核前,必须初始化中断。
1) intVecBaseSet函数建立向量基址地址。
2) excVecInit 函数初始化所有的异常中断处理函数。
4. 初始化系统硬件控制器
1) sysHwInit 函数初始化系统硬件寄存器,主要是重新启动和禁止硬件寄存器。
2) 在VxWorks内核中系统的中断向量直到调用ursRoot 函数才被连接。

第四步:执行kernellnit 函数
1. kernelInit函数的作用是启动内核,进行更深入层次的设备初始化。并作为一个任务进行运行。tRootTask ---- usrRoot函数。
1) 创建中断栈,在内存池的首部,创建根栈,创建任务控制块(TCB)。启动usrRoot进程,并终止ursInit进程。
2) 同时使能ursInit函数中的所有中断。

第五步:执行usrRoot 进程。
1. usrRoot 函数的目的是初始化系统内核和所有硬件寄存器。
1) 调用memInit 函数,所以在usrRoot 函数中可以执行memShowInit 函数和usrMmuInit 函数。
2) 并且当前系统的是多任务的。调用sysClkConnect 函数,同时调用sysHwInit2 函数。
注:VxWorks 系统时钟中断用户层注册函数为sysClkInt 。系统时钟中断的注册在sysClkConnect 函数中完成。sysClkConnect被usrRoot调用专门负责系统时钟的初始化。

usrInit函数
步骤一: 执行sysStart函数;//清除BSS段,设置向量表的基地址,即:LOCAL_MEM_LOCAL_ADRS。
步骤二: 执行cacheLibInit 函数;//初始化Cache库,并在sysHwInit函数中完成。
步骤三: 执行excVecInit函数;//初始化异常中断向量。
步骤三: 执行sysHwInit 函数;// 初始化系统硬件
步骤四: 执行usrCacheEnable 函数;//使能cache
… …
执行usrKernelInit 函数;//最终调用usrRoot 进程

你可能感兴趣的:(嵌入式)