发 帖  
原厂入驻New

[经验] VxWorks操作系统映像的启动过程

2020-8-25 11:22:27  542 VxWorks 操作系统
分享
1
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

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表