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/sysLib.C中,看看都初始化了什么硬件。
其实主要初始化了两个硬件,一个是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的根任务初始化一些基础的机制和设备。