摘要:目前的嵌入式系统多使用FLASH作为主存,因此,如何有效管理FLASH上的数据非常重要。文章以MX29LV160BT芯片为例,讨论了在VxWorks操作系统下Nor Flash上建立TFFS文件系统的一般步骤,从而为FLASH上的数据管理提供了理想的选择方式,同时也为开发者和用户升级程序提供了方便。
嵌入式系统正随着Internet的发展而在各个领域得到广泛的应用,作为一个优秀的操作系统,VxWorks实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
如今越来越多的嵌入式操作系统中,通常都使用FLASH作为主存介质。许多开发者和用户为了方便以后升级用户程序,通常在FLASH上建立TFFS文件系统,建立文件系统后,我们就可以象在windows操作系统下对硬盘操作一样,进行数据的拷贝、删除以及文件的建立等操作。
NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先有EPROM和EEPROM一统天下的局面。NOR的特点是芯片内执行XIP execute In Place,这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,因此在嵌入式系统得到广泛的应用。
一、 TFFS文件系统结构简介
Tornado的TrueFFS是和VxWorks兼容的一种M-Systems Flite实现方式,版本为2.0。它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。有了Tornado的TrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的操作一样。
如图1所示,TrueFFS由核心层(core layer)和三个功能层,翻译层(translation layer),MTD层(MTD layer),socket层(socket layer)组成。 
核心层(Core layer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维护。通常WindRiver公司将这部分内容以二进制文件提供。
翻译层主要实现TrueFFS和dosFs之间的高级交互功能。它也包含了控制flash映射到块、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。目前有三种不同的翻译层模块可供选择。选择哪一种层要看你所用的flash介质是采用NOR-based, 还是NAND-based, 或者SSFDC-based技术而定。
Socket层则是提供TrueFFS和板卡硬件(如flash卡)的接口服务。其名字来源于用户可以插入flash卡的物理插槽。用来向系统注册socket设备,检测设备拔插,硬件写保护等。后面将详细讲解它的功能。
MTD层(Memory Technology Drivers)功能主要是实现对具体的flash进行读、写、擦、ID识别等驱动,并设置与flash密切相关的一些参数。TrueFFS已经包含了支持Intel,AMD以及samsung部分flash芯片的MTD层驱动。新的芯片需要新的MTD支持,你可以使用一个标准的接口来加入这些驱动。
以上四部分,我们通常要的工作就是后两层。
当在VxWorks下配置TrueFFS时,你必须为每一层至少包含一个软件模块。后面我们将详细讨论。
二、 MX29LV160BT芯片上建立TrueFFS文件系统
1、配置相关文件
在此,我以Nor Flash MX29LV160BT为例,开发工具为Tornado2.2 for PPC。要在VxWorks映像中包含TrueFFS文件系统,首先必须在config.h文件中定义INCLUDE_TFFS。这使得VxWorks的初始化代码调用tffsDrv()来创建管理TrueFFS所需的结构和全局变量,并为所有挂接了的flash设备注册socket组件驱动。在链接的时候,通过解析与tffsDrv()相关联的符号(symbols)可以将TrueFFS所必需的软件模块链接到VxWorks映象中。
为了支持TrueFFS,每一个BSP目录下都必须包含一个sysTffs.c文件。它将TrueFFS所有的层(翻译层,socket层和MTD层)链接到一起并和VxWorks绑定。因此,我必须编辑这个文件并决定哪一种MTD和翻译层模块应该包含到TrueFFS中。即:
#define INCLUDE_MTD_MX29LV /* MX29LV160BT MTD driver */
#define INCLUDE_TL_FTL /* FTL translation layer */
#define FLASH_BASE_ADRS 0x2a10000 /* Flash memory base address */
#undef FLASH_SIZE
#define FLASH_SIZE 0x001f0000 /*Flash memory size,2M(parameter block) */
其他无关的MTD driver包含头都#undef掉,同时定义Flash在系统中的基地址和大小。另外,还必须编辑sysLib.c中的sysPhysMemDesc[ ]数组,将Flash基地址和大小加入到MMU中,以供将来访问Flash,否则访问Flash会失败。如果BSP目录下没有sysTffs.c文件,那么我们可以从其他BSP目录下拷贝一个即可,然后做上述修改,其他的内容基本可以不用修改。
接下来需要修改tffsConfig.c文件,为了方便管理,通常我们将src/drv/tffs/目录下该文件拷贝到我们BSP目录下,然后再做出修改。在MTDidentifyRoutine mtdTable[]表中加入如下语句:
#ifdef INCLUDE_MTD_MX29LV
mx29lvMTDIdentify,
#endif /* INCLUDE_MTD_MX29LV */
并在该文件开头声明。
#ifdef INCLUDE_MTD_MX29LV
FLStatus mx29lvMTDIdentify (FLFlash vol);
#endif /* INCLUDE_MTD_MX29LV */
最后就是将我们的flash相关MTD驱动加入到makefile中。即:
MACH_EXTRA = mx29lvMtd.o
为了方便我们调试MTD驱动,应该在重新编译VxWorks映象前将诸如格式化flash、创建TrueFFS块设备、绑定此块设备到dosFs所必要的功能包含到VxWorks映像中。比如如下定义:
#define INCLUDE_TFFS
#ifdef INCLUDE_TFFS
#define INCLUDE_TFFS_DOSFS
#define INCLUDE_TFFS_SHOW
#define INCLUDE_DOSFS /* dosFs file system */
#define INCLUDE_SHOW_ROUTINES /* show routines for system facilities*/
#define INCLUDE_TL_FTL
#define INCLUDE_IO_SYSTEM
#define INCLUDE_DISK_UTIL
#endif /* INCLUDE_DOSFS */
2、MTD驱动简介
做了上述配置后,进入VxWorks操作系统后,我们在shell上利用tffsShow工具来显示flash的信息。TffsShow函数最终会调用MTD驱动中的mx29lvMtdIdentiy( )函数,在mx29lvMtdIdentiy ( )函数主要是通过读取MX29LV160BT芯片的设备和厂商ID来识别它,然后对FLFlash结构成员进行初始化,最主要的几个参数是:
type
Flash内存的JEDEC ID号。
erasableBlockSize
Flash内存的擦除块大小(字节)。设置这个值时应考虑到interleaving。因此,通常通过如下方法来设置它的大小。
Vol.erasableBlockSize = MX29LV_MTD_SECTOR_SIZE * vol.interleaving;
对于MX29LV160BT,MX29LV_MTD_SECTOR_SIZE为64K字节。
chipSize
使用来构建TrueFFS文件系统的flash实际大小(字节)。
noOfChips
使用来构建TrueFFS文件系统的flash实际片数。
interleaving
Flash内存交叉因子(interleaving factor)。即扩展数据总线的设备数。比如,一个32位数据总线上,我们可以使用4片8位或2片16位的设备。
map
指向flash内存映射(map)函数。该函数将flash映射到内存区。
read
指向flash内存的读函数。在MTD驱动识别函数中,这个成员函数已经被初始化为缺省的读函数。通常情况下,我们不需要再初始化它,否则还需要修改很多相关的函数。
write
指向flash内存的写函数。这个成员必须初始化,这是我们要做的一个重要工作。
erase
指向flash内存的擦除函数。这个成员必须初始化,这也是我们要做的一个重要工作。
针对FLFlash结构成员,我们所关心的两个函数就是写和擦除函数。在mx29lvMtdIdentiy()函数中必须有如下定义:
vol.write = mx29lvWrite;
vol.erase = mx29lvErase;
在mx29lvWrite()函数中主要是实现将数据写到flash中。首先需要对扇区进行解锁,然后写入写命令,之后才能进行数据的写入。最后需要判断数据是否写完。为了确保操作成功,我们应该在写完每个数据后进行数据的比较,比较正确后方能进行下一个数据的操作。
在mx29lvErase ()函数中主要是实现flash扇区的擦除。如今的flash一般都是按照扇区进行擦除操作的。在擦除操作之前也应该首先对扇区进行解锁,然后写擦除建立和扇区擦除命令。擦除成功后,flash中的内容应该是0xffff。所以为了确保成功,我们还是应该在擦除后进行比较,比较正确后方能进入下一个扇区的擦除操作,否则返回擦除错误标志。
所以,对于MTD驱动的调试,基本上就是调试写和擦除两个函数。在调试过程中,我们可以在这两个函数相应位置加入打印语句来调试。为了能调试这两个函数,我们通过在shell上输入命令tffsDevFormat来格式化flash,tffsDevFormat最终会调用mx29lvErase和mx29lvWrite函数,如果成功就会返回0,否则返回-1。当然也可以调用tffsDevCreate函数来验证我们的写和擦除函数的正确性。图2说明了tffsDevCreate调用过程。

在shell上利用tffsShow来验证mx29lvMtdIdentiy。
è tffsShow
0: socket=RFA: type=0x2249, unitSize=0x10000, mediaSize=0x1f0000
value = 49 = 0x31 = "1"
说明已正确识别到MX29LV160BT设备,设备号为0x2249。
三、 建立TFFS设备
1、挂接设备名
MTD驱动调试成功后,我们就可以给flash设备挂接上dos设备名,如下操作:
格式化:
è tffsDevFormat
value = 1
è usrTffsConfig 0,0,”/tffs0”
value = 0
然后通过devs来查看挂接的设备名。
è devs
drv name
0 /null
1 /tyCo/0
1 /tyCo/1
5 host:
6 /pty/rlogin.S
7 /pty/rlogin.M
3 /tffs0/
8 /vio
value = 25 = 0x19
看到/tffs0/说明挂接设备已经成功,接下来就可以利用dosFs文件系统相关命令来操作flash了。如,ls、copy等。
2、从Flash中启动并下载VxWorks映像
要从flash中下载VxWorks映像,首先需要把VxWorks映像拷贝到flash中,在shell中的操作命令为copy “VxWorks”,”/tffs0/VxWorks”,然后修改config.h文件中引导行,如下:
#define DEFAULT_BOOT_LINE \
"tffs=0,0(0,0)host:/tffs0/VxWorks h=192.168.0.153 e=192.168.0.154 u=target pw=target o=cpm"
修改完后,重新编译生成bootrom_uncmp.bin,并把它烧写到flash中(注意:该flash与上面建立TFFS文件系统的flash不一样,它并没有建立文件系统)。然后重新启动,即可看到如下启动画面:
boot device : tffs=0,0
unit number : 0
processor number : 0
host name : host
file name : /tffs0/VxWorks
inet on ethernet (e) : 192.168.0.154
host inet (h) : 192.168.0.153
user (u) : target
ftp password (pw) : target
flags (f) : 0x0
other (o) : cpm
Attaching to TFFS... done.
Loading /tffs0/VxWorks...894304
Starting at 0x10000...
Development System
VxWorks version 5.5.1
KERNEL: WIND version 2.6
Copyright Wind River Systems, Inc., 1984-2003
CPU: Motorola ADS - PowerPC 860. Processor #0.
Memory Size: 0x1000000. BSP version 1.2/5.
WDB Comm Type: WDB_COMM_END
WDB: Ready.
到此,说明引导成功。flash整个TFFS文件系统就已经建立成功。
四、 结论
VxWorks操作系统中支持TFFS文件系统,我们将VxWorks映像作为文件放到flash上,这就有利于开发者和用户更新应用程序而不需要影响bootrom,直接更新VxWorks映像或者将应用程序直接copy到flash中,然后装载到RAM中运行。
- 嵌入式操(6223)
相关推荐
VxWorks文件系统、Flash的TFFS设计与实现
2145
VxWorks中的TFFS文件系统怎么实现?
VxWorks操作系统具有哪些优点
VxWorks操作系统基于ARM处理器的中断怎么处理?
Vxworks实时操作系统分析
嵌入式VxWorks招聘
嵌入式操作系统VxWorks设备驱动程序该怎么设计?
嵌入式操作系统Windows CE研究
嵌入式操作系统上的FreeRTOS操作系统分析
嵌入式操作系统怎么实现网络加载?
嵌入式操作系统怎么选择?
嵌入式操作系统有哪些
嵌入式操作系统相关资料分享
嵌入式文件系统构建
嵌入式文件系统概述
嵌入式系统开发中操作系统的选型依据是什么
嵌入式系统软件及操作系统的资料大合集,绝对实用
嵌入式Linux操作系统的使用
嵌入式Linux操作系统结构——7个重要模块
嵌入式Linux之Android操作系统
嵌入式Linux根文件系统怎么制作?
嵌入式XPE操作系统构建时要注意什么?
嵌入式学习——ElfBoard ELF1板卡 之文件系统的介绍
嵌入式实时操作系统如何简化应用软件的设计
文件系统Yocto是什么
ARM嵌入式操作系统汇总
Linux操作系统和文件系统的相关资料分享
Linux作为嵌入式操作系统的优势是什么?如何建立嵌入式Linux?
STM32嵌入式操作系统介绍
STM32嵌入式操作系统介绍
主流的14种嵌入式操作系统的特点
主流的嵌入式操作系统有哪些?
五大适合STM32的嵌入式操作系统
什么是嵌入式操作系统内存管理技术?
什么是嵌入式操作系统?
介绍十四种嵌入式操作系统的特点
关于嵌入式操作系统和PC机的操作系统
几种嵌入式实时操作系统分析与比较
在VxWorks操作系统的Nor Flash上怎么建立TFFS文件系统?
基于嵌入式视频存储的专用文件系统该怎么设计?
基于Linux的嵌入式操作系统
如何构建嵌入式Linux NFS根文件系统?
实时多任务操作系统的相关资料推荐
常见嵌入式操作系统介绍
常见的嵌入操作系统的利弊都有哪些?
概述常用的嵌入式操作系统
用于嵌入式系统的操作系统
适合STM32的三大嵌入式操作系统
通用嵌入式操作系统有什么区别?
采用ARM和SD卡实现嵌入式文件系统
在嵌入式Linux上实现JFFS文件系统
23嵌入式Linux文件系统的研究与应用
16通过TFFS加载和升级VxWorks 映像
13嵌入式实时操作系统COS一Ⅱ与VxWORKs
31嵌入式XPE操作系统的构建及应用
1154
嵌入式操作系统uCLinux详解
0嵌入式文件系统及特点
780基于嵌入式视频存储的专用文件系统设计
563Linux嵌入式文件系统如何构建
859什么是嵌入式操作系统 常见的嵌入式系统有哪些
26嵌入式Linux系统移植开发-(1)基于Yocto构建嵌入式u-boot,内核,文件系统
12嵌入式Linux系统移植-(Linux文件系统)
16使用BusyBox构建根文件系统
791
电子发烧友App



评论