vxworks启动过程

一. 引导Bootstrap在ROM中执行

romInit.s:romInit

        目标板加电后,程序指针指向RESET中断程序入口处,开始执行初始化程序romInit.s,设置机器状态字及其他硬件相关寄存器,关闭中断,禁止程序和数据CACAHE,初始化内存,并设置堆栈指针,保存启动类型,调用romStart.c中的romStart().

bootInit.c:romStart()

    这是上电后第一个执行的C函数,根据堆栈中的参数决定是否清零内存RAM(如果是冷启动cold start,则清零),根据不同的bootRom文件,把ROM中数据段和文本段拷贝到RAM,(如果ROM代码是压缩的,还要解压).

二. ROM中的引导程序被搬移到RAM中,开始在RAM中执行映像

sysALib.s:sysInit()

        该函数为RAM入口地址,是引导启动后执行的第一个函数,它主要是非能中断,初始化堆栈指针,tlb页表初始化等,并跳转到usrInit中执行。

prjConfig.c:usrInit()

    此处需注意,在下图的流程图中调用的是usrConfig.c中的usrInit,这种可能是对于指定bsp中没有实现usrInit情况而言,实际使用中,会在prjConfig.c中自动生成usrInit函数,因此实际使用中,不会调用usrConfig.c中的函数,而是使用prjConfig.c中的函数

    主要功能是:清零bss段(这也是未赋初始值的全局变量在编译后初始值为0的原因),调用execVecInit()安装异常向量,初始化异常处理程序,调用cacheLibInit(),设置cache的指令与数据工作模式,调用sysHwInit()对板级硬件初始化,调用usrKernelInit()配置wind Kernel,调用KernelInit()进行内核初始化,并生成根任务usrRoot。

prjConfig.c:usrRoot()

        初始化内存,系统时钟,I/O系统,标准输入输出,异常处理,添加用户应用程序。

具体可参见下图,左边为基于ROM的vx映像启动初始化流程,右边为可加载映像的初始化流程及其对应的调用文件:

猜你喜欢

转载自blog.csdn.net/jiangganwu/article/details/80646107