广州致远电子有限公司 VxWorks BSP移植技术笔记 VxWorks技术笔记
1. 适用范围
主要从几个关键主题描述s3c2440a的 VxWorks BSP定制工作, 对整个过程作了详细描述。另外提供一些开发中需要使用的参考资源,包括手册、文档、代码和工具等。
适用于基于ARM的VxWorks 的BSP开发。
此次移植的VxWorks BSP基于Tornado 2.2,适用于EPC6000,MiniHMI-1000等基于s3c2440a的工控板上。实现了向量表映射,中断异常管理,系统时钟,辅助时钟,Uart等最基本的驱动与功能。可用于生成VxWorks的bootrom和VxWorks镜像。
移植技术笔记 ?2009 Guangzhou ZHIYUAN Electronics CO., LTD.
1
广州致远电子有限公司 VxWorks BSP移植技术笔记 VxWorks技术笔记
2. BSP分析
2.1 BSP的文件构成
VxWorks的BSP组成文件主要包含在四个目录下: ? ? ? ?
Tornado\\target\\config\\all :所有BSP的公共部分;
Tornado\\target\\config\\comps\\vxworks:基本模块描述文件(*.cdf); Tornado\\target\\config\\comps\\src:模块配置文件(被usrConfig.c使用); Tornado\\target\\config\\bspname:与目标板相关的部分。
通常将\\target\\config\\all 下的文件拷贝到\\target\\config\\bspname\\all,同时修改makefile文
件中的“CONFIG_ALL”项,设置为正确的路径。这样做的目的是为了在修改all目录下文件时不影响其它的BSP。
下面分别介绍这些文件: 1. all目录:
在该目录下主要有如下几个文件:
bootConfig.c:是bootrom的主要初始化与控制文件。BootConfig.c是usrConfig.c的一个子集,所以bootrom只能提供完整VxWorks Image中的部分功能。bootrom不使用MMU库(SPARC除外)。在集成环境下修改工程相关的配置信息不会影响bootrom,只有直接修改config.h,configAll.h,bootConfig.c和bootInit.c文件才会影响到bootrom;
bootInit.c:定义了romStart()函数,用于bootrom的第二阶段初始化。首先把text和data段从ROM拷到RAM中,然后初始化部分RAM,进行解压;
usrConfig.c:包含VxWorks镜像的主要初始化代码。在Tornado集成环境下生成VxWorks镜像时会用到此文件。
2. bspname目录:
在该目录下主要有如下几个文件:
Makefile:bootrom的Makefile文件。其中定义了一些宏,如:ROM_TEXT_ADRS,ROM_SIZE,RAM_LOW_ADRS,RAM_HIGH_ADRS;这些宏定义应该与config.h下的定义相一致;
config.h:包含所有的头文件和与CPU及系统相关的宏定义,如:对Cache和MMU的配置,RAM和ROM的定位以及大小配置;
romInit.s:该文件是bootrom和带ROM启动功能的 VxWorks 镜像的初始化入口汇编代码,即实现了romInit()。目标板一上电就开始执行romInit(),主要完成三部分工作: ? ? ?
关看门狗,屏蔽中断,禁能MMU,Cache,配置处理器时钟; 初始化内存控制器;
初始化堆栈指针和其它寄存器以执行C语言,然后调用romStart().
注意:romInit()中的函数或变量必须设计成与内存地址无关的代码(PIC),如
程序清单 2.1所示:
移植技术笔记 ?2009 Guangzhou ZHIYUAN Electronics CO., LTD.
2
广州致远电子有限公司 VxWorks BSP移植技术笔记 VxWorks技术笔记
程序清单 2.1 与内存地址无关代码
L$_HiPosn:
.long ROM_TEXT_ADRS + HiPosn - FUNC(romInit) L$_rStrtInRom:
.long ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit) L$_SMRDATA:
.long ROM_TEXT_ADRS + SMRDATA - FUNC(romInit)
romInit.s只执行一些必要的初始化,其余的初始化工作在后面完成。
sysALib.s:包含目标板或系统相关的汇编语言函数,即实现了_sysInit(),是基于RAM的VxWorks镜像的入口程序,当bootrom引导完镜像后,就会从此出开始执行。sysALib.s类似于romInit.s完成的工作,但它不必设计成PIC,且可调用其它库中的函数。
sysSerial.c:串口驱动程序的安装和初始化。 bspname.h:包含与处理器相关的宏定义。
sysLib.c:包含与目标板或系统相关的C语言函数,sysLib.c中应该实现以下几类函数: ? ? ? ? ? ? ?
系统时钟中断相关的函数:sysClkConnect(),sysClkDisable(),sysClkEnable(), sysClkInt(),sysClkRateGet(),sysClkRateSet(); 系统硬件初始化函数:sysHwInit(),sysHwInit2()
内存相关的函数:sysMemTop(),sysNvRamGet(),sysNvRamSet()
串口相关的函数:sysSerialHwInit(),sysSerialHwInit2(),sysSerialChanGet() 杂项函数:sysBspRev(),sysModel(),sysToMonitor()
其它可选函数:如:辅助时钟中断相关函数,总线相关函数
其中部分函数的实现在驱动程序子文件中完成。通过包含C文件的方式引入到sysLib.c中,如程序清单 2.2所示:
程序清单 2.2 包含C文件
#include \ /* sys interrupt */ #include \ /* sys timer */ #include \ /* sio channel */
#ifdef INCLUDE_END
#include \ /* END device */ #endif
2.2 BSP的执行逻辑
2.2.1 BootROM image
bootrom主要用于启动装载VxWorks image,因此完成较少的系统初始化,。一般有压缩和不压缩两种形式,如bootrom和boot_uncmp。与VxWorks image的主要区别在于Bootrom调用bootConfig.c,而VxWorks镜像调用usrConfig.c。
1. bootrom的执行逻辑:
移植技术笔记 ?2009 Guangzhou ZHIYUAN Electronics CO., LTD.
3
广州致远电子有限公司 VxWorks BSP移植技术笔记 VxWorks技术笔记
文件romInit.s中的romInit→文件bootInit.c中的romStart→文件bootConfig.c中的usrInit→sysHwInit()→usrKernelInit()→KernelInit(usrRoot,...)
usrRoot→bootCmdLoop(void)命令行选择,或autoboot→bootLoad(pLine, &entry)加载模块到内存(网络,TFFS,TSFS…) →netifAttach()→go(entry) →(entry)()从入口开始执行,不返回。
2.2.2 VxWorks image
1. 不带ROM引导功能的VxWorks镜像
不带ROM引导功能的VxWorks镜像向需要bootrom将其加载到RAM中,sysaLib.s是在RAM中执行的第一个函数,执行逻辑如下:
文件sysaLib.s中的sysInit→文件usrConfig.c中的usrInit→sysHwInit→usrKernelInit→ KernelInit(usrRoot,...)
其主要函数及功能如表 2.1 函数说明
表 2.1 函数说明
函 数 sysInit()
函 数 功 能 (a)锁住中断;(b)禁用缓冲; (c)初始化处理器寄存器到一缺省值;
(d)清除所有悬置中断; (e)激活usrInit(),指明启动类型。
usrInit()
(a)对bss赋零;
(b)保存bootType于sysStartType;
(c)调用excVecInit(),初始化所有系统和缺省中断向量; (d)依次调用sysHwInit(), usrKernelInit(),kernelInit().
usrKernelInit()
依次调用
classLibInit(),taskLibInit(),taskHookInit(),semBLibInit(),semMLibInit(),semCLibInit(),semOLibInit(),wdLibInit(),msgQLibInit(),qInit(),work
QInit()
kernelInit()
初始化并启动内核。 (a)激活intLockLevelSet(); (b)从内存池顶部创建根堆栈和TCB; (c)调用taskInit(),taskActivate(),用于usrRoot();
(d)调用usrRoot().
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 kernelLib.c usrKernel.c usrConfig.c 所 在 文 件 sysALib.s
2. 带ROM引导功能的VxWorks镜像
其中ROM驻留型的镜像在执行romStart函数时只把VxWorks镜像的data段复制到
RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行,执行逻辑如下: 移植技术笔记 ?2009 Guangzhou ZHIYUAN Electronics CO., LTD.
4
广州致远电子有限公司 VxWorks BSP移植技术笔记 VxWorks技术笔记
文件romInit.s中的romInit→文件\\comps\\src\\romStart.c中的romStart→文件usrConfig.c中的usrInit→sysHwInit→usrKernelInit→KernelInit(usrRoot,...)
其主要函数及功能如表 2.2所示:
表 2.2 函数说明
函数 1.romInit()
函数功能
(a)禁止中断;(b)保存启动类型;(c)硬件初始化;
(d)调用romStart();
2.romStart()
(a)将数据段从ROM拷贝到RAM,清内存;
(b)有必要的话将代码段从ROM拷贝到RAM,有必要的话
解压缩;(c)调用usrInit();
3.usrInit() 4.usrKernelInit() 5.kernelInit() 6.usrRoot()
初始化程序
如果相应的配置文件被定义,对应函数被调用
初始化并启动内核
初始化I/O系统,驱动器,创建设备
usrConfig.c usrKernel.c kernelLib.c usrConfig.c romStart.c 所在文件 romInit.s
2.2.3 Driver加载的时机
在syslib.c文件中,被初始化的设备是系统或调试所依赖的,我们称为“近设备”,例如串口、时钟;在用户应用程序内被初始化的设备是依赖于操作系统的,我们成为“远设备”,例如在driver中需要使用信号量。
移植技术笔记 ?2009 Guangzhou ZHIYUAN Electronics CO., LTD.
5
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库vxWorks_BSP移植笔记(2)在线全文阅读。
相关推荐: