YAFFS文件系统按“挨次”利用未分派的空间用于新的写进操作,并以一样“挨次”擦除烧毁的区块。写进和擦除操作,均按挨次正在未分派的空间或烧毁的空间中停止。当系统未用空间小于某一预设值后,系统将对存正在烧毁页的区块停止支受接管。那类写进和擦除战略正在必定水仄上了消耗的平均性。
NANDFlash器件每一个Block区块的擦写次数有限。正在需要及时记真的利用中,为器件寿命,应尽可能使每一个区块的擦写次数相对仄均,以最年夜水仄地耽误NANDFlash器件的利用寿命。此项测试记真每一个Block区块的擦写次数,以测试YAFFS文件系统正在平均消耗圆里的机能。
YAFFS-NAND文件系统,只供给上述的②和③两种文件体例。正在挨开文件时,若以“截短为0”的体例挨开已有文件,则体例为第②种,利用新文件完整取代旧文件。若以点窜的体例挨开己有文件,则体例为第③种,利用新加旧的体例。
②利用扩大体例,则要师长教师成一个SProInfo的对象,但将其指针传给yaffs_openEx()。封闭时一样要将其指针传给yaffs_closeEx()。例如:
根本上NOR比力开适存储法式代码,其容量普通较小(好比小于32MB),且价钱较高;而NAND容量可达1GB以上,价钱也相对自制,开适存储数据。普通来讲,128MB以下容量NANDFlash芯片的一页年夜小为512字节,用来寄存数据,每页还有16字节的备用空间(SpareData),充任OOB(OutOfBand)地区,用来存储ECC(ErrorCorrectionCode)校验/坏块标记等信息;再由若干页构成一个块,凡是是一块为32页(16KB)。与NOR比拟,NAND不是完整靠得住的。每块芯片出厂时许可有必定比例的坏块存正在,对数据的存取不是利用线性地点映照,而是经过存放器的操作串行存取数据。
yaffs_StartUp();
EOnlyOld、EOnlyNew、ENewOld和EDeult划分透露表现3种差别的体例和默许体例(由本文件系统供给)。SProInfo构造不但记真体例,还记真了该文件名,供封闭文件时利用。
//摹拟得降电完毕后从头挂接系统,并测试得降电文件的准确性
#endif
typedefenumEProMode{
摹拟一次“得降电”行动,需要停止特别的处置。现真的得降电行动正在电源从头供应后,全部系统会从头开端,包罗从头启动文件系统。得降电前系统的所有参数、系统堆源代码栈和现场均生效。正在测试中摹拟得降电行动有必定的难度,直接断电既不屈安,也不真际,可用exit()函数中断法式来摹拟。正在履行写操作时,写进随机的字节数后,用exit()函数立刻中断法式的运转;再从头启动法式,读取得降电时写进的文件,剖析文件以查抄文件系统新的得降电功效。
2YAFFS文件系统测试圆案整体设计
测试代码插进到CheckInit()和yaffs_FEEraseBlockInNAND()(yaffs_fileem.cpp)中,正在初初化器件摹拟文件时,生成(新摹拟文件)或读取(己有摹拟文件)擦写次数;并正在法式履行擦写函数时,对擦写次数停止累加和保留。
//以下检测File.poff的准确性
case0://无得降电环境
inth=yaffs_openEx(Name,O_CREATO_RDWR,S_IREADS_IWRITE,&pif);
Yaffs-NAND文件系统正在道理上决议了只能有上述的②和③两种文件体例。要供给第一种体例,需要对文件系统停止扩大,增添2个函数和2个构造体:
②用新文件完整取代旧文件(新文件写了几多就保存几多)。那类体例开适利用于文本的环境,好比短信。新短信固然不完备,但按照环境用户可以获得部门信息,若是收送圆信息完备或属于可猜想的环境,则可以要求收送圆重收。
4.5.2Spare区得降电不克不及恢复的点窜
typedefstructSProInfo{
EDeult,
intyaffs_openEx(signedcharpath,intoflag,intmode,SProInfoi_proInfo=NULL)
}
EOnlyNew,
//用文件句柄h对文件停止读写操作
break;
}
引行
#ifdefFS_TEST//测试代码段
}
3.3测试后果
4.3测试脚腕
测试代码随机收生得降电动静,摹拟一次得降电行动。测试代码插进到yaffs_FEWriteChunkToNAND()(yaffs_fileem.cpp)中,正在写Data区和Spare区时划分收生随机得降电,摹拟得降电行动。得降电后,法式从头挂接文件系统,并读取得降电时正正在更新的文件,与本文件比拟给出鉴定后果。
测试法式用WireOut0.log和WireOut1.log两个文件记真每一个Block区块的擦写次数,查看那两个文件,可以看到每一个区块的擦写次数和最年夜/最小值。两个文件是同等的,果测试工夫比力长,取两个文件以免系统正在写记真文件时得足,而丢得所有的记真;两个文件轮番写,最少有一个文件的内容是系统得足前比来的记真。
ENewOld,
yaffs_mount((signedchar)/Root);
4.5对YaffsNAND正在得降电圆里的改良
结语
write(g_filedisk,localData,512);
1.1NOR和NAND的比力
yaffs_StartUp();
1YAFFS文件系统概述
pif.proMode=EOnlyOld;//利用第一种体例
intyaffs_closeEx(intfd,SProInfoi_proInfo=NULL)
测试代码正在器件摹拟文件的每页的Spare区后,增添了字节,用于记真该页的擦写次数。果为擦写是以Block为单元停止的,是以每一个Block各页的擦写记真数是沟通的。正在今后的测试中,可以只利用第一页的该Block空间记真擦写次数,其他空间作其他测试用。
yaffs_unmount((signedchar)/Root);
yaffs_openEx()按照传进的体例,点窜挨开文件的标记,以隐式地设置本本的②、③两种体例。当体例为EOnlyOld时,yaffs_openEx()将挨开另中一个新的姑且文件,并返回给用户利用。传进的SProInfo构造的指针,将带回文件名和文件句柄,供封闭文件时用。yaffs_closeEx()函数正在封闭文件时,查抄文件的体例。若为第②、③种环境,则直接封闭;若为第一种环境,则先删除本文件,再把新文件从头定名,以到达文件的目标。
modify_in_a_file(/Root/File);
catch(inti_code){
SProInfopif;
}
case4://摹拟得降电行动,随机收生得降电时己写的字节数
4得降电恢复机能测试
//exit(0);
initialised=0;//为避免文件系统出差,置初初化标记为未初初化扔出非常,直接返回到文件系统加载处,跳过函数正常返回的进程
文件系统应能正在系统俄然断电的环境下,最年夜限度地恢复()有效数据。若是正在点窜一个文件时得降电,那末得降电后的文件体例按照现真环境可分为3种:
①用旧文件完整取代新写文件,新写文件(出写完)被疏忽。那类体例利用比力多,好比正在更新设置时得降电,利用得降电前的设置,用户是可以启受的。
case1:
switch(rand()%5){//随机收生20%的得降电率
4.2测试圆式
对源代码停止深切研讨,收现正在Spare区得降电不克不及恢复的题目出正在Spare区的Tag信息自查验部门。yaffs_GetTagsFromSpare()函数从Spare区读取Tag信息的进程中,挪用yaffs_CheckECCOnTags()查验Tag信息。然则,本代码对ECC校验毛病的Spare区,只是将毛病批改,并返回到上层函数;上层函数仅记真Tag得足次数,其真不做处置。是以,正在Spare区得降电时,会呈现弗成恢复的毛病。
③己写部门用新文件,未写部门用老文件,所谓“新加旧”的体例。那类体例可以利用正在动态更新的文件上。然则,对利用偏移量停止的文件读写操作,采取那类体例,会收生治码。
跟着嵌进式手艺正在种种电子产物中的普遍利用,嵌进式系统中的数据存储和办理已成为一个主要的研讨课题。Flash存储用具有速度快、容量年夜、本钱低等良多长处,是以正在嵌进式系统中被普遍用作中存储器件。嵌进式系统中的Flash存储器需要有本人的文件系统,而不克不及直接移植通用文件系统,尾要有两个缘由:第一,嵌进式系统的利用前提卑劣,电源电压不不变,突收性断电和不法插拔都轻易造难性的影响,通用文件系统对靠得住性的设计思索缺累;第两,通用文件系统的记真信息(如FAT表)需要被屡次点窜,而记真信息放正在Flash存储器流动的区块中,将致使该区块的频仍操作,从而缩短Flash器的利用寿命。如许就对硬件手艺提出了更高的要求。
摹拟得降电行动的焦点代码以下:
为了办理复纯的存储硬件,同时供给靠得住高效的存储,呈现了基于NAND和NOR的文件系统。今朝支流的FFS(FlashFileSystem)有以下3种:TrueFFS、JFFSx和YAFFS。YAFFS(YetAnotherFlashFileSystem)是专门为NANDFlash设计的嵌进式文件系统,开用于年夜容量的存储装备。它是日记构造的文件系统,供给了消耗均衡和得降电等机造,可以有用地减小上述缘由对文件系统分歧性和完备性的影响。本文恰是基于如许的条件,先容了闭于嵌进式YAFFS文件系统测试圆案,针对文件系统中消耗均衡和得降电两个主要的系统机能指标停止及时正在线的测试与剖析,差别的利用利用该文件系统应停止响应的点窜。
图1YAFFS文件系统数据的存储结构
try{
name=NULL;
proMode=EDeult;
利用圆式以下:
yaffs_mount((signedchar)/Root);
EProModeproMode;
break;
需要注重的是:正在数据区得降电的环境下,以上两种体例齐备,测试经过。但正在Spare区得降电的环境下,文件系统有很年夜的几率读不出得降电时的文件,险些不克不及正常利用。正在现真得降电环境中,按Data区和Spare区的比例闭系(512∶16),写操作得降电时产生正在Spare区的几率为3.03%,弗成启受。别的,文件系统不供给旧文件的体例,对那类利用(仍是比力多的)需要别的真现。
YAFFS按照NAND闪存以页为单元存取的特性,将文件组织成流动年夜小的数据段。使用NAND闪存供给的每页16字节的备用空间来寄存ECC查验信息和文件系统的组织信息,不但可以或许真现毛病检测和坏块处置,并且可以或许进步文件系统的加载速度。
4.4测试后果
close(g_filedisk);//己得降电,封闭磁盘摹拟文件
①利用默许体例,则与本文件系统利用圆式沟通。新参数默许为NULL,可以直接兼容己有代码。
3平均消耗测试
case2:
YAFFS将文件组织成流动年夜小(512字节)的数据段。每一个文件都有一个页里专门寄存文件头,文件头保留了文件的形式、所有者id、组id、长度、文件名等信息。为了进步文件数据块的查找速度,文件的数据段组织成树形构造。YAFFS正在文件停止改写时,老是先写进新的数据块,然后将旧的数据块从文件中删除。YAFFS利用寄存正在页里备用空间中的ECC停止毛病检测,呈现毛病后会停止必定次数的重试;屡次重试得利后,该页里就被截至利用。以(512+16)字节为一页的NANDFlash芯片为例,YAFFS文件系统数据的存储结构如图1所示。
嵌进式下对文件系统停止年夜量、长工夫的测试存正在良多题目,不容易真现,对测试代码的插进和数据的也比力坚苦。那里采取PC摹拟测试的情势,用文件的读/写摹拟NAND器件,并正在PC上对摹拟文件,以到达测试的目标。代码界说了种种NAND器件的类型,以顺应差别的器件。摹拟器件时,也用那些信息生成响应的摹拟文件。
yaffs_closeEx(h,&pif);
2.2摹拟文件的生成
write(g_filedisk,localData,rand()%512);
NANDFlash以其年夜容量、低价钱等优势敏捷成为嵌进式系统存储的新宠,是以其上的文件系统研讨也日趋普遍。本文扼要先容了经常使用的NANDFlash文件系统YAFFS,并针对YAFFS正在平均消耗和得降电恢复圆里停止正在线测试。正在给出测试后果的同时,侧重研讨嵌进式硬件测试圆案和圆式;对测试后果停止剖析,并提出改良圆案和开用。
//点窜一个文件(正在写文件时,每页会有20%的得降电率)
2.1测试整体申明
intfd;
NAND Flash上平均消耗与得降电恢复正在线测试2012-1-5源代码,闭头词NANDFlash平均消耗硬件测试YAFFS
throwint(0x01);
1.2YAFFS数据正在NAND上的存储体例
那类机造固然正在必定水仄上谦意平均消耗的要求,但仍是存正在题目,其真不开用于所有的嵌进式利用。假定正在一块16MB的NAND器件上,有10MB空间用来寄存相对流动、不常常点窜的数据文件,则常常点窜的文件只能正在剩下的6MB空间上反复擦写,正在那6MB空间上做到“平均消耗”。对全部器件来讲,系统并出有开适的搬移战略对流动文件停止搬移,全部器件做不到平均消耗。正在及时记真信息量比力年夜的利用中,应编写响应的搬移战略函数,对流动文件停止按期的搬移,以确保全部NAND器件的平均消耗。
}SProInfo;
4.1测试目标
YAFFS文件系统相似于JFFS/JFFS2文件系统。差别的是,JFFS1/2文件系统最初是针对NORFlash的利用场所设计的,而NORFlash和NANDFlash本量上有较年夜的区分。虽然JFFS1/2文件系统也能利用于NANDFlash,但果为它正在内存占用和启动工夫圆里针对NOR的特征做了一些弃取,所以对NAND来讲凡是是其真不是最优的圆案。
fd=-1;
EOnlyOld,
3.2测试圆式
poCode=i_code;
指明要摹拟的NAND器件的年夜小(FILE_SIZE_IN_MEG)和构造(BLOCKS_PER_MEG,BLOCK_SIZE)后,按应的年夜小和构造生成文件g_filedisk。
3.1测试目标
signedcharname;
SProInfo(){
点窜yaffs_GetTagsFromSpare()函数的返回类型为int,以返回Spare区的ECC校验毛病信息。当yaffs_CheckECCOnTags()返回Tag校验毛病时,yaffs_GetTagsFromSpare()函数将此毛病返回。正在挪用此函数的处所,停止响应的点窜:当Spare区ECC得足时,挪用yaffs_DeleteChunk(),删除该页。果得降电激收的Spare毛病弗成恢复的题目,经点窜后运转杰出。
poCode=0;
}EProMode;
测试法式用到的测试变量:记真擦写次数的数组-g_ersNumArray[FILE_SIZE_IN_MEGBLOCKS_PER_MEG]、指向擦写的最年夜值-g_pErsMax和指向擦写的最小值?g_pErsMin。
4.5.1增添体例
主控法式代码以下:
上述测试脚腕不开用于主动测试,也弗成妙脚工停止年夜量的测试。笔者正在该项测试中,奇妙地利用了try{}和catch{}构造,既摹拟了现真的得降电行动,又了主动测试的顺遂停止。
YAFFS文件系统是专门为NAND闪存而设计的,它使得价钱低廉的NAND闪存芯片具有了高效性和硬朗性;但YAFFS文件系统正在机能上还存正在着题目,其真不完整开用于对机能苛求的嵌进式系统。本文针对YAFFS文件系统中平均消耗和得降电恢复两个主要指标停止测试,给出了测试后果,并针对测试进程中存正在的部门题目提出了改良圆案。现真测试解释,改良后系统机能有明隐改良,能NAND Flash上平均消耗与得降电恢复正在线测试2012-1-5源代码顺应更多的利用。
对停止上述改良后的扩大圆式停止测试,后果同改良前;但增添了只保存旧文件的第一种体例,法式运转杰出。
copy_out_a_file(File.poff,(signedchar)/Boot/File);
case3:
法式用到的测试变量:得降电种别?g_tstPowerOff,1为Data区得降电,2为Spare区得降电。正在完整摹拟时,得降电种别随机收生。法式用TestLog.log记真得降电后鉴定的后果。TestLog.log为增添体例挨开,新记真写正在最后,不影响本本的记真后果。
YAFFS文件系统是开源的,测试基于白盒测试。正在所闭心的代码段中,插进测试代码。为测试代码过错本代码造成影响,测试后可立刻恢复为本代码,所有测试代码(包罗测试用变量和函数)均嵌进到#defineFS_TEST宏界说中。
|
QQ空间代码 使用方法: 一、登录你的QQ空间; P.S.“QQ空间特区”每天都有精彩奉献给你! |