用于Flash均衡存储的方法及系统
技术领域
本发明涉及一种用于Flash均衡存储的方法及系统。
背景技术
当今电子技术飞速发展,嵌入式微控制技术在电子测量和工业控制领域的应用也越来越广泛。通常在监测和控制系统中,有一些系统状态数据、运行参数或测量数据需要保存在非易失性存储器(Flash)中。
FLASH存储器是一种在EPROM(电可擦写可编程只读存储器)和EEPROM(电可擦可编程只读存储器)的制造技术基础上发展起来的一种可擦除、非易失性存储元件。嵌入式系统中使用的FLASH存储器有两种,一种是在MCU(微控制单元)之外扩展的FLASH芯片,通常是按照特定时序发送命令和数据,实现读、写和擦除操作;另外一种是MCU内部集成的FLASH存储器,这类flash的访问往往是通过调用MCU提供的库函数来完成相应操作。
FLASH存储器的擦写次数是有一定限制的。如果频繁地擦写FLASH存储器的某个固定区域,就会使该区域在较短的时间内达到使用寿命而无法擦写,从而导致系统出错甚至崩溃。为延长FLASH存储器使用寿命,软件设计时通常会采用某种均衡算法将数据平均地写到Flash存储区域。
在有操作系统的电子产品中,FLASH存储器作为大容量文件存储器,可以采用算法较复杂的文件系统来均衡FLASH存储器的擦写来延长它的使用寿命,如磨损均衡算法等。而在嵌入式测量和控制系统中,通常用来存储数据的FLASH存储器容量比较小,一般只有几K到几百K字节,因此不可能采用类似文件系统的方式来管理。
在非操作系统的嵌入式系统中,通常用两种方式实现flash存储管理。对于非连续写入的情况,写入的数据有限且有初始默认值,同时在内存中也备份一遍数据。当要改变数据时,先改变内存数据,然后擦除flash并将内存的数据复制到flash。遇到读写时突然掉电,flash出错的情况,只需将flash中的数据重新恢复为初始默认值即可。对于连续写入的情行,通常需要用FLASH存储器中几个固定单元来保存有效数据区的起始地址和结束地址,其他存储区域均衡写入。在使用过程中出现掉电现象,在重新上电后通过起始地址确定上次正常工作或掉电前写入的有效数据在FLASH存储器中的存储位置。
如上,第一种方案适用情况有限而且一旦数据掉电丢失以后是无法找回的,只能用默认值。第二种方案的情况的弊端是用于保存地址的单元还是会因频繁地擦写而达到擦写饱和,从而影响到整个存储芯片的寿命,不能从根本上解决延长FLASH存储器使用寿命的问题。而且每次写入数据的都需要在两个地方更新内容(保存地址和数据),因而掉电后数据的处理上也会复杂点。
发明内容
基于此,本发明提供了一种用于Flash均衡存储的方法及系统,实现对FLASH存储器的全均衡擦写。
一种用于Flash均衡存储的方法,该方法包括如下步骤:
步骤11,检查当前要写入的扇区是否有擦除标记,如果没有,则格式化当前扇区并置标记;
步骤12,检查当前扇区是否是第一次写入数据,如果是,则先格式化当前扇区的下一个扇区并置擦除标记EARSE_FLAG,然后本扇区置写入使用标记USED_FLAG;
步骤13,判断当前扇区的剩余空间是否足够写入当前数据包,如果空间够,则写入数据到当前位置并更新当前操作地址g_SectorInfo.cur_addr;如果空间不够,则跳转到下一个扇区;
步骤14,检验写入的数据校验能否通过;如果不能,则移入下一个扇区,执行步骤11。
优选的,在所述步骤12和步骤13之间还包括如下步骤:检查写入的数据是否合法,如果合法,则执行步骤13。
优选的,步骤13和步骤14之间,还包括如下步骤:如果当前扇区为规划的最后一个扇区时,重新回到第一个扇区进行操作,重复步骤11-步骤13。
优选的,该方法还包括数据存储的检测步骤,
步骤21,确定要写入的扇区;依次检查标记有使用标记USED_FLAG的扇区,直到找到最后一个这样的扇区;
步骤22,确定要写入的地址;依次检查存储的数据包长度以及校验和的合法性,当找到某个区域校验和非法且数据空白,则当前区域的地址即为要写入的地址。
优选的,步骤22中,如果找到某个区域校验和合法或校验和非法且数据非空白,则操作地址偏移数据块的大小后,重新执行步骤22。
本发明还提供了一种用于Flash均衡存储的系统,该系统包括:
第一检查判断装置,用于检查当前要写入的扇区是否有擦除标记,如果没有,则格式化当前扇区并置标记;
第二检查判断装置,用于检查当前扇区是否是第一次写入数据,如果是,则先格式化当前扇区的下一个扇区并置擦除标记EARSE_FLAG,然后本扇区置写入使用标记USED_FLAG;
判断装置,用于判断当前扇区的剩余空间是否足够写入当前数据包,如果空间够,则写入数据到当前位置并更新当前操作地址g_SectorInfo.cur_addr;如果空间不够,则跳转到下一个扇区;
第三检查判断装置,检验写入的数据校验能否通过;如果不能,则移入下一个扇区,由第一检查判断装置工作。
该系统还包括
第四检查判断装置,用于在检查写入的数据是否合法,如果合法,则由第三检查判断装置工作。
该系统还包括
第二判断装置,用于判断当前扇区为规划的最后一个扇区,如果是,重新回到第一个扇区,由第一检查判断装置进行操作。
该系统还包括
数据存储的检测装置,用于
确定要写入的扇区,依次检查标记有使用标记USED_FLAG的扇区,直到找到最后一个这样的扇区;
确定要写入的地址;依次检查存储的数据包长度以及校验和的合法性,当找到某个区域校验和非法且数据空白,则当前区域的地址即为要写入的地址;
读出最近一次写入且校验通过的数据包。
数据存储的检测装置还用于
依次检查存储的数据包长度以及校验和的合法性,当找到某个区域校验和合法或校验和非法且数据非空白,则操作地址偏移数据块的大小后,确定要写入的地址。
本发明的有益效果在于:
1.Flash使用寿命长,合理运用每个扇区,最好地平均每个扇区的擦写次数,
2.可靠性高,在每次读写的时候都需要进行校验和的验证,从而保证在一些特殊情况下(如意外掉电)导致的数据丢失的时候,能正确读取完整数据。
3.支持可变长度数据块的读写操作。
附图说明
图1是本发明提供的用于Flash均衡擦写的方法的流程图;
图2是本发明提供的用于Flash数据保护的方法。
具体实施方式
下面结合附图对本发明做进一步说明。
参见图1-2,本发明提供的用于Flash均衡存储的方法,该方法包括如下步骤:
步骤11,检查当前要写入的扇区是否有擦除标记,如果没有,则格式化当前扇区并置标记;
步骤12,检查当前扇区是否是第一次写入数据,如果是,则先格式化当前扇区的下一个扇区并置擦除标记EARSE_FLAG,然后本扇区置写入使用标记USED_FLAG;
步骤13,判断当前扇区的剩余空间是否足够写入当前数据包,如果空间够,则写入数据到当前位置并更新当前操作地址g_SectorInfo.cur_addr;如果空间不够,则跳转到下一个扇区;
步骤14,检验写入的数据校验能否通过;如果不能,则移入下一个扇区,执行步骤11。
在所述步骤12和步骤13之间还包括如下步骤:检查写入的数据是否合法,如果合法,则执行步骤13。
步骤13和步骤14之间,还包括如下步骤:如果当前扇区为规划的最后一个扇区时,重新回到第一个扇区进行操作,重复步骤11-步骤13。
该方法还包括数据存储的检测步骤,该步骤一般情况只在初始化的时候进行检测步骤。检测的目的是为了读取最近一次写入的数据,或者为写入数据做准备。
步骤21,确定要写入的扇区;依次检查标记有使用标记USED_FLAG的扇区,直到找到最后一个这样的扇区;
步骤22,确定要写入的地址;依次检查存储的数据包长度以及校验和的合法性,当找到某个区域校验和非法且数据空白,则当前区域的地址即为要写入的地址;
步骤23,读出最近一次写入且校验通过的数据包。
步骤22中,如果找到某个区域校验和合法或校验和非法且数据非空白,则操作地址偏移数据块的大小后,重新执行步骤22。
本发明还提供了一种用于Flash均衡存储的系统,该系统包括:
第一检查判断装置,用于检查当前要写入的扇区是否有擦除标记,如果没有,则格式化当前扇区并置标记;
第二检查判断装置,用于检查当前扇区是否是第一次写入数据,如果是,则先格式化当前扇区的下一个扇区并置擦除标记EARSE_FLAG,然后本扇区置写入使用标记USED_FLAG;
判断装置,用于判断当前扇区的剩余空间是否足够写入当前数据包,如果空间够,则写入数据到当前位置并更新当前操作地址g_SectorInfo.cur_addr;如果空间不够,则跳转到下一个扇区;
第三检查判断装置,检验写入的数据校验能否通过;如果不能,则移入下一个扇区,由第一检查判断装置工作。
该系统还包括
第四检查判断装置,用于在检查写入的数据是否合法,如果合法,则由第三检查判断装置工作。
该系统还包括
第二判断装置,用于判断当前扇区为规划的最后一个扇区,如果是,重新回到第一个扇区,由第一检查判断装置进行操作。
该系统还包括
数据存储的检测装置,用于
确定要写入的扇区,依次检查标记有使用标记USED_FLAG的扇区,直到找到最后一个这样的扇区;
确定要写入的地址;依次检查存储的数据包长度以及校验和的合法性,当找到某个区域校验和非法且数据空白,则当前区域的地址即为要写入的地址;
读出最近一次写入且校验通过的数据包。
数据存储的检测装置还用于
依次检查存储的数据包长度以及校验和的合法性,当找到某个区域校验和合法或校验和非法且数据非空白,则操作地址偏移数据块的大小后,确定要写入的地址。
本发明中需要维护的数据结构有数据包和扇区信息包,如表1所示。
表1
本发明中需要实现的函数模块如表2所示。
表2
首先定义一个全局结构体变量,用来维护扇区信息以及当前操作地址。
上电运行后,系统调用初始化函数Sector_Init()函数对全局结构变量g_SectorInfo进行初始化,然后顺序查找到下一个可写入的地址并赋值给当前操作地址变量g_SectorInfo.cur_addr。
当要写入一个数据包时调用数据块写入函数PackInfo_Write(),当要读取最近一次写入的数据包时调用数据块读取函数PackInfo_Read()。
本发明提供的方法包括如下步骤:
(1)检查当前要写入的扇区是否有擦除标记,如果没有,则格式化当前扇区并置标记擦除标记EARSE_FLAG。
(2)检查当前扇区是否是第一次写入数据,如果是,则先格式化当前扇区的下一个扇区并置标记擦除EARSE_FLAG,然后本扇区置写入使用标记USED_FLAG。
(3)当前扇区的剩余空间足够写入当前数据包,则写入数据到当前位置并更新当前操作地址g_SectorInfo.cur_addr。如果空间不够,则跳转到下一个扇区。如果当前扇区为规划的最后一个扇区时,重新回到第一个扇区进行操作,并重复(1)~(3)的步骤。
(4)检验写入的数据校验能否通过。否,则偏移当前操作地址到下一个可写区域重新写
最终,Flash中写入一个循环以后的数据结构形式如表3所示。
表3
本发明在数据存储过程中,还提供了数据检测的方法,如下
(1)确定可以要写入的扇区。依次检查标记有使用USED_FLAG的扇区,直到找到最后一个这样的扇区。
(2)确定可以要写入的地址。依次检查数据包长度以及校验和的合法性,当找到某个区域校验和非法且数据空白,则当前区域的地址即为要写入的地址,并赋给当前操作地址变量g_SectorInfo.cur_addr。
(3)最后调用数据库读取函数PackInfo_Read(),读出最近一次写入且校验通过的数据包。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明的保护范围应以所附权利要求为准。