vxworks的tffs分析

上传人:第*** 文档编号:30557317 上传时间:2018-01-30 格式:DOCX 页数:9 大小:105.03KB
返回 下载 相关 举报
vxworks的tffs分析_第1页
第1页 / 共9页
vxworks的tffs分析_第2页
第2页 / 共9页
vxworks的tffs分析_第3页
第3页 / 共9页
vxworks的tffs分析_第4页
第4页 / 共9页
vxworks的tffs分析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《vxworks的tffs分析》由会员分享,可在线阅读,更多相关《vxworks的tffs分析(9页珍藏版)》请在金锄头文库上搜索。

1、Vxworks 的 tffs 分析1. Tffs 简介Vxworks 的 tffs 位于 dosfs 文件系统和底层硬件中,其存在的目的是: dosfs 文件系统是针对磁盘的 FAT 文件系统,而我们大部分嵌入式设备存储设备是 flash,flash 和磁盘在物理特性上差别很大;首先磁盘和 flash 的读写方式不一样,磁盘可以一个字节一个字节的修改,而 flash 在写之前必须先擦除;flash 的擦除和写有次数限制(大部分 flash 设备是 10万次) ;tffs 的存在使得 dosfs 对 flash 操作犹如对 flash 操作一样,这样 tffs 就屏蔽了底层设备的差异。Tffs

2、有以下几个特性:Wear-leveing 算法:此算法的目的在于均衡 flash 损耗,使得 flash 各个块的擦除和写次数平衡。碎片回收:TrueFFS 使用一种被称为碎片回收( garbage collection)的机制来回收那些不再包含有效数据的块。该机制从一个预擦除单元(source era se unit)内拷贝所有的有效数据块到另一个新的被称为转移单元(transfer unit)的擦除单元。TrueFFS 然后更新 block-to-flash 映射表再擦除这个废旧的预擦除单元。错误恢复:此功能使用了写后删除技术(erase after write) ,使得数据唯一性,不会产

3、生中间数据。下图是整 dosfs+tffs 文件系统架构:可以看到 dosfs 是位于 tffs 上层的, tffs 包含三层:翻译层、MTD 层和 socket 层。我们增加 tffs 特性时需要修改 MTD 层和 socket 层。翻译层由 vxworks 提供,不需要修改。下面介绍各层的作用。翻译层:主要实现 TrueFFS 和 dosFs 之间的高级交互功能。它也包含了控制 flash 映射到块、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。MTD 层:即设备驱动层,包含 flash 读、写、擦除、 ID 识别等驱动。Socket 层:用来提供 tffs 和板卡

4、硬件(如 flash 卡)的接口服务,如果我们的 flash 设备是固定在板卡上的则 socket 比较简单,修改较少。如果需要实现热插拔则比较复杂,需要从新写。2. Vxworks 的 BSP 开发方法BSP 开发一般分两种按照我的理解分两种:公共特性的 BSP 开发和特有特性的 BSP 开发。公共特性的开发对我们平台来说是各个产品需要做适配的工作,并且不需要修改或者修改很少的 vxworks 内核代码,在内核配置中增加需要相应的特性即可。但增加特性后,会在 BSP 目录下的 config.h 文件增加 INCLUDE 宏;并且在 usrboot()即内核启动程序中添加相应的初始化函数。下面

5、以增加 tffs 特性为例:在内核配置 tffs 后,config.h 会增加INCLUDE_TFFS 宏,并在 prjconfig.C(此文件也是根据配置生成的) 的 usrIosExtraInit()函数增加tffsDrv()和 usrTffsConfig()函数。特有特性的 BSP 开发是各个产品负责的,每个产品由于硬件配置不一样,所以 BSP 特性也需要做相应的改变。这种特有特性开发则需要我们将和 BSP 相关的.c 和.h 放在自己的BSP 目录下,修改产品的初始化代码,自己添加相关 BSP 初始化(取代了公共特性开发中vxworks 帮我们自动添加的步骤) 。下面以增加 tffs

6、特性为例:我们不需要配置内核支持 tffs特性,取代的是将 systffs.c、 systffs.h 放在 BSP 目录下,在初始化中添加 tffsDrv()和usrTffsConfig()函数。3. TFFS 中两大数据结构:FLSOCKET 和 FLFLASHFLFLASH 是 MTD 层维护的数据结构,它的定义如下:struct tFlashFlashType type; /* Flash device type (JEDEC id) */long int erasableBlockSize; /* Smallest physically erasable size(with inter

7、leaving taken in account) */long int chipSize; /* chip size */int noOfChips; /* no of chips in array */int interleaving; /* chip interleaving*/unsigned flags; /* Special capabilities & options*/void * mtdVars; /* Points to MTD private area*/FLSocket * socket; /* Socket of this drive */void FAR0 * (*

8、map)(FLFlash *, CardAddress, int);FLStatus (*read)(FLFlash *, CardAddress, void FAR1 *, int, int);FLStatus (*write)(FLFlash *, CardAddress, const void FAR1 *, int, int);FLStatus (*erase)(FLFlash *, int, int);void (*setPowerOnCallback)(FLFlash *);这个数据结构中包含了 MTD 维护的数据和 flash 的操作方法,包括重映射、读、写、擦除等函数指针。只需

9、要注意的是这个数据结构包含 socket 指针,它指向 flash 对应的socket 数据结构。具体每个数据的含义可以看 flflash.h 的解释。FLSOCKET 是 socket 层维护的数据结构,它的定义如下struct tSocket unsigned volNo; /* Volume no. of socket */unsigned serialNo; /* Serial no. of socket on controller */FLBoolean cardChanged; /* need media change notification */int VccUsers;/*

10、No. of current VCC users */int VppUsers; /* No. of current VPP users */PowerState VccState; /* Actual VCC state */PowerState VppState;/* Actual VPP state */FLBoolean remapped; /* set to TRUE whenever the socket window is moved */void (*powerOnCallback)(void *flash); /* Notification routine for Vcc o

11、n */void * flash; /* Flash object for callback */struct /* Window state */unsigned int baseAddress; /* Physical base as a 4K page */unsigned int currentPage; /* Our current window page mapping */void FAR0 * base; /* Pointer to window base */long int size; /* Window size (must by power of 2) */unsign

12、ed speed; /* in nsec. */unsigned busWidth; /* 8 or 16 bits */ window;FLBoolean (*cardDetected)(FLSocket vol);void (*VccOn)(FLSocket vol);void (*VccOff)(FLSocket vol);FLStatus (*VppOn)(FLSocket vol);void (*VppOff)(FLSocket vol);FLStatus (*initSocket)(FLSocket vol);void (*setWindow)(FLSocket vol);void

13、 (*setMappingContext)(FLSocket vol, unsigned page);FLBoolean (*getAndClearCardChangeIndicator)(FLSocket vol);FLBoolean (*writeProtected)(FLSocket vol);#ifdef EXITvoid (*freeSocket)(FLSocket vol);#endif;这结构体为 TFFS 提供了指向处理 flash 硬件接口的函数指针。一般情况下,怎样实现这些 flash 接口函数相对软件来说更需要硬件细节。 相应的,FLSocket 结构体的成员描述指出了风

14、河提供的 BSP,这样我们就可以用来作例子。但是,在使用这些 BSP 时,我们需要对特定的硬件特别谙熟。每个成员的含义看以看 flsocket.h 文件。4. 添加 socket添加 socket 需要做三部分工作:注册 socket、添加全局函数 FitInSocketWindow()和DelayLoop()函数。为何要注册 socket?socket 注册后怎么被 MTD 发现?MTD 如何使用 socket 功能?下面为大家解答:为何要注册 socket?Socket 层在 MTD 层之下,为 MTD 层提供检测硬件擦拔、硬件写保护等功能。对于固定在板卡上的 flash 其没有擦拔功能,

15、所以比较简单而且代码改动较少;对于带热插拔的flash 比较复杂。Socket 注册后怎么被 MTD 发现?MTD 如何使用 socket 功能?首先看如何创建一个 tffs 设备FlMount()函数是挂载翻译层:FLSocket *socket = flSocketOf(volNo); /根据 volume no 获取 socket 指针checkStatus(flIdentifyFlash(socket,flash);for (iTL = 0; iTL = DRIVES) return (flTooManyComponents);tffsSocketnoOfDrives = RFA;no

16、OfDrives+;第二部初始化下面一些变量:window.baseAddressSee window.baseAddress; cardDetected ;VccOn ;VccOff; VppOn;VppOff;initSocket;setWindow;setMappingContext;getAndClearCardChangeIndicatorwriteProtected freeSocket 4.3 添加全局函数 FitInSocketWindow()和 DelayLoop()函数Tffs 使用 FitInSocketWindow()函数确定 chipsize 不会比 windowsize 大;什么是 chipsize什么是 windowsize?chipsize 是你的 flash 大小;而 windowsize 是 ppc 为了方便管理每个外围设备,而分配的一段空间;所以 FitInSocketWindow()就是要确保分配

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号