Rss & SiteMap

曙海教育集团论坛 http://www.bjzhda.cn

曙海教育集团论坛
共1 条记录, 每页显示 10 条, 页签: [1]
[浏览完整版]

标题:PowerPC VxWorks BSP分析

1楼
wangxinxin 发表于:2010-12-1 10:50:45
1 PowerPC BSP定制
如图1,BSP的主要功能在于配置系统硬件使其工作于正常的状态,以及完成硬件与软件之间的数据交互,为OS及上层应用程序提供一个与硬件无关的软件平台。因此从执行角度来说,其可以分为两大部分:
? 目标系统启动时的硬件初始化及操作系统引导例程,它只在系统启动过程中执行一次;
? 目标板上控制硬件运行的设备驱动程序,由它来完成硬件与软件之间的衔接。
图片点击可在新窗口打开查看
 
图1 BSP在系统中所处的位置
一般说来,BSP的设计与开发可以分为以下几个步骤:
(1)建立开发环境。安装VxWorks集成开发环境(Tornado);选择合适的开发工具。目前几乎每一种处理器都支持JTAG/BDM接口,大多数处理器都有JTAG/BDM调试工具支持,如vision ICE等,采用目标板供应商的DEBUG ROM调试工具也是一种可以考虑的途径。
(2)选择合适的BSP模板。如有可能,所选的模板尽可能与硬件平台相近,当然,实际情况中考虑到费用及充分利用已有的资源,所选的模板可能需要较大的修改才能移植到需要的硬件平台。
(3)修改或添加WIND内核激活前的初始化代码,包括初始化CPU内核、MMU、CACHE禁止/使能等。
(4)内核激活以后,连接系统中断、系统时钟,修改或添加所需要的设备驱动程序等。
(5)测试与验证。BSP的正确性与稳定性对上层软件和整个系统的稳定起着至关重要的作用。因此BSP完成后要经过测试验证。
BSP主要文件目录的组成及作用:
图片点击可在新窗口打开查看
target/config/All目录
这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件。
configAll.h:
缺省定义了所有VxWorks的设置,如果不用缺省的设置,可在BSP目录下的config.h文件中用#define或#undef方式来更改设置。
bootInit.c:
在romInit.s后,完成Boot ROM的第二步初始化。程序从romInit.s中的romInit()跳到这个文件中的romStart()来执行必要的解压和ROM image的放置
bootConfig.c: 完成Boot ROM image的初始化和控制
usrConfig.c: VxWorks image的初始化代码
target/config/comps/src目录
涉及系统核心的components,主要由target/config/All中usrConfig.c中函数调用
target/config/bspname目录
包含系统或硬件相关的BSP文件
Makefile
一些命令行控制images的生成
README
BSP发布纪录,版本,总的文档
config.h
包括所有涉及CPU主板的设置及定义(includes,definations)
configNet.h
网络驱动的主要设置文件,主要对END驱动设置.
romInit.s
汇编语言文件,是VxWorks Boot ROM和ROM based image的入口,参见系统启动部分
sysALib.s
汇编语言文件,程序员可以把自己的汇编函数放在这个文件里,在上层调用。VxWorks image的入口点_sysInit在这个文件里,是在RAM中执行的第一个函数
sysLib.c
包含一些系统相关的函数例程,提供了一个board-level的接口,VxWorks和应用程序可以以system-indepent的方式生成。这个文件还能包含目录target/config/comps/src的驱动
sysScsi.c
可选文件用于SCSI设备设置和初始化
sysSerial.c
可选文件用于所有的串口设置和初始化
bootrom.hex
ASIC文件包含VxWorks Boot ROM代码
VxWorks
运行在目标机上,完整的,连结后的VxWorks二进制文件
VxWorks.sym
完全的,连结后带有符号表的VxWorks二进制文件
VxWorks.st
完全的,连结后,standalone,带有符号表的VxWorks二进制文件
1.1启动过程
VxWorks OS有三种映像:
? Loadable Images:由Bootrom引导通过网口或串口下载到RAM
? ROM-based Images(压缩/没有压缩):即将Image直接烧入ROM,运行时将Image拷入RAM中运行。
? ROM-Resident Images:Image的指令部分驻留在ROM中运行,仅将数据段部分拷入RAM。
注意这里说的三种映像都是包含真正操作系统VxWorks的映像,其中后两种可以直接启动并运行起来,但是第一种不行,它必须借助另一个叫做Boot Image的映像(可以在Tornado中的build->build boot rom中生成)才能运行起来,也就是利用Boot Image引导起来然后通过网口或串口下载真正包含VxWorks的Loadable Image,然后才能运行起来。也就是说Boot Image是和Loadable Image 结合使用的。
现在看来一共有四种映像文件,让我们看看它们的组成吧:
? Boot Image:包含一段叫做BootStrap Programs的程序+一段ROM BOOT Program程序。
? Loadable Images:由操作系统VxWorks和应用组成的映像。
? ROM-based Images(压缩/没有压缩):包含一段叫做BootStrap Programs的程序+ Loadable Images(即由操作系统VxWorks和应用组成的映像)
? ROM-Resident Images:同上
通过上面我们可以看出,ROM-based Images,ROM-Resident Images,Boot Image三种映像都包含一段叫做BootStrap Programs的程序,它具有启动功能,可以把ROM中的代码段和数据段拷贝到RAM中。
下面我们来看看三种VxWorks OS映像的启动顺序:
Boot Image + Loadable Images
Loadable Images是依靠Boot Image加载启动的,首先有Boot Image中的程序BootStrap Programs把Boot Program程序加载到RAM中的RAM_HIGH_ADRS处,然后控制权交给Boot Program,由Boot Program负责一系列简单的硬件初始化(网口,串口等),开始下载Loadable Images(即包含应用的VxWorks操作系统)到RAM_LOW_ADRS,之后控制权交给VxWorks操作系统开始执行。
图片点击可在新窗口打开查看
 
图2 Loadable Images VxWorks启动过程
 
如图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
共1 条记录, 每页显示 10 条, 页签: [1]

Copyright © 2000 - 2009 曙海教育集团
Powered By 曙海教育集团 Version 2.2
Processed in .03125 s, 2 queries.