您的位置:首页 > 其它

PowerPC VxWorks BSP分析(4.2)——BSP定制

2009-03-04 01:07 507 查看
如图2,第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二阶段执行流程使用的是上图中右边源文件中的那些函数(sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具体解释: 第一阶段: romInit.s:romInit() Ø 系统上电之后,首先调用的函数就是romInit() Ø 禁止中断 Ø 把启动类型(冷启动/热启动)放在堆栈上 Ø 清除cache Ø 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM Ø 直接跳转到bootInit.c:romStart() bootInit.c:romStart() Ø 把代码段和数据段从bootrom复制到RAM当中 Ø 完成程序映象的解压缩(如果映象是压缩版本的) Ø 跳转到bootConfig.c:usrInit() bootConfig.c:usrInit() Ø VxWorks OS中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。 Ø Cache程序库的初始化 Ø 清零系统的BSS段 Ø 初始化中断向量表 Ø 使硬件工作在一个“安静”的状态,尽量不产生各种中断或者异常 Ø 控制权移交给KernelInit(),产生usrRoot根任务 Ø 在usrRoot根任务中解析Bootline,产生bootCmdLoop任务,用于启动、加载VxWorks映像 /target/config/all/bootConfig.c是Boot ROM设置模块,用于加载VxWorks image。执行流程为: usrRoot()---->bootCmdLoop(void)命令行选择,或autobooting---->bootLoad(pLine, &entry)加载模块到内存(网络、TFFS、TSFS...)---->netifAttach()---->go(entry)---->(entry)()从入口开始执行,不返回。 第二阶段: bootConfig.c: bootLoad( ) Ø 加载VxWorks映像,并转向它的加载地址,从sysInit入口开始执行VxWorks映像 sysALib.s: sysInit( ) Ø 与romInit.s : romInit()的初始化过程类似,但不再初始化Memory(DRAM和Memory控制器通常初始化一次) usrConfig.c: usrInit( ) Ø 设置cache的工作模式,板级硬件初始化,初始化Wind内核,启动usrRoot( )根任务 usrConfig.c: usrRoot( ) Ø 初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,添加用户应用程序。 ROM-based Images(压缩/没有压缩) 和上面那种启动方式相比,这种启动方式省去了一些步骤,执行完romStart()之后就已经加载VxWorks 到RAM中了,因此,下一步就是把控制权交给VxWorks,由VxWorks从sysInit()开始执行即可。下面是具体的流程:

romInit.s:romInit() Ø 系统上电之后,首先调用的函数就是romInit() Ø 禁止中断 Ø 把启动类型(冷启动/热启动)放在堆栈上 Ø 清除cache Ø 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM Ø 直接跳转到bootInit.c:romStart() bootInit.c: romStart() Ø 把代码段(如果是VxWorks_romResident映像,则不拷贝代码段)和数据段从bootrom复制到RAM当中 Ø 完成程序映象的解压缩(如果映象是压缩版本的) Ø 跳转到sysALib.s: sysInit() sysALib.s: sysInit() Ø 重新进行CPU内核(主要是cache)的初始化,这些工作在romInit.s:romInit()中曾经进行 Ø 是RAM中运行的第一段代码 Ø 跳转到usrConfig.c: usrInit() usrConfig.c: usrInit() Ø VxWorks 中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。 Ø Cache程序库的初始化 Ø 清零系统的BSS段 Ø 初始化中断向量表 Ø 使硬件工作在一个“安静”的状态,尽量不产生各种中断或者异常 Ø 控制权移交给KernelInit(),产生usrRoot根任务 ROM-Resident Images 这种映像的加载和上一种是基本相同的,其执行顺序为: 文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件usrConfig.c中的usrInit()---->sysHwInit()---->usrKernelInit()---->KernelInit(usrRoot,...)。 usrRoot()任务的主要功能包括: Ø 初始化内存分区表(memory partition library) Ø 初始化系统时钟(system clock) Ø 初始化输入输出系统(I/O system)----可选 Ø Create devices----可选 Ø 设置网络(Configure network)----可选 Ø 激活WDB目标通信(Activate WDB agent)----可选 Ø 调用程序(Activate application)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息