CN100407336C - 一种嵌入式系统中非易失性存储器的数据存取方法 - Google Patents
一种嵌入式系统中非易失性存储器的数据存取方法 Download PDFInfo
- Publication number
- CN100407336C CN100407336C CN200510019862XA CN200510019862A CN100407336C CN 100407336 C CN100407336 C CN 100407336C CN 200510019862X A CN200510019862X A CN 200510019862XA CN 200510019862 A CN200510019862 A CN 200510019862A CN 100407336 C CN100407336 C CN 100407336C
- Authority
- CN
- China
- Prior art keywords
- section
- piece
- file
- data
- flash
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种嵌入式系统中非易失性存储器的数据存取方法。按照Flash中的物理结构将其存储器分为一个以上的段,并给予唯一编号,在每段内划分有一个以上的逻辑块,在段内给予有效块唯一编号,对存储器中段的擦除都是循环交替进行的,Flash中每一段的擦除次数都相同,实现了对Flash的均匀磨损和断电保护,文件系统的操作不依赖于Flash型号和存储在Flash中的数据,通用性、移植性好、能有效延长Flash使用寿命,文件系统及数据基本不受意外断电的影响,并能对意外损坏的数据进行恢复。
Description
技术领域
本发明涉及嵌入式数据库领域,具体地是指使用Flash作为非易失性数据存储器的嵌入式系统中存储器的数据存取方法。
背景技术
Flash以其速度快和非易失性广泛地应用于嵌入式系统中。Flash有如下特点:
1、读Flash操作和读RAM是相同的(写和擦除操作后的读操作需要在读操作前复位);
2、写Flash操作只能把Flash中数据从“1”变到“0”(Bit);
3、擦除操作可以把“0”变成“1”,但擦除操作只能针对整段进行,一段一般是64KByte左右。
4、每段的擦除寿命有限,一般是每段可以擦除10万次。
目前,对Flash的读写都是调用底层的函数直接对Flash进行操作。对Flash中的数据进行改变时,必须先把相应的一段数据全部读入RAM,对RAM进行修改,然后擦除该段,最后再把RAM中的数据写入该段(以下简称读擦除写操作)。这样做有几个缺点:
1、当存入Flash中的数据结构(以下简称数据结构)比较复杂时,软件很难维护。
2、当数据结构或Flash型号发生改变时,必须重新编写软件。
3、对Flash中数据的改变,即使是只有一个Bit,也得对整个Flash进行擦除。这样做既会增加时间,也会减少Flash寿命。变化很频繁的数据只在整个Flash中占很小一部分,若对该数据所在的段频繁擦除,则该段很容易达到它的寿命,从而导致软件无法运行,也就是产品无法再使用了。
4、在进行读擦除写操作时,如果发生意外断电,则Flash中的数据很有可能会丢失或损坏,从而导致软件无法运行或死机。
中国专利公开号:CN 1581109A,公开日:2005年2月16日,发明名称为《一种刷新嵌入式系统中非易失性存储器的方法》,提出了将存储器划分逻辑块,对逻辑块进行编号,借助标志,系统每刷新完一逻辑块都作一次记录,即使系统在刷新过程中意外中断,也可在下次刷新操作时从中断位置开始,而不需要对已成功刷新的逻辑块进行重复的数据写入的技术方案。减少了对存储单元的刷新次数,降低了坏块的危险性,提高了存储器的使用寿命。但该技术方案没有改变存储器中在原位置进行刷新的操作方式。某个数据的频繁变化及刷新,对其所在存储单元使用寿命的影响要远大于因断电而导致增加刷新次数所带来的影响。因此,该技术方案对存储器使用寿命的提高较小,坏块的危险性依然较高。同时,也难以降低因意外断电而导致存储器中数据丢失或损坏的风险。
发明内容
为了解决目前对Flash操作中存在的编程复杂、移植性差、寿命短和意外断电数据易被损坏问题,本发明提供了一种嵌入式系统中非易失性存储器Flash的数据存取方法。该方法能延长存储器的使用寿命、能对意外断电损坏的数据进行恢复,且通用性、移植性好。
本发明解决其技术问题所采用的技术方案是:一种嵌入式系统中非易失性存储器的数据存取方法,包括以下步骤:
A.按照Flash中的物理结构将其存储器划分为一个以上的段,根据段的起始地址从小到大给有效段唯一编号,段编号存储于段本身中,在每段内划分有一个以上的逻辑块,在段内有效块唯一编号,块编号存储于块本身中;
B.按照段和块的编号顺序从小到大存储或更新块内文件,更新时,在段号最大的段中寻找未使用的空块,把原块中的数据经过修改后复制到该空块中,在对数据进行修改时,将原块中的数据复制到RAM中,在系统外进行修改后,再写入空块中,原块的编号也一并复制到该空块中,使之成为有效块,将原块标记为无效块,当段号最大的段中的空块使用完时,则按照从小到大的编号顺序寻找新的空段,在新的空段中寻找空块进行文件存储或更新操作;
C.当只剩下一个空段时,则在所有旧段中寻找无效块,若所有旧段中均无无效块,这时存储器空间已满,停止文件存储或更新操作;若寻找到带有无效块的段则执行步骤D;
D.对带有无效块的旧段进行整理,把旧段中的有效块复制到新的空段中,把该空段编号为存储器中最大段号加一,把旧段的物理地址写入新段中,然后擦除旧段,将旧段标记为空段,再执行步骤B。
本发明在步骤B中进一步包括以下步骤:
B1在对块进行文件更新操作前对块进行操作前标记,在操作完成时对块进行操作完成标记,在对段进行操作前对段进行操作前标记,在操作完成时对段进行操作完成标记;
B2在系统重新启动时对块和段进行扫描,若发现有操作前标记没有操作完成标记的块号相同的两个有效块时,如果块号相同的两个块在同一段中,则靠后面的块为有效块,前面的块为无效块;如果块号相同的两个块不在同一段中,则指定段号大的段中的块为有效块,段号小的段中的块为无效块;
B3对有效块重复步骤B1。
本发明的步骤A中所划分各段的大小是相同的,各块的大小也是相同的,段的大小为64KB至256KB,块的大小为256B至1024B。
本发明的有益效果:一是保证了不论修改存储器中的什么数据,即使是对同一数据的不停修改,对存储器中段的擦除都是循环交替进行的,Flash中每一段的擦除次数都相同(最多只相差一次)。与原有Flash中在原位置上不断擦除并写入某经常修改数据的方式相比,本发明方法所采用的由原块向空块步进似的擦除方式,实现了对Flash的均匀磨损,而不会是某段擦除寿命到了,其他块或段还没被擦除几次。使用了均匀磨损后,Flash的寿命大大延长,如果是在那些经常修改数据的情况下应用,Flash寿命的延长就显得更加明显。二是可以实现断电后数据的恢复。通过将数据复制到RAM中,在系统外进行修改后,再写入空块中的操作,在数据更新的同时,较好地保存了原块的原始数据直至修改后的数据写入空块以后,才擦除原块中的数据。如可在系统重新启动时对块和段进行扫描,若块(或段)只有操作前标记而没有操作完成标记,则可知此块(或段)在上次操作时发生意外断电。即可把断电前的相同块(段)号的旧块(段),复制到新的空块中并标记为有效,从而实现断电数据恢复。能保证在任何意外掉电的情况下,不使Flash里的文件系统混乱,并尽可能保证文件内容不丢失。也就是说,本发明可以保证在任何一个写Flash的操作中,当发生意外掉电时,文件系统不乱。三是将存储器内的数据调入独立的文件处理系统即根据本发明方法设计的FFS文件系统进行修改,FFS文件系统的实现不依赖于Flash的型号和Flash中存储的数据。FFS文件系统可以在不同系统间方便移植,通用性好。
附图说明
图1是Flash数据结构图
图2是Flash文件结构图
图3是CPU的RAM中文件结构树图
图4是本发明方法中文件创建的过程图
图5是本发明方法中寻找空块的过程图
图6是本发明方法中删除文件的过程图
具体实施方式
以下结合附图说明的具体实施方式对本发明作进一步的详细描述:
本发明方法可以直接用于存储器内的文件处理系统中,但由于Flash的型号较多,数据结构比较复杂,通用性较差,系统的设计和维护不够方便。
申请人采用本发明方法设计了用于嵌入式系统中非易失性存储器的FFS(Flash File System)文件处理系统。现结合该文件处理系统的设计对本发明方法作深入地介绍。
参见图1,本发明的Flash数据结构分为一个以上的段,根据段的起始地址从小到大给有效段唯一编号,段编号存储于段本身中,每一个段中又分为一个以上的块,在段内给有效块唯一编号,块编号存储于块本身中。其中段头和块头的设计如下:
一.段头(Sector Head)
段头长256字节,由以下几个部分组成:
1.文件系统标识(8字节字符串)
值为“FFSbyHB”,表示此段为本文档所定义的文件系统中的一部分。
2.文件系统版本号(2字节无符号整型)
当前版本号为0x0301
3.状态(2字节比特串MSB先,缺省值为“1”)
1)段整理开始:1Bit
2)段整理结束:1Bit
3)段无空块:1Bit
4)段有无效块:1Bit
5)擦除旧段开始:1Bit
6)擦除旧段结束:1Bit
7)写段号开始:1Bit
8)写段号结束:1Bit
9)保留:8~1Bits
4.段号(4字节无符号整型)
段号是唯一的,段号大的段的最后写操作时间比段号小的段晚。空段的
段号为0xFFFFFFFF。
5.旧段物理地址(4字节无符号整数)
6.保留(21~256字节)
二.块头(Block Head)
1.块号(2字节无符号整型,不能为”0”)
块号在一个文件系统中唯一标识一个块。在有效块中(段的有效标识见下文)块号是唯一的。意外断电有可能导致块号相同的两个有效块,如果两块在同一段中,后面的块有效,前面的块无效;如果在不同的段中,段号大的块有效,段号小的块无效。空块的块号为0xFFFF。
2.同一文件或目录中下一块的块号(2字节无符号整型)
文件的最后一块此段为0xFFFF
3.此块中有效数据的长度(1字节无符号整型)注:目录不需要说明长度
4.状态(1字节比特串MSB先,缺省值为“1”)
1)块写操作开始:1Bit
2)块写操作结束:1Bit
3)修改下一块的块号开始:1Bit
4)修改下一块的块号结束:1Bit
5)文件第一次加入数据开始:1Bit
6)文件第一次加入数据结束:1Bit
7)块无效:1Bit
8)文件或目录的第一块:1Bit
参见图2,图2中介绍了Flash的文件结构,(1)块头、“3/5”表示当前块号/下一块号,(2)文件头,(3)有效数据,(4)未用空间:
三.文件头:
1.文件属性(1字节比特串MSB先)
1)文件还是目录:1Bit“1”文件“0”目录
2)只读:1Bit
3)存档:1Bit
4)系统:1Bit
5)隐藏:1Bit
6)保留:3~1Bits
2.文件名(31字节“0”结尾字符串)
文件和目录除了1Bit的标志外其他都一样,目录是一种特殊的文件,目录的文件头存放目录名和目录属性,目录的文件数据中存放直接属于该目录的目录和文件的第一块的块号。目录数据的分配可以整块进行,因为0xFFFF是无效块号,而且0xFFFF可以被改写为任何块号。
四.目录里存放的路径的格式:(4Byte)
1.状态:(1字节比特串Msb先)
1)写block num开始:1bit
2)写block num结束:1bit
3)擦除block num开始:1bit
4)擦除block num结束:1bit
5)删除原来的路径开始:1bit(for movefile)
6)删除原来的路径结束:1bit(for movefile)
7)保留:(1Byte)
2.子文件\目录的第一个block num:2byte
所有的路径的表示:root/dir name/…/file name
注意:都用“/”隔断,所有的文件、目录都从root开始。
五、名词解释
1.段:物理上,Flash中的一段(Sector),一般为64KB左右。
2.块:逻辑上,文件分块存放于段中,块大小为256B。
3.空块:未使用的块。
4.空段:所有块都为空块的段。
六、段和块的操作
1.格式化
段格式化为空段,即擦除所有的段。
段中的块全为空块,既块头和块数据全为0xFF。
2.块的读操作
块的读操作和读RAM一样,不允许同时读写,在写和擦除后要进行复位操作,之后才能读。
3.块的写操作
要避免只针对块的某一个字节进行写操作,这样会引起对Flash的频繁写操作。写操作在RAM中缓存,为每个打开的文件分配一个和Flash块大小相同的RAM块,写前把当前用户正准备操作的Flash块中的数据和块头拷入RAM块中。当RAM块写满或用户跳到另外一个Flash块或文件关闭时,才把RAM块中的数据写进Flash。写Flash,只可以把“1”变为“0”。
块写前先要找到一个空块,在最大段号段中寻找第一个空块,若最大段号段中无空块,则把此段的“段无空块”标记为0,并找到下一个空段,并把此空段的“段号”设为Flash中最大段号加一,并在此空段中寻找第一个空块。
然后把空块的“块写操作开始”标记为0,然后把RAM块中的数据和块头写入此空块,把此块中的有效数据长度写入空块的“此块中数据的长度”,然后把空块的“块写操作结束”标记为0,最后把Flash中原来的块标记为无效,并且把原来的块所在的段的“段有无效块”标志为0。
块的写操作也要修改CPU的RAM中的数据结构。
4、段的整理
当Flash中只剩下一个空段时就应该进行段的整理。首先找到该空段(称为新段),然后把新段的“段整理开始”标记为0,然后找到段号最小的且“段有无效块标志”为0的段(称为旧段),把旧段的物理地址写入新段的“旧段物理地址”,然后把旧段的有效块拷入新段,把新段的“段号”设为Flash中最大段号加一,然后把新段的“段整理结束”标记为0。然后把新段的“擦除旧段开始”标记为0,然后把旧段格式化,然后把新段的“擦除旧段结束”标记为0。
段的整理也要修改CPU的RAM中的数据结构。
七、文件和目录的操作
1.空块的寻找
1.在Flash中的段号最大的段中是否有空块,有空块则返回空块物理地址,否则继续。
2.调用找空段函数,得到一个最近的空段的地址和空段的个数,如果空段只有一个,而且其余的段中有“段有无效块标志”为“0”,则调用整理函数,再执行1,此时一定可以分配到空块。
3.若不满足1,且Flash只剩一个空段,同时其余的段中“段有无效块标志”均为为“1”,则表示Flash已满,返回寻找空块失败。
4.若不满足1,且Flash至少还剩两个空段,则寻找最近的一个空段,然后此空段中第一个空块即为所得,返回其物理地址。
2.创建
1.调用“空块的寻找”,在Flash中找到一个空块。
2.写入块头信息。
3.写入文件头信息。
4.更改在内存中建立的目录结构树。
3.删除
1.根据内存中建立的目录结构树找到所要删除文件的节点和它上一级文件夹的节点,就可以找到文件所占用的块的地址,和上一级文件夹占用的块的物理地址。
2.把文件占用的这些块标志为无效。
3.在该文件的上一级文件夹所占用的块中找到该文件的路径信息,把此信息擦除。
4.更改目录结构树。
4.读数据
1.根据内存中建立的目录结构树找到要读文件的节点。
2.把当前块的数据从Flash读入RAM,然后再从中截取出需要的数据。
5.写数据
1.写文件
1)根据内存中建立的目录结构树找到要写文件的节点:
2)读该文件的第一块,得知是否是空文件(即只有文件头的,没有写数据的,也就是文件长度为FF),若是空文件执行3),否则执行4);
3)若是空文件,则直接将小于248Byte个的数据写入当前block,如果长度超过一个block,则执行5);
4)把当前块的数据读入Ram,然后从需要写的位置开始,把输入的数据写入,若原位置上有数据则替换原来数据,当够了一个块的数据时,找到一个空块,把数据写入,然后把原来的块以及其后的所有块置为无效:
5)如果数据没有写完,则再找一个空块,写数据;
6)并且把这些块链起来,在结构树的节点中用新的blocklink代替原来的。
2.将新增加的文件的第一块的块号写入目录
1)根据内存中建立的目录结构树找到要写目录的节点:
2)读出目录所占的块的数据,检查里面是否还有可写空间(ffffffff)和是否有删除的空间(00000000),若有可写空间执行3),否则执行4);
3)直接将文件的第一块的块号写入,并执行5):
4)是否有删除的空间,若有则在RAM中去掉这些,只保留有效的数据,然后写入当前要存的路径信息,寻找一个空块,将这些数据全部写入该块;
5)更改目录结构树。
八、FFS的下层接口
Flash提供的函数如下:
Function | Description |
FlashReset () | 复位Flash文件系统。 |
FlashErase () | 擦除Flash文件系统的某一段。 |
FlashWrite () | 将数据写入Flash文件系统的某一块。 |
九、RAM的文件结构树图:
1)索引号与块号对应的全局数组
表示存放每个块地址的数组,flash块的块号与数组的索引号对应,n等于整个文件系统占用的flash块数。
2)文件结构树
参见图3,其中:
十、均匀磨损
段号是唯一的,而且是递增一的,每次整理时擦除的基本都是段号最小的,这样就形成一个段写和擦除的环状结构。段内的块的分配按照物理地址从小到大分配,同时也遵循了段的循环使用原则。因此可以达到均匀磨损的目的。使用了均匀磨损后,Flash的寿命可延长5~10倍。
十一、断电保护
按照本发明方法所建立的FFS文件处理系统要能保证在任何意外掉电的情况下,不使flash里的文件系统混乱,尽可能保证文件内容不丢失。也就是说,本发明方法只要可以保证在任何一个写flash的操作中,当发生意外掉电时,文件系统不乱,就是可行的。
FFS文件处理系统对flash的操作有:创建文件、删除文件、追加文件、读文件等,其中前三个操作会对flash进行写,下面就对这几种操作具体分析如何在写flash时做断电保护。
(注:以下所写的流程或过程均指与flash相关的读或写)
1.创建文件CreatFile
参见图4,图4是本发明方法中创建文件的过程图:
图4中有①、②标号的即为需要保护的地方。
标号①处(添加新创建文件的路径信息)
Step1块头->状态->块写操作开始=0
Step2在目录文件(目录也是一种特殊的文件)的内容后紧接着的未使用区域写入增加文件\目录的第一块的块号开始=0
Step3写入增加文件\目录的第一块的块号
Step4写入增加文件\目录的第一块的块号结束=0
断电恢复:上电初始化建立文件结构树时,发现这种有开始没有结束标志的,就将开始、结束以及块号全清零(00000000)。
结果:只舍弃新创建的这一个文件\目录,对其他的无影响。
标号②处(写入块头信息)的执行过程:
Step1块头->状态->块写操作开始=0(如果没有执行标号①,则执行此步)
Step2写入块号
Step3文件头信息写入flash
Step4块头->状态->文件\目录的第一块=0
Step5块头->状态->块写操作结束=0
断电恢复:如果块写操作结束不为0,则认为块信息不完全,上电初始化时将此块的块无效标志为0,段头状态的段有无效块标志为0。掉电前创建的文件\目录所在的非根目录文件将会指到一个无效的块,在创建文件结构树时,凡是目录文件指向无效块的路径都标志成00000000。
结果:舍弃新创建的这一个文件\目录。
Step6块头->文件第一块数据加入开始标志置为0
Step7块头->有效数据长度填入该文件占用此块的有效数据长度
Step8写入文件数据
Step9块头->文件第一块数据加入结束标志置为0
这样只会导致文件内容不准确,而不会对文件结构造成影响,并且这种误差是可知和易于修正的。可以在文件结构树上标注。
Step10如果文件需要不止一块,则在写完这一块之后调用下述的D、追加函数
2.查找空块函数(前提:段等长)
参见图5,图5中标号③(写入段头信息)处的执行过程:
Step1写入分配的段号
Step2写入当前版本号0x0301
Step3写入文件系统标识“FFSbyHB00”
只有当文件系统标识和版本号都正确的时候,此段才是有效段,否则认为是无效段,会在上电初始化时被清除。这样就保证只有正确段头信息的段是有效段,其余的段无效。
标号④(整理段)处的执行过程:
Step1新段的段头->状态->段整理开始标志置为0
Step2往新段的段头写入旧段物理地址
Step3将旧段里的有效块依次拷贝到新段
Step4新段的段头->状态->段整理结束标志置为0
如果有段整理开始,而没有结束标志,则认为旧段内容没有正确拷贝到新段,应该在上电初始化时,将这样的段擦除,然后再重新做一遍整理。
Step5新段的段头->状态->擦除旧段开始标志置为0
Step6擦除旧段
Step7新段的段头->状态->擦除旧段结束标志置为0
如果擦除旧段开始和结束标志不匹配,则在上电初始化时根据该段头的旧段物理地址信息,将旧段擦除,接着再将该段的段头->状态->擦除旧段结束标志置为0。
3.删除文件DeletFile
参见图6,图6中标号⑤(标志为无效块)执行策略:从文件的最后一个块开始把块头的状态里的块无效标志置为0。
此时的断电结果:只是被操作文件的内容被破坏,既不会破坏结构也不会使哪一块flash空间不可再用。或者是上一级目录文件指向一个无效的块,这在上电初始化建立文件结构树时会处理(如前所述)。
标号⑥(清除路径信息)执行的工作:
Step1把上一级目录文件(非根目录)里的删除文件\目录的第一块的块号开始标志置为0
Step2把上一级目录文件(非根目录)里的“记录被删除文件\目录的第一块的块号”信息置为0
Step3把上一级目录文件(非根目录)里的删除文件\目录的第一块的块号结束标志置为0
断电恢复:如果只有“删除文件\目录的第一块的块号开始”标志为0,而结束标志不为0,则表示删除块号未完成,在上电初始化,建立文件结构树时,完成断电前未完成的工作。
4.初始化时需要做的工作
Step 1扫描段,记录有效段相关信息(段号,物理地址)
如果文件系统标识或版本号不正确,该段视为无效,立即擦除。
如果有写段号开始标志为0,而结束不为0,则该段视为无效,立即擦除。
如果段整理开始标志为0,而结束不为0,该段视为无效,立即擦除。
如果擦除旧段开始标志为0,而结束不为0,则根据旧段物理地址,擦除旧段。擦除之后格式化,写上文件系统标识和版本号。
Step 2扫描有效段的每一块,建立文件结构树(文件的目录结构,文件名,每个文件\目录依次占据的块的块号和各块的物理地址,文件有效长度,文件属性,文件是否有损坏)
如果有块写开始标志,而没有结束标志,该块视为无效,块无效标志置为0。
如果有文件第一块数据写开始标志,而没有结束标志,该块视为无效,块无效标志置为0。
如果修改下一块的块号开始标志为0,而结束不为0,则视本块为该文件的最后一块,并且把NextBN置为0,当进行文件操作时,读到NextBN为0则另找一空块复制此块内容,块号不变,将NextBN置为正确的值。
如果同一文件\目录中下一块的块号是一个无效块的块号,则视本块为该文件的最后一块,并且把NextBN置为0,当进行文件操作时,读到NextBN为0则另找一空块复制此块内容,块号不变,将NextBN置为正确的值。
如果在建立结构树完成之后,存在没有路径指向的block,则把这些block都置为invalid。
如果目录中标明的某一文件的写文件\目录的第一块的块号开始标志为0,而结束不为0,则清除该路径信息,这样就会产生无路径的block,在初始化时,删除这样的block。
如果目录中标明的某一文件的写文件\目录的第一块的块号开始标志为0,而结束不为0,则清除该路径信息。
如果目录中标明的某一文件的第一块是无效块,则清除该路径信息。
如果目录文件记录的文件状态的擦除原来block num开始标志为0,而结束不为0,则记录下这个block num,当在哪个目录中的路径是这个block num,就说明这个目录就是原来的应该擦除的,将此block num擦除,然后把结束标志置为0。
如果在建树的整个过程都找不到这样的有效目录,则直接将结束标志置为0。
根据本发明方法所设计的FFS文件处理系统,在使用Flash作为嵌入式非易失性数据的存储器中进行了均匀磨损和断电保护等性能的试验和测试,其测试方法和结果如下:
FFS测试一:(强度测试)(含对比测试),文件系统大小:640K字节。在FFS中创建一个文件,写入一个字节,关闭文件,删除文件。反复操作,直至FLASH损坏。记录次数:
测试1:256,130,465次
测试2:257,332,721次
测试3:256,452,102次
不用FFS,直接进行FLASH的读写擦除操作,直至FLASH损坏。记录次数:
测试4:1,087,786次
测试5:1,001,336次
测试6:1,022,483次
结论:FFS文件系统用于删除操作时的耐磨损强度比直接采用FLASH要提高250倍左右。
FFS测试二:(鲁棒性测试),
在鲁棒性测试时,先创建一个文件,写入0~255共256个字节100次,在以上过程中随机加上程序中断,强制中断FLASH操作,然后重新初始化FLASH。重复测试1,000次,检查各次程序中断后的文件是否被破坏。在以上测试中,其所得到的结果一般应有以下五种情况:
A.文件正常存在,数据没有错误,没有遗漏。
B.文件正常存在,数据没有错误,但有遗漏。
C.文件正常存在,数据有错误,无遗漏。
D.文件正常存在,数据有错误,有遗漏。
E.文件不存在。
(注:上述情况中所说的文件数据遗漏是指文件末尾的数据有丢失,但是存在文件中的数据都是正常的)
1.在FFS中创建文件进行测试,其结果所符合的情况类型和次数如下:
A:532
B:468
C:0
D:0
E:0
2.不用FFS,直接在FLASH中创建文件进行测试,,其结果所符合的情况类型和次数如下:
A:198
B:220
C:232
D:210
E:140
结论:当发生意外掉电时,FFS文件系统可以保证在写flash的操作中文件数据不会被破坏,但可能会有所遗漏;若直接采用FLASH系统则出现文件丢失或数据出错的几率比较高,也可能会出现数据有遗漏的情况。
由以上测试可知:本发明方法应用后其Flash存储器的使用寿命或耐磨损强度可显著提高,其文件系统对意外断电损坏数据的恢复效果好,文件系统及数据基本不受意外断电的影响,且兼容性好,适于各种型号的Flash存储器使用。
Claims (2)
1.一种嵌入式系统中非易失性存储器的数据存取方法,其特征在于包括以下步骤:
A.按照Flash中的物理结构将其存储器分为一个以上的段,根据段的起始地址从小到大给有效段唯一编号,段编号存储于段本身中,在每段内划分有一个以上的逻辑块,在段内有效块唯一编号,块编号存储于块本身中;
B.按照段和块的编号顺序从小到大存储或更新块内文件,更新时,在段号最大的段中寻找未使用的空块,把原块中的数据经过修改后复制到该空块中,在对数据进行修改时,将原块中的数据复制到RAM中,在系统外进行修改后,再写入空块中,原块的编号也一并复制到该空块中,使之成为有效块,将原块标记为无效块,当段号最大的段中的空块使用完时,则按照从小到大的编号顺序寻找新的空段,在新的空段中寻找空块进行文件存储或更新操作;
C.当只剩下一个空段时,则在所有旧段中寻找无效块,若所有旧段中均无无效块,这时存储器空间已满,停止文件存储或更新操作;若寻找到带有无效块的段则执行步骤D;
D.对带有无效块的旧段进行整理,把旧段中的有效块复制到新的空段中,把该空段编号为存储器中最大段号加一,把旧段的物理地址写入新段中,然后擦除旧段,将旧段标记为空段,再执行步骤B。
2.根据权利要求1所述的一种嵌入式系统中非易失性存储器的数据存取方法,其特征在于:步骤A中所划分各段的大小是相同的,各块的大小也是相同的,段的大小为64KB至256KB,块的大小为256B至1024B。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200510019862XA CN100407336C (zh) | 2005-11-22 | 2005-11-22 | 一种嵌入式系统中非易失性存储器的数据存取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200510019862XA CN100407336C (zh) | 2005-11-22 | 2005-11-22 | 一种嵌入式系统中非易失性存储器的数据存取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1805049A CN1805049A (zh) | 2006-07-19 |
CN100407336C true CN100407336C (zh) | 2008-07-30 |
Family
ID=36867007
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200510019862XA Expired - Fee Related CN100407336C (zh) | 2005-11-22 | 2005-11-22 | 一种嵌入式系统中非易失性存储器的数据存取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100407336C (zh) |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2010515128A (ja) * | 2006-12-27 | 2010-05-06 | インテル コーポレイション | 不揮発性メモリにおけるデータを管理する方法 |
TWI373772B (en) | 2007-10-04 | 2012-10-01 | Phison Electronics Corp | Wear leveling method and controller using the same |
CN101615427B (zh) * | 2008-06-24 | 2012-08-08 | 群联电子股份有限公司 | 非易失性存储器的存储器管理方法及使用此方法的控制器 |
JP5439788B2 (ja) * | 2008-10-03 | 2014-03-12 | 富士通株式会社 | コンピュータ装置、及びメモリ用途設定プログラム |
CN102043651B (zh) * | 2009-10-22 | 2013-07-03 | 鸿富锦精密工业(深圳)有限公司 | Nand闪存及其数据更新管理方法 |
CN102103596B (zh) * | 2009-12-18 | 2014-10-29 | 康佳集团股份有限公司 | 在嵌入式系统中实现文件系统的方法 |
WO2012079216A1 (en) * | 2010-12-13 | 2012-06-21 | Mediatek Singapore Pte. Ltd. | Nor flash memory controller |
CN102609334B (zh) * | 2012-01-09 | 2016-05-04 | 晨星软件研发(深圳)有限公司 | 非易失闪存擦除异常存储块修复方法和装置 |
CN103544124B (zh) * | 2012-07-16 | 2018-01-19 | 上海塞尚通信技术有限公司 | Nand Flash存储器的访问方法 |
CN102945274A (zh) * | 2012-11-07 | 2013-02-27 | 浪潮电子信息产业股份有限公司 | 一种基于nor flash文件系统fat分区表的管理方法 |
CN103258044B (zh) * | 2013-05-24 | 2017-01-18 | 北京航天自动控制研究所 | 一种面向dsp的二元组nandflash数据文件管理方法 |
CN103744961B (zh) * | 2014-01-06 | 2016-10-19 | 清华大学 | 用可重构的文件系统目录树提高非易失性存储寿命的方法 |
CN105243071A (zh) * | 2014-07-12 | 2016-01-13 | 航天恒星科技有限公司 | 一种适用于无文件系统的可检索文件存取方法 |
CN105138465B (zh) * | 2015-04-30 | 2018-09-11 | 北京天诚盛业科技有限公司 | 加快Nand Flash写操作的方法及装置 |
CN105824716B (zh) * | 2016-03-15 | 2019-04-23 | 四川效率源信息安全技术股份有限公司 | 一种重新生成ldr文件的方法 |
CN106528830B (zh) * | 2016-11-16 | 2019-05-10 | 华为技术有限公司 | 一种恢复文件索引目录的方法和装置 |
CN110658981B (zh) * | 2019-04-19 | 2022-11-08 | 石家庄科林电气股份有限公司 | 一种提高Flash使用寿命的方法 |
CN111753337B (zh) * | 2020-07-02 | 2023-02-21 | 上海电器科学研究所(集团)有限公司 | 一种储能电池管理系统意外断电soc处理方法 |
CN112162933B (zh) * | 2020-09-08 | 2023-07-21 | 杭州涂鸦信息技术有限公司 | 一种闪存的数据结构、存储方法、读取方法及转移方法 |
CN116301579B (zh) * | 2022-12-06 | 2024-01-12 | 无锡市海鹰加科海洋技术有限责任公司 | 对于自容式测量设备的文件存取系统及其存取方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1498409A (zh) * | 2002-02-08 | 2004-05-19 | ���µ�����ҵ��ʽ���� | 非易失性存储装置及其控制方法 |
CN1536489A (zh) * | 2003-04-11 | 2004-10-13 | 英华达(上海)电子有限公司 | 非挥发性存储器的损耗平衡方法 |
CN1581109A (zh) * | 2003-08-12 | 2005-02-16 | 联想(北京)有限公司 | 一种刷新嵌入式系统中非易失性存储器的方法 |
US20050128815A1 (en) * | 2003-12-09 | 2005-06-16 | Renesas Technology Corp. | Semiconductor data processing device |
US6942378B2 (en) * | 2003-12-04 | 2005-09-13 | Montres Breguet Sa | Detent escapement for timepiece |
-
2005
- 2005-11-22 CN CN200510019862XA patent/CN100407336C/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1498409A (zh) * | 2002-02-08 | 2004-05-19 | ���µ�����ҵ��ʽ���� | 非易失性存储装置及其控制方法 |
CN1536489A (zh) * | 2003-04-11 | 2004-10-13 | 英华达(上海)电子有限公司 | 非挥发性存储器的损耗平衡方法 |
CN1581109A (zh) * | 2003-08-12 | 2005-02-16 | 联想(北京)有限公司 | 一种刷新嵌入式系统中非易失性存储器的方法 |
US6942378B2 (en) * | 2003-12-04 | 2005-09-13 | Montres Breguet Sa | Detent escapement for timepiece |
US20050128815A1 (en) * | 2003-12-09 | 2005-06-16 | Renesas Technology Corp. | Semiconductor data processing device |
Also Published As
Publication number | Publication date |
---|---|
CN1805049A (zh) | 2006-07-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100407336C (zh) | 一种嵌入式系统中非易失性存储器的数据存取方法 | |
US10037153B2 (en) | Memory device, electronic system, and methods associated with modifying data and a file of a memory device | |
US7783845B2 (en) | Structures for the management of erase operations in non-volatile memories | |
KR960004738B1 (ko) | 불휘발성 반도체 메모리 장치 | |
US8291155B2 (en) | Data access method, memory controller and memory storage system | |
CN103577574B (zh) | 一种基于nand flash的高可靠线性文件系统 | |
US20070113030A1 (en) | Methods for the management of erase operations in non-volatile memories | |
US20100191897A1 (en) | System and method for wear leveling in a data storage device | |
JP2005242897A (ja) | フラッシュディスク装置 | |
JP2007012058A (ja) | フラッシュ様媒体におけるトランザクションレコードを格納するファイルシステム | |
KR20020028624A (ko) | 플래시메모리를 위한 재사상 제어방법 및 그에 따른플래시 메모리의 구조 | |
JP2007012060A (ja) | 逆階層構造を有するファイルシステム | |
KR20080037283A (ko) | 플래시 메모리 장치를 포함하는 시스템 및 그것의 데이터복구 방법 | |
US20100131700A1 (en) | Memory indexing system and process | |
CN1281562A (zh) | 改进的闪速文件系统 | |
TWI659307B (zh) | 資料儲存裝置以及快閃記憶體控制方法 | |
JP2007012054A (ja) | ファイルシステム保全の最適化されたスタートアップ認証 | |
CN103729262A (zh) | 操作系统热备份方法、装置及文件系统重构方法 | |
JP2008033801A (ja) | メモリデータ管理装置 | |
JP2009205689A (ja) | フラッシュディスク装置 | |
CN100454302C (zh) | 一种文件管理系统及管理方法 | |
KR20010037155A (ko) | 플래시 파일 시스템 | |
KR100954603B1 (ko) | 파일 시스템의 로그 파일 및 상기 파일 시스템의 오류 복구방법 | |
CN111104345B (zh) | 一种ssd上电恢复方法、系统及主机 | |
KR100932801B1 (ko) | 메모리 관리 방법, 메모리 장치 및 컴퓨터 판독 가능 저장매체 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20080730 Termination date: 20121122 |