以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- VxWorks BSP开发 (http://sun4.cn/bbs/list.asp?boardid=37) ---- VxWorks BSP制作概要 (http://sun4.cn/bbs/dispbbs.asp?boardid=37&id=1942) |
-- 作者:wangxinxin -- 发布时间:2010-12-1 10:49:19 -- VxWorks BSP制作概要 VxWorks BSP制作概要 要了解vxworks BSP的制作,首先要对vxworks的启动过程有个大体的了解,下面我们从vxworks的启动过程开始介绍。 VxWowks的启动过程 一般来说,所有的处理器执行相同的逻辑步骤初始化和加载VxWorks,但一些处理器可能会有一些特殊的步骤,而另外一些则可能跳过一些步骤。但它们都要进行以下步骤,如:初始化处理器,并在存储器的特定位置提供一段代码(可能还有一些表)以供处理器上电或重启时运行。这段代码设置处理器的状态,初始化存储器和存储器地址,关中断把控制权交给启动代码(bootstrapping code)。 1. 处理器首先跳到ROM的入口地址,设置状态字并创建一个哑堆栈(DUMMY stack); 2. 跳到C程序的入口地址,根据哑堆栈中的参数决定是否清零内存RAM(如是冷启动(cold start)则清零),再把ROM段的剩余部分拷贝到RAM(如果ROM代码是压缩的,还要解压); 3. 处理器跳到RAM的入口地址(bootConfig.c),使cache无效,清零bss段,初始化向量表,进行板级初始化。 4. 启动多任务内核。 VxWorks的boot ROM本身就是一个独立的应用。开发者可用它来通过网络启动一个VxWorks映像并和应用代码连接。 1 VxWorks启动流程 romInit()——》romStart()——》sysInit()——》initVectBaseSet()——》sysHwInit()——》usrKernelInit() ——》kernelInit()——》usrRoot() 2 文件和程序说明 romInit.S: romInit() 关中断,把启动类型(cold/warm)入栈,清零cache后跳到romStart的入口。 bootInit.C:romStart() 把ROM代码和数据段拷贝并重定位到RAM,清零RAM的未用部分,需要的话要进行解压缩,然后跳到sysInir()的入口地址。 拷贝的过程如下: A,代码段不是驻留在ROM中,要拷贝代码段和数据段; B,如代码段是驻留在ROM中的,则只拷贝数据段; C,未用的内存清零; D,需要时,要进行解压缩。 sysALib.S:sysInit() sysInit()是VxWorks映像的入口地址,起始地址由RAM-LOW-ADR定义。它首先关中断,使cache无效,初始化处理器的寄存器为缺省值,使tracing无效,清除中断寄存器,初始化usrInit()的堆栈并激活usrInit()。 注意,在sysInit()中必须重新初始化在romInit()中所做的硬件初始化。 usrConfig.C and bootConfig.C:usrInit() 它是VxWorks运行的第一个C代码,在supervisor mode中激活。它关中断,存储有关启动类型(boot type)的信息,在VxWorks内核运行前进行必要的初始化。 A,初始化cache的模式,设置为安全状态,在usrInit()结束时使cache有效; B,清零系统bss段; C,初始化中断向量表,调用VectBaseSet(),exeVectInit(); D,初始化系统硬件,但使之无效(Quiescent State),调用sysHwInit(),这是一个与硬件有关的过程,是我们要针对不同的目标板进行修改的重要部分,其中涉及到串口,网口的初始化,CONSOLE的配置等; E,调用usrKernelInit(),并使能cache; F,调用kernelInit(),创建usrRoot()。 usrKernel.C:kernelInit() 初始化内核可选组件(kernel facility)。 kernelLib.C:usrKernelInit() 初始化多任务环境。 调用intLockLevelSet(),使时间片(round-robin)方式无效,在内存的高端创建中断堆栈,ROOT堆栈和TCB,创建usrRoot(),中断usrInit()的运行,然后打开中断,注意要清除中断寄存器。 usrConfig.C and bootConfig.C:usrRoot() 初始化I/O系统,驱动器,设备(在configAll.h和config.h中指定)。 3 程序列表 对于硬件初始化的顺序,大致可按下表中形式进行: 函 数 函 数 功 能 所 在 文 件 sysInit() (a)锁住中断;(b)禁用缓冲; (c)用缺省值初始化系统中断表(仅i960); (d)用缺省值初始化系统错误表(仅i960); (e)初始化处理器寄存器到一缺省值; (f)使回溯失效;(g)清除所有悬置中断; (h)激活usrInit(),指明启动类型。 sysALib.s usrInit() (a)对bss赋零; (b)保存bootType于sysStartType; (c)调用excVecInit(),初始化所有系统和缺省中断向量; (d)依次调用sysHwInit(), usrKernelInit(),kernelInit(). usrConfig.c usrKernelInit() 依次调用classLibInit(),taskLibInit(),taskHookInit(),semBLibInit(),semMLibInit(),semCLibInit(),semOLibInit(),wdLibInit(),msgQLibInit(),qInit(),workQInit() usrKernel.c kernelInit() 初始化并启动内核。 (a)激活intLockLevelSet(); (b)从内存池顶部创建根堆栈和TCB; (c)调用taskInit(),taskActivate(),用于usrRoot(); (d)调用usrRoot(). kernelLib.c usrRoot() 初始化I/O系统,驱动器,设备(在configAll.h和config.h中指定) (a)调用sysClkConnect(),sysClkRateSet(), iosInit(),[ttyDrv()]; (b)初始化excInit(),logInit(),sigInit(). (c)初始化管道,pipeDrv(); (d)stdioInit(),mathSoftInit()或mathHardInit() (e)wdbConfig():配置并初始化目标代理机 usrConfig.c 在大多数目标板的板级支持包中,VxWorks的入口点由两个函数:romInit()和romStart()来完成,而非sysInit()。具体基于ROM的VxWorks的初始化过程如下表所示: 函数 函数功能 所在文件 1.romInit() 2.romStart() 3.usrInit() 4.usrKernelInit() 5.kernelInit() 6.usrRoot() 7.Application routine (a)禁止中断; (b)保存启动类型; (c)硬件初始化; (d)调用romStart(); (a)将数据段从ROM拷贝到RAM,清内存; (b)将代码段从ROM拷贝到RAM,有必要的话解 压缩; (c)调用usrInit(); 初始化程序 如果相应的配置文件被定义,对应函数被调用 初始化并启动内核 初始化I/O系统,驱动器,创建设备 应用程序代码 romInit.s bootInit.c usrConfig.c usrKernel.c kernelLib.c usrConfig.c Application source file BSP的结构 BSP是一系列文件的集合,这些文件按功能大致可分为三个部分:一是操作系统载体的硬件初始化文件;二是操作系统初始化文件;三是生成BSP目标代码所需的工具文件,如各种编译连接文件等。 BSP的文件构成如下: 1,硬件初始化文件:处理器初始化程序。 2,操作系统初始化文件:各类头文件,驱动程序,操作系统内核初始化程序,创建多任务环境程序。 3,工具文件:各类make文件,制作系统引导文件的工具。 BSP的工作 1,单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层的硬件 |