版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页NANDFlash上均匀损耗与掉电恢复在线测试NANDFlash以其大容量、低价格等优势迅速成为嵌入式系统存储的新宠,因此其上的文件系统研究也日益广泛。本文简要介绍了常用的NANDFlash文件系统YAFFS,并针对YAFFS在均匀损耗和掉电恢复方面进行在线测试。在给出测试结果的同时,着重研究嵌入式软件测试方案和方法;对测试结果进行分析,并提出改进方案和适用环境。
关键词NANDFlash均匀损耗软件测试YAFFS
引言
随着嵌入式技术在各种电子产品中的广泛应用,嵌入式系统中的数据存储和管理已经成为一个重要的研究课题。Flash存储器具有速度快、容量大、成本低等很多优点,因此在嵌入式系统中被广泛用作外存储器件。嵌入式系统中的Flash存储器需要有自己的文件系统,而不能直接移植通用文件系统,主要有两个原因:第一,嵌入式系统的应用条件恶劣,电源电压不稳定,突发性断电以及非法插拔都容易造成灾难性的影响,通用文件系统对于可靠性的设计考虑不足;第二,通用文件系统的记录信息(如FAT表)需要被多次修改,而记录信息放在Flash存储器固定的区块中,将导致该区块的频繁操作,从而缩短Flash器的使用寿命。这样就对软件技术提出了更高的要求。
为了管理复杂的存储硬件,同时提供可靠高效的存储环境,出现了基于NAND和NOR的文件系统。目前主流的FFS(FlashFileSystem)有如下3种:TrueFFS、JFFSx以及YAFFS。YAFFS(YetAnotherFlashFileSystem)是专门为NANDFlash设计的嵌入式文件系统,适用于大容量的存储设备。它是日志结构的文件系统,提供了损耗平衡和掉电保护等机制,可以有效地减小上述原因对文件系统一致性和完整性的影响。本文正是基于这样的前提,介绍了关于嵌入式YAFFS文件系统测试方案,针对文件系统中损耗平衡和掉电保护两个重要的系统性能指标进行实时在线的测试与分析,不同的应用环境使用该文件系统应进行相应的修改。
1YAFFS文件系统概述
YAFFS文件系统类似于JFFS/JFFS2文件系统。不同的是,JFFS1/2文件系统最初是针对NORFlash的应用场合设计的,而NORFlash和NANDFlash本质上有较大的区别。尽管JFFS1/2文件系统也能应用于NANDFlash,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。
1.1NOR和NAND的比较
基本上NOR比较适合存储程序代码,其容量一般较小(比如小于32MB),且价格较高;而NAND容量可达1GB以上,价格也相对便宜,适合存储数据。一般来说,128MB以下容量NANDFlash芯片的一页大小为512字节,用来存放数据,每一页还有16字节的备用空间(SpareData),充当OOB(OutOfBand)区域,用来存储ECC(ErrorCorrectionCode)校验/坏块标志等信息;再由若干页组成一个块,通常一块为32页(16KB)。与NOR相比,NAND不是完全可靠的。每块芯片出厂时允许有一定比例的坏块存在,对数据的存取不是使用线性地址映射,而是通过寄存器的操作串行存取数据。
1.2YAFFS数据在NAND上的存储方式
YAFFS根据NAND闪存以页为单位存取的特点,将文件组织成固定大小的数据段。利用NAND闪存提供的每页16字节的备用空间来存放ECC检验信息和文件系统的组织信息,不仅能够实现错误检测和坏块处理,而且能够提高文件系统的加载速度。
YAFFS将文件组织成固定大小(512字节)的数据段。每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名等信息。为了提高文件数据块的查找速度,文件的数据段组织成树形结构。YAFFS在文件进行改写时,总是先写入新的数据块,然后将旧的数据块从文件中删除。YAFFS使用存放在页面备用空间中的ECC进行错误检测,出现错误后会进行一定次数的重试;多次重试失败后,该页面就被停止使用。以(512+16)字节为一页的NANDFlash芯片为例,YAFFS文件系统数据的存储布局如图1所示。
图1YAFFS文件系统数据的存储布局
2YAFFS文件系统测试方案总体设计
2.1测试总体说明
YAFFS文件系统是开源的,测试基于白盒测试。在所关心的代码段中,插入测试代码。为保证测试代码不对原代码造成影响,测试后可立即恢复为原代码,所有测试代码(包括测试用变量和函数)均嵌入到#defineFS_TEST宏定义中。
2.2模拟文件的生成
嵌入式环境下对文件系统进行大量、长时间的测试存在很多问题,不易实现,对测试代码的插入和数据的监视也比较困难。这里采用PC模拟测试的形式,用文件的读/写模拟NAND器件,并在PC上对模拟文件监视,以达到测试的目的。代码定义了各种NAND器件的类型,以适应不同的器件。模拟器件时,也用这些信息生成相应的模拟文件。
指明要模拟的NAND器件的大小(FILE_SIZE_IN_MEG)和结构(BLOCKS_PER_MEG,BLOCK_SIZE)后,按照相应的大小和结构生成文件g_filedisk。
3均匀损耗测试
3.1测试目的
NANDFlash器件每个Block区块的擦写次数有限。在需要实时记录的应用环境中,为保证器件寿命,应尽量使每个区块的擦写次数相对平均,以最大程度地延长NANDFlash器件的使用寿命。此项测试记录每个Block区块的擦写次数,以测试YAFFS文件系统在均匀损耗方面的性能。
3.2测试方法
测试代码在器件模拟文件的每一页的Spare区后,增加了字节,用于记录该页的擦写次数。由于擦写是以Block为单位进行的,因此每个Block各页的擦写记录数是相同的。在以后的测试中,可以只使用第一页的该Block空间记录擦写次数,其他空间作其他测试用。
测试代码插入到CheckInit()和yaffs_FEEraseBlockInNAND()(yaffs_fileem.cpp)中,在初始化器件模拟文件时,生成(新模拟文件)或读取(己有模拟文件)擦写次数;并在程序执行擦写函数时,对擦写次数进行累加和保存。
测试程序用到的测试变量:记录擦写次数的数组-g_ersNumArray[FILE_SIZE_IN_MEG*BLOCKS_PER_MEG]、指向擦写的最大值-g_pErsMax和指向擦写的最小值?g_pErsMin。
测试程序用WireOut0.log和WireOut1.log两个文件记录每个Block区块的擦写次数,查看这两个文件,可以看到每个区块的擦写次数以及最大/最小值。两个文件是等同的,因测试时间比较长,取两个文件以避免系统在写记录文件时出错,而丢失所有的记录;两个文件轮流写,保证至少有一个文件的内容是系统出错前最近的记录。
3.3测试结果
YAFFS文件系统按“顺序”使用未分配的空间用于新的写入操作,并以同样“顺序”擦除废弃的区块。写入和擦除操作,均按顺序在未分配的空间或废弃的空间中进行。当系统未用空间小于某一预设值后,系统将对存在废弃页的区块进行回收。这种写入和擦除策略在一定程度上保证了损耗的均匀性。
这种机制虽然在一定程度上满足均匀损耗的要求,但还是存在问题,并不适用于所有的嵌入式应用环境。假设在一块16MB的NAND器件上,有10MB空间用来存放相对固定、不经常修改的数据文件,则经常修改的文件只能在剩下的6MB空间上重复擦写,在这6MB空间上做到“均匀损耗”。对整个器件来说,系统并没有合适的搬移策略对固定文件进行搬移,整个器件做不到均匀损耗。在实时记录信息量比较大的应用环境中,应编写相应的搬移策略函数,对固定文件进行定期的搬移,以确保整个NAND器件的均匀损耗。
4掉电恢复性能测试
4.1测试目的
文件系统应能保证在系统突然断电的情况下,最大限度地恢复(保护)有用数据。如果在修改一个文件时掉电,那么掉电后的文件保护方式根据实际情况可分为3种:
①用旧文件完全代替新写文件,新写文件(没写完)被忽略。这种保护方式应用比较多,比如在更新设置时掉电,使用掉电前的设置,用户是可以接受的。
②用新文件完全代替旧文件(新文件写了多少就保留多少)。这种保护方式适合应用于文本的情况,比如短信。新短信虽然不完整,但根据情况用户可以得到部分信息,如果发送方信息完整或属于可猜测的情况,则可以要求发送方重发。
③己写部分用新文件,未写部分用老文件,所谓“新加旧”的保护方式。这种保护方式可以应用在动态更新的文件上。但是,对于使用偏移量进行的文件读写操作,采用这种保护方式,会产生乱码。
4.2测试方法
测试代码随机产生掉电消息,模拟一次掉电行为。测试代码插入到yaffs_FEWriteChunkToNAND()(yaffs_fileem.cpp)中,在写Data区和Spare区时分别产生随机掉电位置,模拟掉电行为。掉电后,程序重新挂接文件系统,并读取掉电时正在更新的文件,与原文件相比给出判定结果。
程序用到的测试变量:掉电类别?g_tstPowerOff,1为Data区掉电,2为Spare区掉电。在完全模拟时,掉电类别随机产生。程序用TestLog.log记录掉电后判定的结果。TestLog.log为增加方式打开,新记录写在最后,不影响原有的记录结果。
4.3测试手段
模拟一次“掉电”行为,需要进行特殊的处理。实际的掉电行为在电源重新供给后,整个系统会重新开始,包括重新启动文件系统。掉电前系统的所有参数、系统堆栈以及现场均失效。在测试中模拟掉电行为有一定的难度,直接断电既不安全,也不现实,可用exit()函数中止程序来模拟。在执行写操作时,写入随机的字节数后,用exit()函数立即中止程序的运行;再重新启动程序,读取掉电时写入的文件,分析文件以检查文件系统新的掉电保护功能。
上述测试手段不适用于自动测试,也不可能手工进行大量的测试。笔者在该项测试中,巧妙地使用了try{}和catch{}结构,既模拟了实际的掉电行为,又保证了自动测试的顺利进行。
模拟掉电行为的核心代码如下:
#ifdefFS_TEST//测试代码段
switch(rand()%5){//随机产生20%的掉电率
case0://无掉电情况
case1:
case2:
case3:
write(g_filedisk,localData,512);
break;
case4://模拟掉电行为,随机产生掉电时己写的字节数
write(g_filedisk,localData,rand()%512);
close(g_filedisk);//己掉电,关闭磁盘模拟文件
initialised=0;//为防止文件系统出差,置初始化标志为未初始化抛出异常,直接返回到文件系统加载处,跳过函数正常返回的过程
throwint(0x01);
//exit(0);
break;
}
#endif
主控程序代码如下:
yaffs_StartUp();
yaffs_mount((signedchar*)"/Root");
poCode=0;
try{
//修改一个文件(在写文件时,每页会有20%的掉电率)
modify_in_a_file("/Root/File");
}
catch(inti_code){
poCode=i_code;
}
//模拟掉电结束后重新挂接系统,并测试掉电文件的正确性
yaffs_StartUp();
yaffs_mount((signedchar*)"/Root");
copy_out_a_file("File.poff",(signedchar*)"/Boot/File");
yaffs_unmount((signedchar*)"/Root");
//以下检测File.poff的正确性
4.4测试结果
YAFFS-NAND文件系统,只提供上述的②和③两种文件保护方式。在打开文件时,若以“截短为0”的方式打开已有文件,则保护方式为第②种,使用新文件完全代替旧文件。若以修改的方式打开己有文件,则保护方式为第③种,使用新加旧的保护方式。
需要注意的是:在数据区掉电的情况下,以上两种保护方式完好,测试通过。但在Spare区掉电的情况下,文件系统有很大的概率读不出掉电时的文件,几乎不能正常使用。在实际掉电情况中,按Data区和Spare区的比例关系(512∶16),写操作掉电时发生在Spare区的概率为3.03%,不可接受。另外,文件系统不提供旧文件的保护方式,对于这类应用(还是比较多的)需要另外实现。
4.5对YaffsNAND在掉电保护方面的改进
4.5.1增加保护方式
Yaffs-NAND文件系统在原理上决定了只能有上述的②和③两种文件保护方式。要提供第一种保护方式,需要对文件系统进行扩展,增加2个函数和2个结构体:
intyaffs_openEx(signedchar*path,intoflag,intmode,SProInfo*i_proInfo=NULL)
intyaffs_closeEx(intfd,SProInfo*i_proInfo=NULL)
typedefenumEProMode{
EOnlyOld,
EOnlyNew,
ENewOld,
EDefault,
}EProMode;
typedefstructSProInfo{
EProModeproMode;
signedchar*name;
intfd;
SProInfo(){
proMode=EDefault;
name=NULL;
fd=-1;
}
}SProInfo;
EOnlyOld、EOnlyNew、ENewOld和EDefault分别表示3种不同的保护方式和默认保护方式(由原文件系统提供)。SProInfo结构不仅记录保护方式,还记录了该文件名,供关闭文件时使用。
yaffs_openEx()根据传入的保护方式,修改打开文件的标志,以显式地设置原有的②、③两种保护方式。当保护方式为EOnlyOld时,yaffs_openEx()将打开另一个新的临时文件,并返回给用户使用。传入的SProInfo结构的指针,将带回文件名和文件句柄,供关闭文件时用。yaffs_closeEx()函数在关闭文件时,检查文件的保护方式。若为第②、③种情况,则直接关闭;若为第一种情况,则先删除原文件,再把新文件重新命名,以达到文件保护的目的。
使用方法如下:
①使用默认方式,则与原文件系统使用方法相同。新参数默认为NULL,可以直接兼容己有代码。
②使用扩展方式,则要先生成一个SProInfo的对象,但将其指针传给yaffs_openEx()。关闭时同样要将其指针传给yaffs_closeEx()。例如:
SProInfopif;
Mode=EOnlyOld;//使用第一种保护方式
inth=yaffs_openEx(Name,O_CREAT|O_RDWR,S_IREAD|S_IWRITE,
//用文件句柄h对文件进行读写操
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年松原货运从业资格证模拟考
- 2025年咸阳下载b2货运从业资格证模拟考试考试
- 2025年宁波货运从业资格证考试模拟
- 2025年庆阳运输从业资格证考试技巧
- 2025年河南道路货运输从业资格证模拟考试题库
- 2025年三明货运从业资格模拟考
- 2024年度二手房交易安全保障合同样本3篇
- 医药代表聘用合同样本
- 航空公司返聘退休地勤劳务合同
- 中式餐厅吊顶施工合同
- 《计算机组成原理》全册详解优秀课件
- 五官科眼耳鼻咽喉科医疗常用器械的认识
- 企业清产核资报表
- 2023年山东商务职业学院招考聘用36人笔试历年高频考点试题含答案附详解
- 平凡之路歌词全文
- 2024年全国硕士研究生考试《英语二》模拟试卷一
- 医疗安全不良事件
- 培训提问(讨论)记录表
- 材料科学基础ppt上海交通大学演示文稿
- 2022年北京语言大学各单位新编长聘人员招聘需求笔试备考题库及答案解析
- 《蛋糕裱花必修技术》PPT完整版
评论
0/150
提交评论