一种基于Nor Flash存储器的嵌入式系统的文件存储格式转让专利

申请号 : CN201811211451.4

文献号 : CN109558335B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 方程常斌

申请人 : 上海移芯通信科技有限公司

摘要 :

本发明公开了一种基于Nor Flash存储器的嵌入式系统的文件存储格式,包括:存储格式头部,索引数据区,索引数据交换区,数据簇区。存储格式头部,包括存储格式版本信息、索引数据区信息、交换区信息和数据簇区信息;数据簇区,包括若干数据簇,每个数据簇是存储一个数据文件的基本单位;索引数据交换区,包括若干索引数据项,索引数据项包括数据文件对应的文件操作状态;当索引数据交换区的存储比例达到预设条件时,将索引数据交换区的内容更新至所述索引数据区后,清空索引数据交换区。本发明的文件存储格式,可以在不影响系统实时性的条件下实现实时写入,具有消耗RAM空间低,异常掉电不会造成文件系统损坏等优点。

权利要求 :

1.一种基于Nor Flash存储器的嵌入式系统的文件存储方法,其特征在于,所采用的文件存储格式包括:存储格式头部,索引数据区,索引数据交换区,数据簇区;

所述存储格式头部,包括存储格式版本信息、索引数据区信息、交换区信息和数据簇区信息;

其中,所述索引数据区信息包括所述索引数据区的起始位置和所述索引数据区的长度;所述交换区信息包括所述索引数据交换区的起始位置、所述索引数据交换区的长度,以及每个索引数据项的长度;所述数据簇区信息包括所述数据簇区的起始位置、所述数据簇区的长度,以及每个数据簇的长度;

所述数据簇区,用于存储大于预设长度的数据文件,包括若干数据簇,每个数据簇是存储一个数据文件的基本单位;

所述索引数据交换区,包括若干索引数据项,所述索引数据项包括数据文件对应的文件编号、文件长度和文件操作状态;所述索引数据项分为索引项和数据项,所述索引项用于记录大于预设长度的数据文件对应的文件索引信息,所述数据项用于存储不大于预设长度的数据文件;

当所述索引数据交换区的存储比例达到预设条件时,将所述索引数据交换区的内容更新至所述索引数据区后,清空所述索引数据交换区。

2.根据权利要求1所述的文件存储方法,其特征在于:所述文件操作状态包括空闲、正在写入、已写入、删除。

3.根据权利要求2所述的文件存储方法,其特征在于:所述数据项还包括校验位;

所述索引项还包括数据文件对应的数据簇编号、校验位。

4.根据权利要求3所述的文件存储方法,其特征在于:所述数据簇还包括头部标记,所述头部标记包括簇操作状态和簇累计擦除次数。

5.根据权利要求1所述的文件存储方法,其特征在于,所述的将所述索引数据交换区的内容更新至所述索引数据区具体包括:当所述索引数据区有两个时,分析所述索引数据区的工作状态,识别出当前处于激活状态的索引数据区;

将所述索引数据交换区的内容和当前处于激活状态的所述索引数据区的内容,更新至当前处于未激活的所述索引数据区;

更新两个所述索引数据区的工作状态。

6.根据权利要求1所述的文件存储方法,其特征在于,还包括:当写入新建数据文件,且所述新建数据文件长度大于所述预设长度,且所述数据簇区有满足新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;

当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引数据项。

7.根据权利要求4所述的文件存储方法,其特征在于,还包括:当写入新建数据文件时,判断新建数据文件长度是否大于所述预设长度;

当所述新建数据文件长度大于所述预设长度,且所述数据簇区有满足所述新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;

当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引项;

当所述新建数据文件长度不大于所述预设长度时,在所述索引数据交换区生成对应的数据项,将所述新建数据文件写入所述数据项。

8.根据权利要求7所述的文件存储方法,其特征在于,还包括:当将所述新建数据文件写入对应的空闲数据簇时,将所述空闲数据簇的簇操作状态标记为正在写入;

当完成将所述新建数据文件写入对应的空闲数据簇时,更改所述空闲数据簇的簇操作状态为已写入。

9.根据权利要求1所述的文件存储方法,其特征在于,还包括:当修改所述数据簇区的数据文件时,将修改后的数据文件生成一个新建数据文件。

10.根据权利要求1所述的文件存储方法,其特征在于,还包括:当删除所述数据簇区的数据文件时,在所述索引数据交换区生成新建索引数据项,所述新建索引数据项的文件操作状态为删除。

11.根据权利要求1所述的文件存储方法,其特征在于,所述的将所述索引数据交换区的内容更新至所述索引数据区包括:将所述索引数据交换区内对同一数据文件的最后操作的数据内容更新至所述索引数据区。

12.根据权利要求1所述的文件存储方法,其特征在于,还包括:根据数据文件长度以及Nor Flash存储器的写入单位,将一个数据文件的写入操作切分为若干个写入操作任务。

13.根据权利要求1所述的文件存储方法,其特征在于,还包括:当系统空闲时,通过Nor Flash存储器的擦除对无效数据簇进行回收;其中,所述擦除的优先级低于业务的优先级。

14.根据权利要求4所述的文件存储方法,其特征在于,还包括:当对无效数据簇进行擦除操作时,更新所述无效数据簇的簇累计擦除次数;

当有新建数据文件写入时,根据所述簇累计擦除次数,选择用于写入所述新建数据文件的空闲数据簇。

说明书 :

一种基于Nor Flash存储器的嵌入式系统的文件存储格式

技术领域

[0001] 本发明属于计算机技术领域,特别涉及一种基于Nor Flash存储器的嵌入式系统的文件存储格式。

背景技术

[0002] 随着电子技术的发展,嵌入式系统得到广泛应用。Flash存储器是一种非易失性固态存储器,能提供可靠的数据掉电保护,当前,各种Flash存储器已逐渐成为嵌入式系统中主要的存储设备。
[0003] Nor Flash和Nand Flash是两种主要的闪存。从读写性能对比这两种技术,Nor Flash的读取速度比Nand Flash稍快,而Nand Flash的写入和擦除速度比Nor Flash快很多。在对成本、功耗要求较高的嵌入式设备上,Nor Flash有着更广泛的应用。
[0004] 传统的文件系统,如FAT,主要针对大数据量、高吞吐率场景。因为文件格式过多冗余,导致资源消耗高,无法满足对成本敏感的嵌入式系统的要求。
[0005] 目前,常见的嵌入式设备的文件系统有:
[0006]
[0007] 从上表可见,除了停止维护的JFFS,没有针对NorFlash的文件系统。以上尚在维护的文件系统存在以下问题:
[0008] 1、都是搭载windows和linux等非实时性的操作系统,其设计上对实时性上考虑不足;
[0009] 2、需要占用比较多的系统资源空间,内存消耗大;
[0010] 3、由于嵌入式系统的应用条件恶劣,存在电源电压不稳定、突发性断电及非法插拔等现象,对存储的可靠性设计考虑不足。

发明内容

[0011] 本发明的目的是提供一种基于Nor Flash存储器的嵌入式系统的文件存储格式,采用该存储格式,可以在不影响系统实时性的条件下实现实时写入,RAM空间消耗低,异常掉电不会造成文件系统的损坏,满足嵌入式系统的高实时性、高可靠性、低成本的要求。
[0012] 本发明提供的技术方案如下:
[0013] 一种基于NorFlash存储器的嵌入式系统的文件存储格式,包括:存储格式头部,索引数据区,索引数据交换区,数据簇区。所述存储格式头部,包括存储格式版本信息、索引数据区信息、交换区信息和数据簇区信息;所述数据簇区,包括若干数据簇,每个数据簇是存储一个数据文件的基本单位;所述索引数据交换区,包括若干索引数据项,所述索引数据项包括所述数据文件对应的文件操作状态;当所述索引数据交换区的存储比例达到预设条件时,将所述索引数据交换区的内容更新至所述索引数据区后,清空所述索引数据交换区。
[0014] 在上述技术方案中,通过将数据簇区与索引数据交换区分开,索引数据区对索引数据交换区进行备份,可以增强文件系统的健壮性,使异常掉电后已有的文件系统不损坏,已有的数据文件不丢失。
[0015] 进一步优选的,所述交换区信息包括所述索引数据交换区的起始位置、所述索引数据交换区的长度,以及每个索引数据项的长度;所述索引数据区信息包括所述索引数据区的起始位置和所述索引数据区的长度;所述数据簇区信息包括所述数据簇区的起始位置、所述数据簇区的长度,以及每个数据簇的长度。
[0016] 进一步优选的,所述索引数据项包括索引项和/或数据项,所述文件操作状态包含在所述索引项和/或数据项内;所述文件操作状态包括空闲、正在写入、已写入、删除;其中,所述索引项还包括大于预设长度的所述数据文件对应的文件索引信息,所述数据项还包括不大于所述预设长度的所述数据文件。
[0017] 进一步优选的,所述数据项还包括文件编号、文件长度、校验位;所述索引项还包括文件编号、文件长度、若干所述数据文件对应的数据簇编号、校验位。
[0018] 在上述技术方案中,将小数据文件写入索引数据交换区,将大数据文件写入数据簇区,这相比统一写入数据簇区,存储空间的利用率更高。
[0019] 进一步优选的,所述数据簇还包括头部标记,所述头部标记包括簇操作状态和簇累计擦除次数。
[0020] 在上述技术方案中,利用数据簇的头部标记,便于对数据簇进行直接管理,提高了数据簇区的整理效率,提升了数据簇的均衡使用,从而提高Flash的使用寿命。
[0021] 进一步优选的,所述的将所述索引数据交换区的内容更新至所述索引数据区具体包括:当所述索引数据区有两个时,分析所述索引数据区的工作状态,识别出当前处于激活状态的索引数据区;将所述索引数据交换区的内容和当前处于激活状态的所述索引数据区的内容,更新至当前处于未激活的所述索引数据区;更新两个所述索引数据区的工作状态。
[0022] 在上述技术方案中,引入了两级备份,增强了闪存上的文件系统的健壮性。
[0023] 进一步优选的,还包括:当写入新建数据文件时,且所述数据簇区有满足新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引数据项。
[0024] 进一步优选的,还包括:当写入新建数据文件时,判断新建数据文件长度是否大于所述预设长度;当所述新建数据文件长度大于所述预设长度,且所述数据簇区有满足所述新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引项;当所述新建数据文件长度不大于所述预设长度时,在所述索引数据交换区生成对应的数据项,将所述新建数据文件写入所述数据项。
[0025] 进一步优选的,还包括:当将所述新建数据文件写入对应的空闲数据簇时,将所述空闲数据簇的簇操作状态标记为正在写入;当完成将所述新建数据文件写入对应的空闲数据簇时,更改所述空闲数据簇的簇操作状态为已写入。
[0026] 在上述技术方案中,先写数据簇区,再生成对应的索引数据项,可以保证在写数据簇区发生异常掉电时,已建立的文件系统不乱,提升文件系统的健壮性;选择空闲数据簇进行写入,避免了每次写数据之前需要先擦后写,提高了系统的写入速度,满足了实时性要求。
[0027] 进一步优选的,还包括:当修改所述数据簇区的数据文件时,将修改后的数据文件生成一个新建数据文件。
[0028] 在上述技术方案中,通过将修改后的数据文件当成一个新建数据文件处理,避免了对原占有数据簇的擦除,提高了写入速度;保留了数据文件的历史数据,提高了文件系统的稳健性。
[0029] 进一步优选的,还包括:当删除所述数据簇区的数据文件时,在所述索引数据交换区生成新建索引数据项,所述新建索引数据项的文件操作状态为删除。
[0030] 在上述技术方案中,避免了对被删除的数据文件所占有的数据簇进行立即擦除,便于在系统空闲时再进行擦除,满足了系统的实时性要求。
[0031] 进一步优选的,所述的将所述索引数据交换区的内容更新至所述索引数据区包括:将所述索引数据交换区内对同一数据文件的最后操作的数据内容更新至所述索引数据区。
[0032] 在上述技术方案中,通过保留对应同一数据文件的最后操作的索引数据项,提升了索引数据区的空间利用率。
[0033] 进一步优选的,还包括:根据数据文件长度以及Nor Flash存储器的写入单位,将一个数据文件的写入操作切分为若干个写入操作任务。
[0034] 在上述技术方案中,通过将一个大数据文件的写入操作切分为若干个小的写入操作任务,可以使文件存储不影响系统的实时性,同时使消耗的RAM空间小,降低了成本。
[0035] 进一步优选的,还包括:当系统空闲时,通过Nor Flash存储器的擦除对无效数据簇进行回收;其中,所述擦除的优先级低于业务的优先级。
[0036] 在上述技术方案中,通过在低优先级任务中进行Nor Flash擦除,满足系统的实时性要求。
[0037] 进一步优选的,还包括:当对所述无效数据簇进行擦除操作时,更新所述无效数据簇的簇累计擦除次数;当有新建数据文件写入时,根据所述簇累计擦除次数,选择用于写入所述新建数据文件的空闲数据簇。
[0038] 在上述技术方案中,根据簇累计擦除次数选择空闲数据簇,有利于数据簇的均衡使用,从而提高NorFlash的使用寿命。
[0039] 与现有技术相比,本发明提供的一种基于NorFlash存储器的嵌入式系统的文件存储格式具有以下有益效果:
[0040] 本发明采用该存储格式的存储方法,可以在不影响系统的实时性的条件下实现实时写入,具有消耗RAM空间低,异常掉电不会造成文件系统损坏等优点,特别适用于单核实时性要求高且程序代码段和数据存储共用一片Flash的嵌入式场景。

附图说明

[0041] 下面将以明确易懂的方式,结合附图说明优选实施方式,对一种基于Nor Flash存储器的嵌入式系统的文件存储格式的上述特性、技术特征、优点及其实现方式予以进一步说明。
[0042] 图1是本发明的一种基于Nor Flash存储器的嵌入式系统的文件存储格式的一个实施例的结构示意图;
[0043] 图2是本发明中一个实施例的存储格式头部的结构示意图;
[0044] 图3是本发明中一个实施例的数据簇区的结构示意图;
[0045] 图4是本发明中一个实施例的索引数据交换区及索引数据区的结构示意图;
[0046] 图5是本发明的一种基于Nor Flash存储器的嵌入式系统的文件存储格式的另一个实施例的数据簇的格式示意图;
[0047] 图6是本发明中另一个实施例的索引项的格式示意图;
[0048] 图7是本发明中另一个实施例的数据项的格式示意图;
[0049] 图8是本发明中另一个实施例的存储格式头部的结构示意图;
[0050] 图9是本发明中的一种基于Nor Flash存储器的嵌入式系统的文件存储格式的另一个实施例的结构示意图;
[0051] 图10是本发明中另一个实施例的存储格式头部的结构示意图。

具体实施方式

[0052] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对照附图说明本发明的具体实施方式。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图,并获得其他的实施方式。
[0053] 为使图面简洁,各图中只示意性地表示出了与本发明相关的部分,它们并不代表其作为产品的实际结构。另外,以使图面简洁便于理解,在有些图中具有相同结构或功能的部件,仅示意性地绘示了其中的一个,或仅标出了其中的一个。在本文中,“一个”不仅表示“仅此一个”,也可以表示“多于一个”的情形。
[0054] 在本发明的一个实施例中,如图1~4所示,一种基于NorFlash存储器的嵌入式系统的文件存储格式,包括:存储格式头部,索引数据区,索引数据交换区,数据簇区。
[0055] 所述存储格式头部,包括存储格式版本信息、索引数据区信息、交换区信息和数据簇区信息;
[0056] 所述数据簇区,包括若干数据簇,每个数据簇是存储一个数据文件的基本单位;
[0057] 所述索引数据交换区,包括若干索引数据项,所述索引数据项包括所述数据文件对应的文件操作状态;
[0058] 当写入新建数据文件时,且所述数据簇区有满足新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引数据项;
[0059] 当修改所述数据簇区的数据文件时,将修改后的数据文件生成一个新建数据文件;
[0060] 当删除所述数据簇区的数据文件时,在所述索引数据交换区生成新建索引数据项,所述新建索引数据项的文件操作状态为删除;
[0061] 当所述索引数据交换区的存储比例达到预设条件时,将所述索引数据交换区的内容更新至所述索引数据区后,清空所述索引数据交换区;
[0062] 根据数据文件长度以及NorFlash存储器的写入单位,将一个数据文件的写入操作切分为若干个写入操作任务;
[0063] 当系统空闲时,通过Nor Flash存储器的擦除对无效数据簇进行回收;其中,所述擦除的优先级低于业务的优先级。
[0064] 具体的,在Nor Flash存储器中,数据是以文件的形式进行管理。将用于存储和管理数据的NorFlash存储区域分为存储格式头部、索引数据区、索引数据交换区、数据簇区等区块。存储格式头部包括版本信息,包含索引数据区的起始位置和长度的索引数据区信息、包含索引数据交换区的起始位置和长度的交换区信息,以及包含数据簇区的起始位置和长度的数据簇区信息。存储格式头部区块的起始位置固定,根据存储格式头部的信息可以方便地找到各个区块的起始位置和大小。索引数据区的结构与索引数据交换区的结构相同,由若干索引数据项组成,每个索引数据项长度相等,索引数据区第n个索引数据项的起始位置=索引数据区的起始位置+(n-1)*索引数据项的长度,索引数据交换区第n个索引数据项的起始位置=索引数据交换区的起始位置+(n-1)*索引数据项的长度。数据簇区由若干数据簇组成,每个数据簇的长度相等,第n个数据簇的起始位置=数据簇区的起始位置+(n-1)*数据簇的长度。索引数据项的长度、数据簇的长度可以内部设置好。
[0065] 数据簇区用于存储数据文件,每个数据簇只用于一个数据文件的存储。根据数据文件长度,一个数据文件可能占用一个或多个数据簇。比如,数据簇的长度为1kByte,一个2.4k Byte的数据文件需要占用3个数据簇,一个100Byte的数据文件需要占用1个数据簇。
[0066] 数据簇又分为空闲数据簇、有效数据簇、无效数据簇。初始化完成还没有写入数据文件的数据簇是空闲数据簇;已写入数据文件,且数据文件还有效的数据簇是有效数据簇;包含过时的数据文件或无效的数据文件的数据簇是无效数据簇。比如,在数据簇区写入一个新建数据文件,被该文件占用的所有空闲数据簇,无论是1个还是多个,都变成了有效数据簇;当该文件被删除时,对应的有效数据簇的数据变无效了,有效数据簇变成了无效数据簇;无效数据簇只有被擦除之后才能再次作为空闲数据簇。只能对空闲数据簇进行写入操作。无效数据簇只能被擦除后变成空闲数据簇,才能再次被使用。
[0067] 索引数据交换区由若干索引数据项组成,根据索引数据项的文件操作状态可以了解对应的数据文件的文件操作状态。
[0068] 基于前述文件存储格式的存储方法包括:
[0069] 当写入新建数据文件时,首先判断数据簇区是否有足够的空闲数据簇可写。如果空闲数据簇的大小大于等于新建数据文件长度,则写入新建数据文件;否则,不写入。
[0070] 新建数据文件已写入数据簇区,是指新建数据文件已完整地写入数据簇区,并已写完。当新建数据文件在数据簇区已写入时,再在索引数据交换区生成该数据文件对应的索引数据项,索引数据项的文件操作状态为已写入。先写数据簇区,再生成对应的索引数据项,可以保证在写数据簇区的过程中发生异常掉电时,已建立的文件系统不乱。
[0071] 修改已存放数据簇区的数据文件,并不是对原来占有的数据簇进行擦除,然后再写入新的数据,而是将修改后的数据文件当成一个新建数据文件处理,在新的空闲数据簇中写入修改后的数据文件,在索引数据交换区再生成该修改后的数据文件对应的索引项,索引项的文件操作状态为已写入。这样,原来占有的数据簇变成无效数据簇。如果在修改后的数据文件的写入过程中发生异常掉电,则已建立的文件系统不会损坏,已有的数据文件也不会丢失。由于保留了文件的历史数据,这为恢复文件的历史数据提供了可能。该方法类似日志记录,提高了闪存文件系统的健壮性。
[0072] 删除已存放数据簇区的数据文件,并不是对原来占有的数据簇进行擦除,而是在索引数据交换区生成一个新建索引数据项,索引数据项的文件操作状态为删除。原来占有的数据簇变成无效数据簇。
[0073] 当索引数据交换区的存储比例达到预设条件时,比如,60%,将当前索引数据交换区的内容更新至索引数据区,之后通过擦除清空当前索引数据交换区。索引数据交换区采用循环使用的方式,后续的索引数据项存储在当前索引数据交换区之后的区域。
[0074] 当读取已存放数据簇区的数据文件时,首先在索引数据交换区查找对应该数据文件的最后一次操作的索引数据项;如果找到,则根据该索引数据项的信息获取对应的数据文件的存放地址,根据该存放地址读取对应的数据文件。如果没有找到,则在索引数据区继续查找;如果找到,则采用与索引数据交换区类似的方法获得对应的数据文件。
[0075] 通常对NorFlash进行写操作时需要关中断(如果在对某个Flash地址进行写时又对该地址进行读取,读取的内容会不确定,这影响系统的运行,所以一般在对某个Flash地址进行写时需要关中断),写完之后,再开中断。为了满足系统响应的实时性,不是对一个数据文件的写入操作进行关中断,而是将一个数据文件的写入操作切分为若干个写入操作任务,在每个写入操作任务中,先关中断,在写完之后再开中断,这样可以保证系统响应的延时最大不超过一个写入操作任务。
[0076] 根据NorFlash存储器的写入单位和系统业务的实时性要求,确定满足系统实时性的最小写入单元,即一个写入操作任务的范围。根据一个写入操作任务的范围和数据文件长度,将一个数据文件的写入操作切分为若干个写入操作任务。NorFlash最小可以按byte写。示例1,假设满足系统实时性的最小写入单元为Byte,即一个写入操作任务的范围是每次写1个Byte,则在写一个10Byte的数据文件时,需将这个数据文件的写入变成10个写入操作任务,每个写入操作任务在写之前先关中断,在写完之后再开中断;这样可以保证系统响应的延时最大不超过1个Byte的写入时间。示例2,假设满足系统实时性的最小写入单元为10Byte,则一个写入操作任务的范围可以放大到每次写10个Byte;假设写一个10Byte的数据文件,该数据文件的写入只需要1个写入操作任务,就可以满足系统实时性的要求,系统响应的延时最大不超过10个Byte的写入时间。因为将写入操作切分为小的写入操作任务,系统响应延时小,所以需要RAM缓存的数据量会比较少,从而导致需要消耗的RAM空间比较小。
[0077] NorFlash的擦除相对Nor Flash的读、写是比较慢的,擦除速度较写速度慢一个数量级以上,所以在每次写数据时,选择空闲数据簇进行写操作。当系统空闲时,对无效数据簇进行擦除,将无效数据簇变成空闲数据簇。由于擦除的优先级低于业务的优先级,所以NorFlash的擦除不影响系统响应的实时性。
[0078] 通过采用前述文件存储格式的存储方法,可以在不影响系统的实时性的条件下实现实时写入,具有消耗RAM空间低,异常掉电不会造成文件系统损坏等优点,特别适用于单核实时性要求高且程序代码段和数据存储共用一片Flash的嵌入式场景。
[0079] 在本发明的另一个实施例中,如图1、图3~8所示,一种基于Nor Flash存储器的嵌入式系统的文件存储格式,包括:存储格式头部,索引数据区,索引数据交换区,数据簇区;
[0080] 所述存储格式头部,包括存储格式版本信息、索引数据区信息、交换区信息和数据簇区信息;所述交换区信息包括所述索引数据交换区的起始位置、所述索引数据交换区的长度,以及每个索引数据项的长度;所述索引数据区信息包括所述索引数据区的起始位置和所述索引数据区的长度;所述数据簇区信息包括所述数据簇区的起始位置、所述数据簇区的长度,以及每个数据簇的长度;
[0081] 所述数据簇区,包括若干数据簇,每个数据簇是存储一个数据文件的基本单位;每个数据簇还包括头部标记,所述头部标记包括簇操作状态和簇累计擦除次数;
[0082] 所述索引数据交换区,包括若干索引数据项,所述索引数据项包括索引项和/或数据项,所述文件操作状态包含在所述索引项和/或数据项内;所述文件操作状态包括空闲、正在写入、已写入、删除;其中,所述索引项还包括大于预设长度的所述数据文件对应的文件索引信息,所述数据项还包括不大于所述预设长度的所述数据文件;所述数据项还包括文件编号、文件长度、校验位;所述索引项还包括文件编号、文件长度、若干所述数据文件对应的数据簇编号、校验位;
[0083] 当写入新建数据文件时,判断新建数据文件长度是否大于所述预设长度;
[0084] 当所述新建数据文件长度大于所述预设长度,且所述数据簇区有满足所述新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引项;当所述新建数据文件长度不大于所述预设长度时,在所述索引数据交换区生成对应的数据项,将所述新建数据文件写入所述数据项;
[0085] 当将所述新建数据文件写入对应的空闲数据簇时,将所述空闲数据簇的簇操作状态标记为正在写入;当完成将所述新建数据文件写入对应的空闲数据簇时,更改所述空闲数据簇的簇操作状态为已写入;
[0086] 当修改所述数据簇区的数据文件时,将修改后的数据文件生成一个新建数据文件;
[0087] 当删除所述数据簇区的数据文件时,在所述索引数据交换区生成新建索引数据项,所述新建索引数据项的文件操作状态为删除;
[0088] 当所述索引数据交换区的存储比例达到预设条件时,将所述索引数据交换区内对同一数据文件的最后操作的数据内容更新至所述索引数据区;当所述索引数据交换区的内容更新至所述索引数据区后,清空所述索引数据交换区;
[0089] 根据数据文件长度以及Nor Flash存储器的写入单位,将一个数据文件的写入操作切分为若干个写入操作任务;
[0090] 当系统空闲时,通过Nor Flash存储器的擦除对无效数据簇进行回收;其中,所述擦除的优先级低于业务的优先级;当对所述无效数据簇进行擦除操作时,更新所述无效数据簇的簇累计擦除次数;当有新建数据文件写入时,根据所述簇累计擦除次数,选择用于写入所述新建数据文件的空闲数据簇。
[0091] 具体的,本实施例,对存储格式头部、索引数据项、数据簇的结构进行了细化,相应的对存储方法也进行了细化。
[0092] 在存储格式头部的信息中增加索引数据项的长度和数据簇的长度,当索引数据项的长度和数据簇的长度在不同版本而有所不同时,采用这种存储格式可以更灵活地适应不同版本的需求。
[0093] 索引数据项包括索引项和/或数据项,索引项和数据项的长度都等于索引数据项的长度。数据项用于存放不大于预设长度的数据文件,比如1个索引数据项的长度为100Byte,除去数据项的文件编号、文件长度、文件操作状态、校验位等信息占用的空间,剩下的空间为90Byte,1个数据簇的长度为1kByte,1个80Byte的数据文件直接写入索引数据交换区,显然比写入数据簇区,空间利用率更高。索引项用于存放较大数据文件对应的文件索引信息,索引项包含了数据文件对应的数据簇编号,根据该数据簇编号可以到数据簇区反向找到该数据文件。
[0094] 数据簇除了包括数据文件,还包括簇操作状态和簇累计擦除次数等头部标记。数据簇的头部标记方便对数据簇进行直接管理。数据簇的簇操作状态反映了该数据簇的当前操作状态,有空闲、正在写入、已写入等,可以根据业务需要进行增删。当簇操作状态为空闲时,该簇操作状态对应的数据簇为空闲数据簇。当簇操作状态为正在写入时,该簇操作状态对应的数据簇可能为有效数据簇,也可能为无效数据簇。比如,对空闲数据簇进行数据写入,该数据簇成为有效数据簇;如果在写的过程中发生了异常掉电,导致数据没有写完,重新上电后该数据簇的簇操作状态仍为正在写入,则该数据簇已成为无效数据簇了。当簇操作状态为已写入时,该簇操作状态对应的数据簇通常为有效数据簇,但在有些场景下也可能为无效数据簇。比如,对存放数据簇区的数据文件进行修改,由于修改后的数据文件占有新的空闲数据簇,原来占有的数据簇变成无效数据簇,但簇操作状态没有变化。
[0095] 数据簇的簇累计擦除次数反映了该数据簇的累计擦除次数。闪存的使用寿命是以擦除次数来衡量的,Nor Flash仅有10万次擦写寿命,为了避免频繁擦写同一区域,因寿命问题而数据丢失,需要采取均衡策略以确保擦除操作均匀分布在整个闪存中。根据簇累计擦除次数来选择空闲数据簇,有助于提升数据簇的均衡使用,提高Flash的使用寿命。
[0096] 当写入新建数据文件时,首先判断新建数据文件长度是否大于预设长度。如果大于预设长度,则在数据簇区查找空闲数据簇。如果能找到足够的空闲数据簇,则将新建数据文件写入对应的空闲数据簇。然后在索引数据交换区生成对应的索引数据项。如果不大于预设长度,则在索引数据交换区生成对应的数据项,将新建数据文件写入该数据项中。
[0097] 当新建数据文件写入对应的空闲数据簇时,先将空闲数据簇的簇操作状态标记为正在写入;当写入完成后,再更改该空闲数据簇的簇操作状态为已写入。
[0098] 当所述索引数据交换区的存储比例达到预设条件时,将索引数据交换区的内容更新至索引数据区,如果索引数据交换区对同一数据文件存在多次操作,只是将对应最后操作的索引数据项复制至索引数据区;当索引数据交换区的内容更新至索引数据区后,清空索引数据交换区。比如,对文件编号为2的某数据文件,进行过如下操作,按时间从先至后的顺序描述如下:1、首次写入文件编号2的数据文件;2、修改文件编号2的数据文件;3、删除文件编号2的数据文件。索引数据交换区对每一次的操作记录都生成对应的索引数据项,前2个索引数据项的操作已经过时了,所以只需要把最后操作的索引数据项复制至索引数据区。这样可以保证频繁操作同一文件时不会频繁写索引数据区,而会把操作过程包括在索引数据交换区中。
[0099] 当读取数据簇区的数据文件时,首先在索引数据交换区查找该数据文件的最后一次操作的索引数据项;如果找到,则根据该索引数据项的若干数据簇编号得到若干数据簇的起始位置,根据该若干数据簇的起始位置读取对应的数据簇,从而获得对应的数据文件。如果没有找到,则在索引数据区继续查找;如果找到,则采用与索引数据交换区类似的方法获得对应的数据文件。
[0100] 当对数据簇区的无效数据簇进行擦除操作时,更新该无效数据簇的簇累计擦除次数,比如进行加1操作;当有新建数据文件写入时,根据每个数据簇的簇累计擦除次数,选择用于写入新建数据文件的空闲数据簇,比如,基于均衡擦除的目的,优先选择簇累计擦除次数小的空闲数据簇,这有利于延长Flash存储器的使用寿命。
[0101] 在本发明的另一个实施例中,如图9~10、图3~7所示,一种基于Nor Flash存储器的嵌入式系统的文件存储格式,包括:存储格式头部,索引数据区,索引数据交换区,数据簇区;
[0102] 所述索引数据区有两个,两个所述索引数据区的长度相等;每个所述索引数据区包括一个标号,当所述索引数据区被更新时,更新对应的所述标号;
[0103] 所述存储格式头部,包括存储格式版本信息、索引数据区信息、交换区信息和数据簇区信息;所述交换区信息包括所述索引数据交换区的起始位置、所述索引数据交换区的长度,以及每个索引数据项的长度;所述索引数据区信息包括两个索引数据区的起始位置和索引数据区的长度;所述数据簇区信息包括所述数据簇区的起始位置、所述数据簇区的长度,以及每个数据簇的长度;
[0104] 所述数据簇区,包括若干数据簇,每个数据簇是存储一个数据文件的基本单位;每个数据簇还包括头部标记,所述头部标记包括簇操作状态和簇累计擦除次数;
[0105] 所述索引数据交换区,包括若干索引数据项,所述索引数据项包括索引项和/或数据项,所述文件操作状态包含在所述索引项和/或数据项内;所述文件操作状态包括空闲、正在写入、已写入、删除;其中,所述索引项还包括大于预设长度的所述数据文件对应的文件索引信息,所述数据项还包括不大于所述预设长度的所述数据文件;所述数据项还包括文件编号、文件长度、校验位;所述索引项还包括文件编号、文件长度、若干所述数据文件对应的数据簇编号、校验位;
[0106] 当写入新建数据文件时,判断新建数据文件长度是否大于所述预设长度;
[0107] 当所述新建数据文件长度大于所述预设长度,且所述数据簇区有满足所述新建数据文件长度的空闲数据簇时,将所述新建数据文件写入对应的空闲数据簇;当所述新建数据文件已写入所述数据簇区时,在所述索引数据交换区生成对应的索引项;当所述新建数据文件长度不大于所述预设长度时,在所述索引数据交换区生成对应的数据项,将所述新建数据文件写入所述数据项;
[0108] 当将所述新建数据文件写入对应的空闲数据簇时,将所述空闲数据簇的簇操作状态标记为正在写入;当完成将所述新建数据文件写入对应的空闲数据簇时,更改所述空闲数据簇的簇操作状态为已写入;
[0109] 当修改所述数据簇区的数据文件时,将修改后的数据文件生成一个新建数据文件;
[0110] 当删除所述数据簇区的数据文件时,在所述索引数据交换区生成新建索引数据项,所述新建索引数据项的文件操作状态为删除;
[0111] 当所述索引数据区有两个时,分析所述索引数据区的工作状态,识别出当前处于激活状态的索引数据区;当所述索引数据交换区的存储比例达到预设条件时,将所述索引数据交换区的内容和当前处于激活状态的所述索引数据区的内容,更新至当前处于未激活的所述索引数据区;当所述索引数据交换区的内容更新至当前处于未激活的所述索引数据区后,清空所述索引数据交换区;更新两个所述索引数据区的工作状态;
[0112] 根据数据文件长度以及Nor Flash存储器的写入单位,将一个数据文件的写入操作切分为若干个写入操作任务;
[0113] 当系统空闲时,通过Nor Flash存储器的擦除对无效数据簇进行回收;其中,所述擦除的优先级低于业务的优先级;当对所述无效数据簇进行擦除操作时,更新所述无效数据簇的簇累计擦除次数;当有新建数据文件写入时,根据所述簇累计擦除次数,选择用于写入所述新建数据文件的空闲数据簇。
[0114] 具体的,相对前一个实施例,本实施例有两个索引数据区。索引数据区是对索引数据交换区的备份,两个索引数据区又互为备份,所以引入了两级备份,增强了闪存上的文件系统的健壮性。
[0115] 两个索引数据区的结构和长度相同,每个索引数据区包括一个标号,当所述索引数据区被更新时,更新对应的标号。根据索引数据区的标号的大小分析索引数据区的工作状态,判断该索引数据区当前是否处于激活状态。比如,两个索引数据区的标号分别为3、4,标号为4的索引数据区表明已被更新4次,大于标号3,说明标号为4的索引数据区当前为激活状态,标号为3的索引数据区为未激活。
[0116] 当索引数据交换区的存储比例达到预设条件时,将索引数据交换区的内容和当前处于激活状态的索引数据区的内容,更新至当前处于未激活的索引数据区。索引数据交换区记录的是最近的文件操作信息,当前处于激活状态的索引数据区的内容记录的是该索引数据交换区记录的之前的文件操作信息,对同一文件的操作,只选择对应最后操作的索引数据项复制至当前处于未激活的索引数据区。该更新执行后,再更新当前处于未激活的索引数据区的标号。
[0117] 当读取数据簇区的数据文件时,首先在索引数据交换区查找该数据文件的最后一次操作的索引数据项;如果找到,则根据该索引数据项的若干数据簇编号得到若干数据簇的起始位置,根据该若干数据簇的起始位置读取对应的数据簇,从而获得对应的数据文件。如果没有找到,则在当前处于激活态的索引数据区继续查找;如果找到,则采用与索引数据交换区类似的方法获得对应的数据文件。
[0118] 应当说明的是,上述实施例均可根据需要自由组合。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。