用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

TrueFFS原理及其在CF卡上的实现

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 23:50:51

①废块最多;

②擦除次数最少;

③最静态的区域。

2.3 块分配和关联数据集结

为了提高数据的读取效率,TrueFFS使用一种灵活的空间分配策略:将关联的数据(如由同一个文件的内容组成的多个块)集结到同一个单独擦除单元内的一段连续的区域中。为此,TrueFFS尽量在同一个擦除单元内维持一个由多个物理上连续的自由块组成的存储池。如果这样连续的存储池无法实现,TrueFFS分尽量保证池中的所有块是在同一个擦除单元内。如果连这样的情况也不可能的话,TrueFFS会尽量把块池分配到一个拥有最多可用空间的擦除单元内。

这种集结关联数据的途径有几个好处。首先,如果TrueFFS必须从一个小的存储窗口来访问Flash,那么这样集结了的关联数据可以减少调用映射物理块到该窗口的次数,加快了文件继续访问速度。其次,这种策略可以减少碎片的产生。这是因为删除一个文件可以释放掉更容易回收的完整块,意味着碎片回收会变得更快。另外,它可以使属于静态文件的多个块存放在同一地址,这样当损耗均稀算法决定移动静态区域时,转移这些块就变得更加容易了。

2.4 错误恢复

向Flash写数据有时可能会出错,比如在响应文件系统写请求时、碎片回收期间甚至在TrueFFS格式化或擦除Flash时。在这些情况下,TrueFFS能够从错误中恢复过来;但在新数据第一次写入Flash时如果出错就会丢失这些数据。然而,TrueFFS非常仔细地保证所有已经存放在Flash上的数据是可恢复的,甚至能够避免用户由于不耐烦或好奇而猛地拔出Flash卡而可能造成的灾难性后果。

TrueFFS健壮的关键是它使用了一种“先写后擦”的策略。当更新Flash一个扇区的数据时,只有在更新操作完成并且新存储的数据校验成功后,先前的数据才会被允许擦掉。这样的结果是数据扇区不能处于部分写状态。操作成功的话新扇区的数据有效,否则老扇区的数据有效。很明显,这样有利于用户已经写到Flash上的数据的稳定性。

3 编程

TrueFFS的编程主要在MTD层和Socket层。首先必须在当前VxWorks生成目录的配置文件(config.h)中定义:INCLUDE_TFFS(包含TrueFFS系统)、和INCLUDE_TFFS_SHOW(包含TrueFFS系统的显示函数)。

3.1 翻译层

翻译层根据Flash的实现技术来选择。设计中选用了SST公司的型号为SST49CF064的CF卡,64MB容量。它是基于NAND的Flash技术,所以在文件中定义INCLUDE_TL_NFTL;如果是NOR技术,则定义INCLUDE_TL_FTL。

3.2 MTD层

文件cfCardMTD.c实现了MTD层的功能。在本设计中,MTD层主要实现4个函数:读、写、擦除和ID识别。

ID识别函数根据读取设备的ID号来选择与当前设备匹配的MTD驱动。识别函数中指定了针对当前设备的一些参数以及基本操作函数,并赋给一个叫FLFlash的数据结构。

FLStatus cfMTDIdentify(FLFlash*pVol);

数据结构中的主要参数赋值如下:

pVol->type=CF_ID; /*器件ID号*/

pVol->erasableBlockSize=512;/*可擦除的最小单元是512B*/

pVol->chipSize=0x4000000;/*器件容量为64MB*/

pVol-write=cfWriteRoutine;/*写函数*/

pVol->read=cfReadRoutine;/*读函数*/

pVol->rease=cfEraseRoutine;/*擦函数*/

pVol->map=cfMap;/*将CF卡的一段区域映射到内存空间*/

CF卡的读函数比Flash的读函数繁琐。它和写一样,必须根据一定的算法来读取数据,而Flash只需要直接从地址中读数据。但是,CF卡的擦函数非常简单,直接返回就可以了。因为CF卡可以直接调用写命令写入数据,CF卡本身能够自动完成擦除操作。CfMap函数将CF卡的一段区域映射到存储空间,一般为4KB。因为CF卡的40MB地址空间并不映射到系统的存储空间中,映射可以加快系统访问CF卡的速度,而Flash的地址空间,所以Flash的MTD驱动中的该函数可以为空。

最后,识别函数必须在MTD驱动表单mtdTable[]中注册:

#ifdef INCLUDE_MTD_CFCARD

cfMTDIdentify,

#endif

并增加函数声明:extern FLStatus cfMTDIdentify (FLFlash vol).

3.3 Socket层

文件sysTffs.c实现了Socket层的功能。sysTffsInit()函数是主函数,调用Socket注册函数cfSocketRegister(),初始化Socket数据结构FLSocket。

LOCAL void cfSocketRegister (void){

FLSocket vol=flSocketOf(noOfDrives);

tffsSocket[noOfDrives]=“F”/*Socket名称*/

vol.window.baseAddress=CF_BASE_ADRS>>12;/*窗口的基地址*/

vol.cardDetected=cfCardDetected;/*检测CF卡是否存在的函数*/

vol.VccOn=cfVccOn;/*CF卡上电函数*/

vol.VccOff=cfVccOff;/*CF卡继电函数*/

vol.initSocket=cfInifSocket;/*CF卡初始化函数*/

vol.setMappingContext=cfSetMappingContext;/*CF卡映射函数*/

vol.getAndClearCardChangeIndicator=cfGetAndClearCard ChangeIndicator;/*设置改变函数*/

vol.writeProtected=cfWriteProtected;/*CF卡写保护判断函数*/

noOfDrives++;

}

其中,映射窗口的基地址以4KB为单位。TrueFFS系统每100ms调用CF卡检测函数,判断CF卡是否存在。CF卡上电函数和断电函数主要用于节省系统功耗,当CF卡出于闲置状态时,TrueFFS就关闭CF卡的电源。CF卡初始化函数负责

上一页  [1] [2] [3]  下一页

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:23,093.75000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号