嵌入式操作系统嵌入式操作系统VxWorks中中TFFS文件系统的构建文件系统的构建
目前的嵌入式系统多使用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)。即扩