VxWorks启动代码usrInit()函数分析

  VxWorks启动代码usrInit ()函数分析        

DanielLee_USTB 2013-6-14

QQ:382899443

 

又到周五晚上了,明天不用加班,真是美好的一天。现在看vxworks启动的第三个主要函数usrInit()。

       这个函数是在RAM中执行的第一个函数,主要完成对BSS段的清除、设置异常向量、然后调用sysHwInit()初始化硬件。什么是BSS段呢?所谓BSS就是用于存放未初始化的全局变量和静态变量的一块内存区域。

       第一句是

       while (trapValue1 != TRAP_VALUE_1 ||trapValue2 != TRAP_VALUE_2)

         {

         /* infinite loop */;

         }

       这用于检查是否能正确调用到数据段,如果数据段没有被拷贝到相应的RAM区域,或者拷贝过程出错,那么程序就将死在这里,这样做也可以提供一种调试手段。

         SYS_HW_INIT_0();

       cacheLibInit (USER_I_CACHE_MODE,USER_D_CACHE_MODE);

        是用来打开cache的函数,与定义的CPU有关。那么arm的cache有什么用呢,根据应用数据访问数据集中性原理,其实就是去查询最常用的数据,可以提高处理速度。

         bzero (edata, end - edata);               /* zero out bss variables */

        这就是清除BSS段的数据,其实bzero 调用的是memset函数, edata被指向了ROM中的一块地址空间。

         excVecInit ();                                /* install exceptionvectors */

       在源代码中经常会看到这样的情况,好多函数都是像extern STATUS   excVecInit ()这样的外部函数,都是系统自带的,去初始化系统所有缺省中断向量。

         sysHwInit ();                                /* initializesystem hardware */这个函数在920t/sysLibC中,看看都初始化了什么硬件。

       其实主要初始化了两个硬件,一个是PCI一个是串口,暂时不关心PCI的初始化,串口才是我们看的重点。sysSerialHwInit(),的位置是在920t/sysSerial.c中,这个函数获取了预先定义的串口基地址、波特率、时钟等信息调用primeCellSioDevInit()à调用ambaInitChannel()去初始化芯片。操作系统初始化一个串口真是费劲,居然经过这么多层才到关键位置,不过这也体现了人家编写代码的层次性。对于串口的初始化没啥好说的,FIFO、控制寄存器、时钟寄存器等一个不能少,比较容易理解。

       初始完串口,能打印东西了,可是初始化的到底是哪个串口呢?

看到:

 LOCALSYS_AMBA_CHAN_PARAS devParas[] =

    {

     {INT_VEC_UART_0, (UINT32 *)UART_0_BASE_ADR, INT_LVL_UART_0},

     {INT_VEC_UART_1, (UINT32 *)UART_1_BASE_ADR, INT_LVL_UART_1}

};

说明这两个串口都初始化了。

      usrKernelInit ();

       到这步就要初始化系统内核,位置在src\config\usrKernel.c中主要是配置操作系统的一些机制,这些都是不用变得,以后移植的话也不用管。

      cacheEnable();

       配置好cache就可以使用了,使能cache。

      kernelInit(),创建第一个任务usrRoot,进一步去初始化板子硬件,这些都是启动vxworks内核之前的准工作,其位置在config/all/usrConfig.c中。可以先看看他的注释:

/*It initializesthe I/O system, installs drivers, creates devices, and sets

* up thenetwork, etc., as necessary for a particular configuration.

*/

       Vxworks系统之所以写的好,很详细的函数注释是一方面。通过这些注释,很容易知道它的作用,具体内容比较多,下次再详细分析。

       总结一下,usrInit主要实现了清零BSS、设置默认中断向量、初始化串口、使能cache、以及创建第一个usrRoot的根任务初始化一些基础的机制和设备。

你可能感兴趣的:(VxWorks)