在嵌入系统的非易失存储器中进行数据操作的方法

文档序号:6555771阅读:147来源:国知局
专利名称:在嵌入系统的非易失存储器中进行数据操作的方法
技术领域
本发明涉及嵌入系统的数据存储领域,具体是涉及一种在嵌入系统的非易失存储器中进行数据操作的方法。
背景技术
随着电子技术的不断发展,嵌入式系统越来越多地在控制类、消费类、通讯类等电子产品中广泛应用。FLASH(非易失存储器)以其制造成本低廉、存储容量大、数据非易失、无机械故障等优点,在目前的嵌入系统中被普遍使用来保存系统的程序。但是由于FLASH在已经有脏数据的情况下写入数据之前必须进行擦除操作,而擦除操作很费时间,并且擦除次数有限,因此在嵌入系统中如果不特殊处理不能用来存储数据,否则会大大降低系统的可靠性和实时性。人们为了在嵌入系统能够使用FLASH存储数据,提出了一种文件系统,对Flash存储器中的数据内容进行基于文件代号的存储管理,同时对于Flash存储器本身的坏损单元自动进行应用透明的坏损管理。采用这种方式,大大提高了系统数据存储的可靠性,因此许多嵌入系统采用这种方式来存储数据。但是用文件系统存储数据,需要事先建立一个文件系统,而我们知道大量的嵌入系统不需要文件系统的支持,需要保存的数据大部分以数据结构或一块内存区域的形式存在,如果为了单独保存这些数据而建立一套文件系统,不仅增大了代码量,使用起来也比较麻烦。

发明内容本发明的目的在于提供一种能够基于简单数据库形式实现的在嵌入系统的非易失存储器中进行数据操作的方法。
为实现上述目的,本发明所采用的技术方案是一种在嵌入系统的非易失存储器中进行数据操作的方法,所述非易失存储器中设置有数据区,所述数据区中包括记录区;所述记录区配置有记录指针,所述记录指针指向记录区的空白写位置,当记录区为空时,指向记录区的开始位置;所述数据操作的方法包括数据存储的方法,所述数据存储的方法包括如下步骤1)构造记录,所述记录包括记录头、数据部分和记录尾;所述记录头包括所记录数据的识别信息,所述数据部分为需要记录的内容,所述记录尾包括校验码;2)根据记录的长度判断记录区是否已满,若已满则清空记录区,并将记录指针指向记录区的开始位置,然后执行步骤3);若未满,则直接执行步骤3);3)将记录以追加方式写入所述记录指针指向的位置,并将记录指针随之后移,后移大小为该记录的实际长度。
优选的是,所述数据区中还包括备份区,其大小不小于所需要存储的全部系统数据的大小;所述备份区配置有备份指针,所述备份指针指向备份区的空白写位置,当备份区为空时,指向备份区的开始位置;所述步骤2)中若记录区已满,则根据所需要存储的全部系统数据的大小判断备份区是否已满,若已满则清空备份区并将备份指针指向备份区的开始位置,然后执行步骤2a);若未满,则直接执行步骤2a);2a)将当前的全部系统数据按步骤1)所述构造成记录,并以追加方式逐条写入所述备份指针指向的位置,每写入一条记录,备份指针随之后移,后移大小为当前写入记录的长度;待备份完成后,清空记录区,并将记录指针指向记录区的开始位置,然后执行步骤3)。
所述记录可以是数据部分存储变量的内容的表记录;所述记录头包括表名字、记录长度;所述表名字与该记录所关联的变量唯一对应;所述记录长度为数据部分的长度。
所述记录也可以是数据部分存储变量中变化的单元的条记录;所述记录头还包括存储类型、记录号;所述存储类型包括表类型、记录类型,所述表记录对应的存储类型为表类型,所述条记录对应的存储类型为记录类型;所述记录号在所述存储类型为表类型以外的其他类型时有效,所述记录号为与该记录所关联的单元在所属变量中的序号。
所述记录还可以是数据部分存储变量某个单元中的单个字段的字段记录;所述记录头还包括记录偏移;所述存储类型还包括字段类型,所述字段记录对应的存储类型为字段类型;所述记录偏移在所述存储类型为字段类型时有效,所述记录偏移为该记录所存储的字段在所述记录号所表示的那个单元中的位置。
上述数据操作的方法还包括数据恢复的方法,所述数据恢复的方法可采用历史恢复法按照先备份区后记录区的顺序进行数据恢复,并且每个区都按照记录存放的顺序从前到后进行恢复,关于相同内容的记录,后恢复的覆盖之前恢复的,直到全部记录恢复完。
也可采用倒序恢复法按照先记录区后备份区的顺序进行数据恢复,并且每个区都按照记录存放的顺序从后到前进行恢复,关于相同内容的记录,后恢复的不覆盖之前恢复的,直到全部记录恢复完。
为保证数据安全,在进行数据恢复时,还执行如下数据安全机制根据每条记录的记录头和记录尾信息判断恢复出的记录是否正确,若是则采用,若否则放弃。
本发明采用上述技术方案,有益的技术效果在于1)通过采用日志方式存储系统数据,可以广泛用于嵌入系统中,提高系统的可靠性和实时性。并且数据就以原先的形式加上很少的结构头尾信息来保存,因此系统实现起来简单容易,增加的代码量也不大。另外还可以把系统加密、安全认证信息也保存到FLASH中,由于采用日志方式存储数据,其记录位置可变,因此提高了系统破解的难度,进一步提高了系统的安全性。
2)在擦除清空记录区之前,先把全部系统数据保存到备份区,因此即使在擦除过程中断电,备份区也还有一份数据记录的备份,保证了数据的完整性。
3)通过设置不同的记录存储类型,可以保存系统中任何需要保存的数据,包括定义数据结构的变量或一块连续内存,也可以把要保存的整块数据分成几个部分,小到一个字,从而只保存整块数据中变化的部分,减少数据的保存量和FLASH的写次数。
下面通过实施例并结合附图对本发明作进一步的详细说明。

图1是FLASH的数据区分区示意图。
图2是记录保存流程示意图。
图3是记录结构示意图。
图4是将一块连续内存进行记录划分的示意图。
具体实施方式一种在嵌入系统的FLASH中进行数据操作的方法,在FLASH中定义连续几个块(BLOCK)作为系统数据区使用,并分为记录区和备份区两部分。如图1所示,FLASH划分5块作为数据区使用,4块为记录区,1块为备份区。需要注意的是,由于备份区需要在作记录区擦除前进行全部系统数据的备份,因此要求其大小不小于所需要存储的全部系统数据的大小,否则,数据将备份不下。记录区和备份区分别配置有记录指针和备份指针,指向各自区的空白写位置,当各自区为空时,则指向各自区的开始位置。
本发明数据操作的方法包括数据存储的方法和数据恢复的方法以及数据恢复时的数据安全机制,数据存储方法的流程如图2所示,包括如下步骤1)构造记录。记录的结构如图3所示,包括记录头、数据部分和记录尾;记录头包含所记录数据的识别信息,数据部分为需要记录的内容,记录尾为校验码。
系统可以通过构造不同存储类型的记录保存任何需要保存的数据,包括本身就是表结构的变量或一块连续内存,对于一块连续内存可以分成固定大小的许多个小块,每个小块作为一条记录,每条记录包括若干个字组成,当然也可以不分,直接作为一条包括若干字的记录使用。由于连续内存可定义成类似变量的表结构,因此下面的描述均以变量来表示。
一般而言,要保存的变量都定义为一个数据表的结构,并可以分为大小相同的一个到多个单元(例如数据表中的每一条数据就是一个单元;结构数组中的每一个元素就是一个单元;连续内存可作为一整个单元,也可划分为长度相等的若干个单元;对于某些不具有结构的变量,则将整个变量视为一个单元),每个单元还可以细分为字段或字。如果是将整个变量的内容进行保存,这种记录称为表记录。此时,记录头的识别信息只需要包括表名字、记录长度就可以了。所述表名字(也叫表ID)与该记录所关联的变量唯一对应,记录长度为记录数据部分的长度。
为了减少存储的数据量和FLASH的写次数,也可以只将变量中发生变化的某个单元保存起来,这种记录称为条记录。当所存储的记录中同时有表记录和条记录的时候,记录头的识别信息就还需要包括存储类型、记录号。存储类型为表类型、记录类型,分别对应表记录和条记录,设置存储类型目的在于区分记录的种类。当存储类型为表类型以外的其他类型时记录号有效,它表示与该记录所关联的那个单元在所属变量中的序号。
有时候变量中只有某个单元中的某个字或字段发生了变化,也可以只将变化的字或字段保存起来,这种记录称为字段记录。这时,记录头的识别信息就需要进一步包括记录偏移。存储类型中也增加了相应的字段类型。当存储类型为字段类型时记录号和记录偏移有效。记录偏移为该记录所存储的字段在相应记录号所表示的那个单元中的位置。当然如果变量本身没有单元的划分,即将整个变量看作一个单元。
2)根据记录的长度判断记录区是否已满,即是否还有足够的剩余空间来写入该条记录,若记录区已满,则再根据所需要存储的全部系统数据的大小判断备份区是否已满,若备份区已满则清空备份区并将备份指针指向备份区的开始位置,然后执行步骤2a);若备份区未满,则直接执行步骤2a);若记录区未满,则直接执行步骤3);2a)将当前的全部系统数据,即内存中运行的需要保存的全部系统数据,按步骤1)所述构造成记录,并以追加方式逐条写入备份指针指向的位置,每写入一条记录,备份指针随之后移,后移大小为当前写入记录的长度;待备份完成后,清空记录区,并将记录指针指向记录区的开始位置,然后执行步骤3)。
3)将记录以追加方式写入记录指针指向的位置,并将记录指针随之后移,后移大小为该记录的实际长度。
下面介绍系统数据恢复的方法。在系统重新启动时,开始从FLASH中恢复先前保存的系统数据。由于整个数据区对于每个保存的变量来说可能保存有许多条记录,而最后保存的记录有效,因此恢复系统数据的方法就是找出最后写进去的记录,即恢复重启前每个系统数据最后一次写进去的记录。可以有两种恢复方法1、历史恢复法,从历史最早的记录开始恢复,按照先备份区后记录区的顺序进行,并且每个区都按照记录存放的顺序从前到后进行恢复,由于前面记录的数据是老的数据,因此关于相同内容的记录,后恢复的覆盖之前恢复的,直到全部记录恢复完,保证恢复出来的是最新记录。
2、倒序恢复法按照先记录区后备份区的顺序进行数据恢复,并且每个区都按照记录存放的顺序从后到前进行恢复,关于相同内容的记录,后恢复的不覆盖之前恢复的,直到全部记录恢复完,保证全部最新数据恢复出来。
为保证数据安全,在进行数据恢复时,执行如下数据安全机制根据每条记录的记录头和记录尾信息判断恢复出的记录是否正确,若是则采用,若否则放弃。
下面以保存一个结构数组X1、一个结构变量X2和一块内存区域X3为例来说明本发明的具体实施过程。
X1定义如下Typedef struct_STORE_TABLE_X1{int TabId;/*存储表的id*/int field_1;int field_2;…Int field_n} X1;X2定义如下Typedef struct_STORE_TABLE_X2{int TabId;/*存储表的id*/int field_1;int field_2;…Int field_n} X2[100];X3定义如下Typedef struct_STORE_TABLE_X3{int TabId;/*存储表的id*/
int*data;}X3;X3.data=(int*)malloc(1024);X3可按照图4所示分为16个64字的记录。
三个变量的每一个都可以作为表记录存到FLASH的数据区中。例如,X1要保存,直接调用FLASH表记录API接口TableWrite(X1)。该接口根据X1的表ID按照图3所示的记录结构造一条表记录追加到FLASH数据区的记录区中。因为是表记录,因此这时记录号和记录偏移不用定义,表ID对应于X1的变量ID,存储类型为表类型。记录长度为X1整个的长度,数据部分为X1整个的内容,记录尾为记录数据部分的校验码。
每个变量也可以只保存变化的部分,例如,X2只有第10个单元变化,这时可以调用保存一条记录的API接口RecordWrite(X2,recordno),这时传递的参数recordno=10。该接口根据X2的表ID按照图3所示的记录结构构造一条记录追加到FLASH数据区的记录区中。因为保存的仅为一条记录,因此这时记录号有效,为10,记录偏移不用定义,表ID对应于X2的变量ID,存储类型为条类型,记录长度为X2一条记录的长度,数据部分为X2第10个单元,同样记录尾为记录数据部分的校验码。
假如某个变量只有一个字需要存储,如X3只有第648个字要存储。这时可以调用保存一个数据字段的API接口FieldWrite(X3,recordno,field_offset),这时传递的参数recordno=10,field_offset=8。该接口根据X3的ID按照图3所示的记录结构构造一条记录追加到FLASH数据区的记录区中。因为保存的为一个数据字段,因此这时记录号有效,为10;记录偏移有效,等于8;表ID对应X3的变量ID;存储类型为字段类型;记录长度这时为一个字段的长度;数据部分为X3第648个字的内容,同样记录尾为记录数据部分的校验码。
在每保存一条记录后,记录指针都要根据记录的实际长度(为记录数据长度加记录头尾长度之和)而向后移动。当移到记录区的最后不足以保存一条记录时,这时要进行数据备份和数据记录区的删除清空的工作,先把当前的需要保存的系统数据按照表记录的结构(因为是保存全部数据,所以采用表记录结构)全部保存到备份区,然后执行记录区删除清空的工作。保存记录到备份区的方式与记录区相同,也采用日志追加方式。在备份区接近用完时(剩余空间不足以保存全部备份记录时),这时要先执行备份区的删除清空工作,再保存备份数据,再执行记录区删除清空的工作,最后再保存要保存的记录。
在恢复数据时(发生在每次系统启动后),本实例中采用历史恢复法,当然也可以采用倒序恢复法。先恢复备份区的数据,再从记录区第一个块开始恢复记录区的数据,相同的记录后面恢复的覆盖前面恢复的,直到整个4个块的记录区恢复完才结束本次恢复任务,这样能够保证恢复出来的是上次保存的最后记录。
本发明通过采用日志追加方式存储系统数据,数据结构形式简单灵活,系统实现起来简单容易,增加的代码量也不大。由于采用日志方式存储数据,其记录位置可变,因此还可以把系统加密、安全认证信息也保存到FLASH中,提高了系统软件解密的难度。此外,基于本发明数据结构的特点,还可以把系统加密、安全认证信息分成几个部分分别保存到FLASH的不同位置,进一步提高数据的安全性。
权利要求
1.一种在嵌入系统的非易失存储器中进行数据操作的方法,所述非易失存储器中设置有数据区,所述数据区中包括记录区;所述记录区配置有记录指针,所述记录指针指向记录区的空白写位置,当记录区为空时,指向记录区的开始位置;所述数据操作的方法包括数据存储的方法,所述数据存储的方法包括如下步骤1)构造记录,所述记录包括记录头、数据部分和记录尾;所述记录头包括所记录数据的识别信息,所述数据部分为需要记录的内容,所述记录尾包括校验码;2)根据记录的长度判断记录区是否已满,若已满则清空记录区,并将记录指针指向记录区的开始位置,然后执行步骤3);若未满,则直接执行步骤3);3)将记录以追加方式写入所述记录指针指向的位置,并将记录指针随之后移,后移大小为该记录的实际长度。
2.根据权利要求1所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于所述数据区中还包括备份区,其大小不小于所需要存储的全部系统数据的大小;所述备份区配置有备份指针,所述备份指针指向备份区的空白写位置,当备份区为空时,指向备份区的开始位置;所述步骤2)中若记录区已满,则根据所需要存储的全部系统数据的大小判断备份区是否已满,若已满则清空备份区并将备份指针指向备份区的开始位置,然后执行步骤2a);若未满,则直接执行步骤2a);2a)将当前的全部系统数据按步骤1)所述构造成记录,并以追加方式逐条写入所述备份指针指向的位置,每写入一条记录,备份指针随之后移,后移大小为当前写入记录的长度;待备份完成后,清空记录区,并将记录指针指向记录区的开始位置,然后执行步骤3)。
3.根据权利要求2所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于所述记录包括数据部分存储变量的内容的表记录;所述记录头包括表名字、记录长度;所述表名字与该记录所关联的变量唯一对应;所述记录长度为数据部分的长度。
4.根据权利要求3所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于所述记录还包括数据部分存储变量中变化的单元的条记录;所述记录头还包括存储类型、记录号;所述存储类型包括表类型、记录类型,所述表记录对应的存储类型为表类型,所述条记录对应的存储类型为记录类型;所述记录号在所述存储类型为表类型以外的其他类型时有效,所述记录号为与该记录所关联的单元在所属变量中的序号。
5.根据权利要求4所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于所述记录还包括数据部分存储变量某个单元中的单个字段的字段记录;所述记录头还包括记录偏移;所述存储类型还包括字段类型,所述字段记录对应的存储类型为字段类型;所述记录偏移在所述存储类型为字段类型时有效,所述记录偏移为该记录所存储的字段在所述记录号所表示的那个单元中的位置。
6.根据权利要求2~5任意一项所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于所述数据操作的方法还包括数据恢复的方法,所述数据恢复的方法包括如下步骤按照先备份区后记录区的顺序进行数据恢复,并且每个区都按照记录存放的顺序从前到后进行恢复,关于相同内容的记录,后恢复的覆盖之前恢复的,直到全部记录恢复完。
7.根据权利要求2~5任意一项所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于所述数据操作的方法还包括数据恢复的方法,所述数据恢复的方法包括如下步骤按照先记录区后备份区的顺序进行数据恢复,并且每个区都按照记录存放的顺序从后到前进行恢复,关于相同内容的记录,后恢复的不覆盖之前恢复的,直到全部记录恢复完。
8.根据权利要求6所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于在进行数据恢复时,还执行如下数据安全机制根据每条记录的记录头和记录尾信息判断恢复出的记录是否正确,若是则采用,若否则放弃。
9.根据权利要求7所述的在嵌入系统的非易失存储器中进行数据操作的方法,其特征在于在进行数据恢复时,还执行如下数据安全机制根据每条记录的记录头和记录尾信息判断恢复出的记录是否正确,若是则采用,若否则放弃。
全文摘要
本发明提出了一种在嵌入系统的非易失存储器中进行数据操作的方法。根据该方法系统数据通过定义一种与数据库数据表相似的表的结构以日志方式追加记录的方式保存到FLASH中,在保存之前不执行擦除动作,提高了写入速度。同时还可以把数据区分为记录区和备份区,提高了数据记录的安全性,通过该方法可以在FLASH中保存任何系统数据,大到一块内存区域,小到一个字的数据。另外由于每次保存的位置不固定和可以把整块数据分成部分保存到FLASH的不同位置,因此提高了数据的保密性。
文档编号G06F11/14GK1821978SQ20061003310
公开日2006年8月23日 申请日期2006年1月16日 优先权日2006年1月16日
发明者毛国红 申请人:深圳创维-Rgb电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1