微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > NAND Flash上均匀损耗与掉电恢复在线测试

NAND Flash上均匀损耗与掉电恢复在线测试

时间:04-27 来源:微计算机信息网 点击:

模拟文件。
指明要模拟的NAND器件的大小(FILE_SIZE_IN_MEG)和结构(BLOCKS_PER_MEG,BLOCK_SIZE)后,按照相应的大小和结构生成文件g_filedisk。

3 均匀损耗测试
3.1 测试目的
NAND Flash器件每个Block区块的擦写次数有限。在需要实时记录的应用环境中,为保证器件寿命,应尽量使每个区块的擦写次数相对平均.以最大程度地延长NAND Flash器件的使用寿命。此项测试记录每个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和WireOutl.log两个文件记录每个Block区块的擦写次数,查看这两个文件,可以看到每个区块的擦写次数以及最大/最小值。两个文件是等同的,因测试时间比较长,取两个文件以避免系统在写记录文件时出错,而丢失所有的记录;两个文件轮流写,保证至少有一个文件的内容是系统出错前最近的记录。
3.3 测试结果
YAFFS文件系统按"顺序"使用未分配的空间用于新的写入操作,并以同样"顺序"擦除废弃的区块。写入和擦除操作,均按顺序在未分配的空间或废弃的空间中进行。当系统未用空间小于某一预设值后,系统将对存在废弃页的区块进行回收。这种写入和擦除策略在一定程度上保证了损耗的均匀性。
这种机制虽然在一定程度上满足均匀损耗的要求,但还是存在问题,并不适用于所有的嵌入式应用环境。假设在一块16MB的NAND器件上,有10MB空间用来存放相对固定、不经常修改的数据文件,则经常修改的文件只能在剩下的6 MB空间上重复擦写,在这6 MB空间上做到"均匀损耗"。对整个器件来说,系统并没有合适的搬移策略对固定文件进行搬移,整个器件做不到均匀损耗。在实时记录信息量比较大的应用环境中,应编写相应的搬移策略函数,对固定文件进行定期的搬移,以确保整个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()函数立即中止程序的运行;再重新启动程序,读取掉电时写入的文件,分析文件以

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top