基于S3C2440的VxWorks NandFlash启动设计与实现
2018-05-03贺翔胡俊祥戴钰
贺翔,胡俊祥,戴钰
(1.广州海格通信集团股份有限公司,广东广州,510000;2.广东广播电视台,广东广州,510000)
0 引言
VxWorks操作系统作为常用的高性能实时操作系统之一,在卫星通信系统中有着其独特的优势。其开放式结构和对工业标准的支持,使得开发人员更易于设计高效的嵌入式系统,并可以以很小的工作量移植到其它不同的处理器上;该操作系统软件为程序员提供了高效的任务调度、中断管理、实时的系统资源以及实时的任务间通信,使得程序员可以将尽可能多的精力放在应用程序本身,而不再关心系统资源的管理[1]。
Nor Flash及Nand Flash是嵌入式系统中主流的两种Flash类型。Nor Flash的优点在于支持芯片内执行(XIP,eXecute In Place),这样应用程序就可以直接在 fl ash闪存内运行,而不必把代码读到系统RAM中。Nor Flash的传输效率很高,但是很低的写入和擦除速度大大影响了它的性能。另外,由于其容量小,同等容量下价格贵,一般情况下往往配合Nand Flash一同使用。Nand Flash的单元尺寸几乎是Nor器件的一半,由于生产过程更为简单,Nand 结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。但是Nand 器件使用复杂的I/O口来串行地存取数据,只有8个引脚用来传送控制、地址和数据信息,不支持芯片内执行。故Nor Flash一半用于存储程序,而Nand Flash一般用于存储数据。
s3c2440是samsung公司的一款常用的ARM9系列处理器,由于该处理器里有一个内置的SRAM,叫做stepping stone,系统启动加电后,能够把Nand Flash上的起始4KB的内容拷贝到SRAM里执行,这样就可以实现从Nand Flash启动。本文采用该款处理器,以及K9F2G08U0B型号的Nand Flash、K4S561632N型号的SDRAM、DM9000网卡芯片等作为硬件平台,并在该平台下完成VxWorks操作系统的移植,改造了VxWorks启动过程,实现了采用Nand Flash启动该操作系统。本嵌入式系统方案对于提升综合性能、减少硬件复杂度、节约硬件成本有着重要意义。
1 VxWorks启动过程分析
VxWorks的启动流程如图1所示。系统上电之后,从romInit.S开始运行。首先调用的函数就是romInit( ),该函数主要完成以下功能:
(1)禁止中断;
(2)初始化堆栈;
(3)保存启动类型(冷/热启动);
(4)初始化CPU相关寄存器;
(5)跳转到bootInit.c中的romStart()函数;
图1 Vxworks启动流程
函数romStart()主要完成以下功能:
把代码段和数据段复制到RAM当中;
如果映像是压缩版本的,则需要完成程序映像的解压缩。
跳转到bootCon fi g.c的usrInit( )函数。
函数usrInit( )设置cache的工作模式,完成板级硬件初始化后,调用sysHwInit( )、usrKernelInit( )、KernelInit( ),初始化内核,产生根任务usrRoot( )。在usrRoot根任务中解析Bootline,产生bootCmdLoop任务,用于启动、加载VxWorks映像。
在加载VxWorks映像完成后,程序跳转到sysAlib.S文件中的VxWorks image的入口点_sysInit。此时系统再次进行了一次初始化,进入了第二阶段启动过程[2-4]。本文主要对第一阶段启动过程进行改造,以实现在启动时能够调用NandFlash上的程序完成VxWorks操作系统的正常启动过程。
2 Nand Flash启动VxWorks实现
由于s3c2440处理器内置的SRAM仅能拷贝Nand Flash上的前4k代码运行,根据上述VxWorks启动过程分析可知,程序必须在romInit( )函数完成硬件初始化之后,在romStart( )函数完成映像解压缩之前完成把Nand Flash上程序拷贝到内存中的过程,即修改替换原romStart( )函数中完成把程序拷贝到RAM中的过程。系统在Make fi le和con fi g.h中通过三个宏定义来确定系统在什么内存地址运行BOOTROM,分别是:ROM _TEXT _ADRS(ROM起始地址)、ROM_LOW_ADRS(VxWorks启动地址)和RAM_HIGH_ADRS(Bootrom程序入口地址)。这里需要添加从Nand Flash把程序拷贝入内存的函数[5],定义在nand.c文件中。定义该函数:
该函数的部分主要代码如下:
在完成该部分函数的添加修改之后,为了在编译中把RdNF2SDRAM函数一同编译进去,需要在make fi le文件中加入:
由于SRAM空间只有4k,为了保证在前4k代码内完成程序的复制,需要保证该段拷贝程序在前4k代码内,这就需要通过修改rules.bsp文件修改编译顺序,如:
修改使$(BOOT_EXTRA)较先编译,链接到程序靠前的位置,或者也可以直接使nand.o较先编译、链接,可保证在前4k代码内完成程序的复制。
3 系统验证及应用
完成上述过程后,进行通过移植相应的外设驱动程序完成BSP开发。VxWorks下支持两个形式的网卡驱动,一种是兼容BSD4.4的网卡驱动,另一种是END(Enhanced Network Drivers)网卡驱动,由于后者使用比较简单而且VxWorks对该种驱动支持性好[6],本文采用END网卡驱动。本系统可通过网卡下载VxWorks映像。
如图2所示,使用Tornado生成好boorom,然后通过H-JTAG烧写到NandFlash上,跳线设置S3C2440从NandFlash启动。
打开服务器端WFTPD,设置好VxWorks镜像的路径、用户名及密码后,重新上电启动S3C2440,打开超级终端,修改启动引导行,主要包括板子IP地址、主机IP地址、FTP用户名及密码、VxWorks镜像文件路径等。然后输入@启动,在WFTPD窗口上看到VxWorks镜像下载的信息,如图3所示。
VxWorks镜像下载完成后,超级终端上变显示了熟悉的VxWorks启动画面,如图4所示。至此,完成了整个启动过程。
图3 VxWorks镜像下载
图4 VxWorks启动画面
4 结语
本文分析了VxWorks启动过程,提出了使用Nand Flash启动Vxworks的设计思路,按照上述步骤进行代码编写与调试,从网络下载VxWorks映像,实现了VxWorks的正常启动。相比传统的Nor Flash用于存储程序、Nand Flash用于存储数据的系统,降低了硬件设计复杂度、提高了稳定性、节约了开发成本。
* [1]Wind River System Inc.VxWorks 6.0 Device Driver Develop—er’s Guide [Z].2004
* [2]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社.2002
* [3]徐少毅,李君龙. 基于VxWorks的BSP概念与开发[J].电子产品世界,2002,03(B)
* [4]冯荣尉.基于ARM9的嵌入式硬件设计和VxWorks操作系统移植[D].北京理工大学,2008
* [5] Samsung Electronics Co.LTD. K9XXG08 U0B User’s Manu—al[Z].2005
* [6] 周启平,张扬.VxWorks下设备驱动程序及BSP开发指南[M].北京:中国电力出版社,2004