您可以添加到网摘 让更多人关注此文章:

EOnlyOld、EOnlyNew、ENewOld和EDefault分别表示3种不同的保护方式和默认保护方式(由原文件系统提供)。SProInfo结构不仅记录保护方式,还记录了该文件名,供关闭文件时使用。
yaffs_openEx()根据传入的保护方式,修改打开文件的标志,以显式地设置原有的②、③两种保护方式。当保护方式为EOnlyOld时,yaffs_openEx()将打开另一个新的临时文件,并返回给用户使用。传入的SProInfo结构的指针,将带回文件名和文件句柄,供关闭文件时用。yaffs_closeEx()函数在关闭文件时,检查文件的保护方式。若为第②、③种情况,则直接关闭;若为第一种情况,则先删除原文件,再把新文件重新命名,以达到文件保护的目的。
使用方法如下:
① 使用默认方式,则与原文件系统使用方法相同。新参数默认为NULL,可以直接兼容己有代码。 ② 使用扩展方式,则要先生成一个SProInfo的对象,但将其指针传给yaffs_openEx()。关闭时同样要将其指针传给yaffs_closeEx()。例如:
SProInfo pif; pif.proMode=EOnlyOld;//使用第一种保护方式 int h=yaffs_openEx(Name, O_CREAT | O_RDWR, S_IREAD | S_IWRITE, &pif); //用文件句柄h对文件进行读写操作 yaffs_closeEx(h, &pif);
对进行上述改进后的扩展方法进行测试,结果同改进前;但增加了只保留旧文件的第一种保护方式,程序运行良好。
4.5.2 Spare区掉电不能恢复的修改
对源代码进行深入研究,发现在Spare区掉电不能恢复的问题出在Spare区的Tag信息自检验部分。yaffs_GetTagsFromSpare()函数从Spare区读取Tag信息的过程中,调用yaffs_CheckECCOnTags()检验Tag信息。但是,原代码对ECC校验错误的Spare区,只是将错误修正,并返回到上层函数;上层函数仅记录Tag出错次数,并不做处理。因此,在Spare区掉电时,会出现不可恢复的错误。
修改yaffs_GetTagsFromSpare()函数的返回类型为int,以返回Spare区的ECC校验错误信息。当yaffs_CheckECCOnTags()返回Tag校验错误时,yaffs_GetTagsFromSpare()函数将此错误返回。在调用此函数的地方,进行相应的修改: 当Spare区ECC出错时,调用yaffs_DeleteChunk(),删除该页。因掉电引发的Spare错误不可恢复的问题,经修改后运行良好。
结语
YAFFS文件系统是专门为NAND闪存而设计的,它使得价格低廉的NAND闪存芯片具有了高效性和健壮性;但YAFFS文件系统在性能上还存在着问题,并不完全适用于对性能苛求的嵌入式系统。本文针对YAFFS文件系统中均匀损耗和掉电恢复两个重要指标进行测试,给出了测试结果,并针对测试过程中存在的部分问题提出了改进方案。实际测试表明,改进后系统性能有明显改善,能适应更多的应用环境。
参考文献
[1] 沈建华,罗悦怿. 基于NAND Flash的FFS设计与实现[J]. 计算机应用与软件,2005(6). [2] 罗赟赛,李项军,赵锡凑,等. NAND闪存在嵌入式Linux信息代理中的实现[J]. 仪器仪表用户,2005(5). [3] 毛勇强,黄光明. YAFFS文件系统在嵌入式Linux上的实现[J]. 电子设计应用,2006(1). [4] 孙天亮,陈伟元,王豪才. 嵌入式系统中K9F5608U0M NAND闪速存储器的应用[J]. 单片机与嵌入式系统应用2002年合订本(7~12),2002. [5] 吴娴. 一个嵌入式Linux文件系统的优化[J]. 计算机应用与软件,2005(7).
胡一飞、谢世环(硕士研究生),主要研究方向为嵌入式软件测试; 徐中伟(教授、博士生导师),主要研究方向为安全软件测试与评估。
|