一种基于NandFlash的数据存储方法与流程

文档序号:12463812阅读:726来源:国知局
一种基于NandFlash的数据存储方法与流程
本发明涉及一种基于NandFlash的数据存储方法,属于
技术领域

背景技术
:在嵌入式系统中,对数据库的操作具有定时限制的特性,这里把应用于嵌入式系统的数据库系统称为嵌入式数据库系统或嵌入式实时数据库系统(ERTDBS)。目前嵌入式软件系统开发的挑战之一,体现在对各种数据的管理能否建立一套可靠、高效、稳定的管理模式,嵌入式数据库可谓应运而生。嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。它们是使用精简代码编写的,对于嵌入式设备,其速度更快,效果更理想。嵌入式运行模式允许嵌入式数据库通过SQL来轻松管理应用程序数据,而不依靠原始的文本文件。嵌入式数据库还提供零配置运行模式,这样可以启用其中一个并运行一个快照。嵌入式系统必须能够在没有人工干预的情况下,长时间不间断地运行,必须充分保证其可靠性。同时要求数据库操作具备可预知性,而且系统的大小和性能也都必须是可预知的,这样才能保证系统的性能。嵌入式系统中会不可避免地与底层硬件打交道,因此在数据管理时,也要有底层控制的能力,如什么时候会发生磁盘操作,磁盘操作的次数,如何控制等。底层控制的能力是决定数据库管理操作的关键。嵌入式数据库是嵌入式系统的重要组成部分,也成为对越来越多的个性化应用开发和管理而采用的一种必不可少的有效手段。嵌入式数据库用途广泛,如用于消费电子产品、移动计算设备、企业实时管理应用、网络存储与管理以及各种专用设备,这一市场目前正处于高速增长之中。目前常用的嵌入式数据库有BerkeleyDB、SQLite、Empress、eXtremeDB、Firebird嵌入服务器版、mSQL,然而这些嵌入式数据库都需要嵌入式系统与文件系统的支持,并且对系统的程序存储器以及内存都有比较高的要求,不适合在中小型的嵌入式系统进行应用。NandFlash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。NandFlash由于生产工艺的问题,其在出厂时可能存在一定的坏块。这些固有坏块不能用于存储数据,已被产家标识好。另外,使用过程中由于读写次数增多,好块也会变得不稳定或失效,成为坏块,这就是出厂后产生的坏块,从而导致存储的数据时效。技术实现要素:本发明所要解决的技术问题是克服现有技术的缺陷,提供一种基于NandFlash的数据存储方法,基于大容量的NandFlash芯片,使用数据冗余技术,能够在运行中更新NandFlash的坏块映射表与存储信息表,避免了数据的丢失。为解决上述技术问题,本发明提供一种基于NandFlash的数据存储方法,包括以下步骤:1)设计数据存储的数据结构;所述数据结构为:WritePtr——下一条数据记录的写指针;ValidFlag——数据有效标志;UserData——用户数据;CRC——CRC16校验;左侧为字段,右侧为字段所指代的含义;2)对Nandflash的坏块进行检测;3)设计数据存储映射;数据存储映射具体为:检测NandFlash的坏块,建立坏块映射表,将NandFlash的可用块划分为两个相同大小的数据存储区与一个备用数据区,建立两个数据存储区映射表与一个备用数据区映射表;4)进行数据存储,具体如下:4-1)分配每一种数据的存储空间,存储空间在两个数据存储区同时分配,两个数据存储区定义为数据存储区1与数据存储区2,为此每种数据配置一条索引表,索引表的数据结构为:InitFlag——索引表初始化标识;StartBlock——起始块号;EndBlock——结束块号;BlockSize——块大小;RecordLen——一条数据记录大小;DataLength——有效数据总长度;WritePtr1——写指针1;WritePtr2——写指针2;左侧为字段,右侧为字段所指代的含义;4-2)读取数据索引表,然后判断索引表的有效性,如果索引表无效,则进行索引表初始化,如果索引表的有效,然后判断是否数据存储同步;4-3)如果是,则判断数据写指针是否为块首地址,如果为块首地址则先进行擦除,然后将用户数据及校验写入两个缓冲区;4-4)如果NandFlash进行数据写入失败,则标记当前块为坏块,然后更新坏块映射表,从备用数据区分配一个缓冲区到数据存储区,再更新备用数据区映射表与数据存储区映射表,然后重新写入;4-5)每个数据存储区写入成功后更新数据索引表的写指针。前述的对Nandflash的坏块进行检测包括对先天性坏块进行检测和对后天性坏块进行检测;对先天性坏块进行检测方法为:调用擦除程序,将NandFlash全部擦除一遍,然后执行如下检测操作:如果页大于512字节,badblockpos=0;badblockbytes=2;如果页小于512字节,badblockpos=5;badblockbytes=1;读取每个block的前两页OOB区域的第badblockpos开始的后badblockbytes字节是否为全0xff,如果是,那么说明该block是好的,否则该block是坏块;对后天性坏块进行检测方法为:如果BlockErase或者PageProgram错误,则为坏块,则将坏块的第一个page的sparearea的前6个Byte都标记为非0xff的值。前述的步骤4)中,写入时序为先写数据存储区1,然后更新写指针1,再数据存储区2,最后更新写指针2。前述的步骤4)中,对存储数据的总长度进行了限制,当存储的数据达到设定的长度时,则进行循环写入,将最早的数据覆盖。当出现两个数据存储区的数据不同步时,需要进行数据同步,具体过程如下:写指针1与写指针2一致时,数据存储区1读取写指针1开始的RecordLen长度数据,判断数据的有效性,数据有效则更新写指针1,再将数据写入到数据存储区2,更新写指针2;写指针1与写指针2不一致时,对于数据存储了而写指针2未更新的情况,判断数据的有效性,数据有效则更新写指针2,再将数据写入到数据存储区2;对于数据存储区2还没开始写入的情况,只需要将数据存储区2中缺失的数据从数据存储区1读取再写入到数据存储区2,再将写指针2更新。当需要进行数据检索时,过程如下:6-1)、首先读取索引表,然后判断索引表的有效性,索引表无效则重新初始化索引表;6-2)、判断数据是否发生了循环写入,如果发生了循环写入,则将数据存储区分为两个区来进行查找,一个是写指针前的区域,还有一个是写指针之后的区域,然后转入步骤6-3);如果没有发生循环写入,则转入步骤6-4)6-3)、对写指针前的区域使用二分法查询第一个符合检索条件的数据记录,写入查询缓冲区,使用二分法可以迅速定位到需要查询的数据,然后从第一条记录往后依次寻找,直至不再符合查询条件或者查询缓冲区满,检索结束;如果在写指针前的区域没有查询到数据,则在写指针后的区域查询第一个符合检索条件的数据记录,写入查询缓冲区,直至不再符合查询条件或者查询缓冲区满,检索结束;6-4)、对数据存储区使用二分法查询第一个符合检索条件的数据记录,写入查询缓冲区,然后从第一条记录往后依次寻找,直至不再符合查询条件或者查询缓冲区满,检索结束。当需要数据删除时,使用数据检索流程定位需要删除的数据,写入该数据记录的无效标记,既可从数据库删除数据。当需要进行数据更新时,过程如下:8-1),定位需要更新的数据所在的数据块A以及在数据块内的偏移地址Offset;8-2),从备用数据区中选取一个数据块B并进行擦除;8-3),将数据块A中从地址0到偏移地址Offset的数据写入数据块B;8-4),将数据更新后,写入数据块B中偏移地址Offset之后RecordLen长度数据;8-5),将数据块A中剩余的数据写入数据块B中同样位置;8-6),将数据块A分配到备用数据区,更新数据存储区映射表与备用数据区映射表。本发明所达到的有益效果:1、本发明提供的NandFlash的分区方法通过维护数据存储区映射表、坏区映射表、备用数据区映射表的办法进行,即隔离了NandFlash的坏块,又实现了数据的冗余存储。2、本发明提供的数据记录的数据结构可以迅速定位到下一条数据记录,保证数据存储的可靠性,并且对数据的操作可以通过重写标志位的方法进行数据删除操作。3、本发明提供的数据记录的写入时序,在发生强干扰或掉电导致系统复位时能够保证索引表不发生混乱,保证了系统运行的稳定性。4、本发明可以广泛地用于中小型嵌入式系统中需要进行数据存储与数据检索的场合,具有访问速度块,存储效率高,可靠性好的特点,并且无需文件系统的支持,非常适合中小型嵌入式系统的工业应用。附图说明图1是NandFlash分区及映射表;图2是数据写入流程;图3是数据同步流程;图4是数据检索流程。具体实施方式下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。本发明的基于NandFlash的数据存储方法,包括以下几个部分:1、设计数据存储的数据结构在存储用户数据时,当嵌入式系统遭遇强干扰或掉电时,写入的数据会丢失并导致索引信息被破坏,为提高数据存储的可靠性,设计了如下的数据结构:其中,WritePtr为4字节的下一条数据记录的写指针,ValidFlag为2字节的数据有效标志,UserData为用户数据,CRC为2字节的用户数据的CRC16校验。2、对Nandflash的坏块进行检测2.1先天性坏块检测这种坏块是在生产过程中产生的,一般芯片原厂都会在出厂时都会根据页面大小将坏块第一个page的sparearea的1~2个字节标记为不等于0xff的值。调用擦除程序,将NandFlash全部擦除一遍,然后执行如下检测操作:如果页大于512字节,badblockpos=0;badblockbytes=2;如果页小于512字节,badblockpos=5;badblockbytes=1;读取每个block的前两页OOB区域的第badblockpos开始的后badblockbytes字节是否为全0xff,如果是,那么说明该block是好的,否则该block是坏块。2.2后天性坏块检测NandFlash使用过程中产生的坏块称之为后天性坏块,如果BlockErase或者PageProgram错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和先天性坏块信息保持一致,将新发现的坏块的第一个page的sparearea的前6个Byte都标记为非0xff的值。3、设计数据存储映射为保证数据的可靠存储,首先检测NandFlash的坏块,建立坏块映射表,将NandFlash的可用块划分为两个相同大小的数据存储区与一个备用数据区,建立两个数据存储区映射表与一个备用数据区映射表,NandFlash分区及映射表如图1所示。当运行时出现坏块后,标记坏块,再更新坏区映射表,然后使用备用数据区的一个存储块替代坏块,将另一个数据存储区相应块的数据备份新数据块,然后更新数据存储区映射表与备用数据区映射表。4、进行数据存储首先按照设置分配每一种数据的存储空间,存储空间在两个数据存储区(定义为数据存储区1与数据存储区2)同时分配,为此每种数据配置一条索引表,索引表的数据结构如下。索引表的每个字段的含义如表1所示。表1索引表的字段定义序号字段含义1InitFlag索引表初始化标识2StartBlock起始块号3EndBlock结束块号4BlockSize块大小5RecordLen一条数据记录大小6DataLength有效数据总长度7WritePtr1写指针18WritePtr2写指针2其中,InitFlag为0x55AA表示索引表已经初始化,起始块号与结束块号为数据存储区映射表中的序号,而非Nandflash物理块的序号,不同的NandFlash芯片对应不同的块大小BlockSize,因为数据在两个数据存储区都存储,为防止意外干扰,索引中使用两个写指针,当出现不匹配进行数据同步以保证数据的双备份。数据记录的写入流程如图2所示,首先读取数据索引表,然后判断索引表的有效性,如果索引表无效,则进行索引表初始化,如果索引表的有效,然后判断是否数据存储同步;如果是,则判断数据写指针是否为块首地址,如果为块首地址则先进行擦除,然后先将用户数据及校验写入两个缓冲区。当NandFlash进行数据写入失败,则标记当前块为坏块,然后更新坏块映射表,从备用数据区分配一个缓冲区到数据存储区,再更新备用数据区映射表与数据存储区映射表,然后重新写入。在每个数据存储区写入成功后更新数据索引表的写指针。写入时序为先写数据存储区1,然后更新写指针1,再数据存储区2,最后更新写指针2,这样的写入时序可以保证遇强干扰或掉电时,数据索引与数据记录能够自动按照流程进行追溯并自动恢复。为了避免数据无限制膨胀,对数据的总长度进行了限制,当存储的数据达到设定的长度时,则进行循环写入,将最早的数据覆盖。5、同步存储数据数据存储在两个数据存储区,必须保证数据在两个位置同时保存正确才能避免一个数据块损坏的情况下数据丢失,在遇到异常情况如掉电、雷击时,存储的数据将会出现不同步,具体体现在写指针1与写指针2的不一致。此时需要进行数据同步,同步的具体流程图如图3所示。写指针1与写指针2一致时,存在极端情形,就是数据存储区1的数据已经写入了而写指针1没有写入,这时可以读取写指针1开始的RecordLen长度数据,判断数据的有效性,数据有效则更新写指针1,再将数据写入到数据存储区2,更新写指针2。写指针1与写指针2不一致时,由于存储数据都是先写数据存储区1,再写数据存储区2,必然是写数据存储区2的过程中发生了中断,有可能是数据存储了而写指针2未更新,还有就是数据存储区2还没开始写入。对于前者,处理流程与数据存储区1的极端情形一样,即判断数据的有效性,数据有效则更新写指针2,再将数据写入到数据存储区2。对于后者,只需要将数据存储区2中缺失的数据从数据存储区1读取再写入到数据存储区2,再将写指针2更新。6、进行数据检索在工业应用场合,数据的写入是以时间为顺序的,数据的检索同样是以时间为顺序的,为方便数据检索,每条数据均编列了时标,数据检索的流程如图4所示。6-1、首先读取索引表,然后判断索引表的有效性,索引表无效的需要重新初始化索引表。6-2、判断数据是否发生了循环写入,如果发生了循环写入,则将数据存储区分为两个区来进行查找,一个是写指针前的区域,还有一个是写指针之后的区域,然后转入步骤6-3);如果没有发生循环写入,则,转入步骤6-4)6-3、对写指针前的区域使用二分法查询第一个符合检索条件的数据记录,写入查询缓冲区,使用二分法可以迅速定位到需要查询的数据,然后从第一条记录往后依次寻找,直至不再符合查询条件或者查询缓冲区满,检索结束。如果在写指针前的区域没有查询到数据,则在写指针后的区域查询第一个符合检索条件的数据记录,写入查询缓冲区,直至不再符合查询条件或者查询缓冲区满,检索结束。6-4)、对数据存储区使用二分法查询第一个符合检索条件的数据记录,写入查询缓冲区,然后从第一条记录往后依次寻找,直至不再符合查询条件或者查询缓冲区满,检索结束。7、对数据进行删除数据记录的删除方法如下:使用数据检索流程定位需要删除的数据,写入该数据记录的无效标记,既可达到从数据库删除的目的。8、数据记录的更新当需要对某一条数据记录进行更新时,由于NandFlash的扇区必须擦除后才能再次写入,而擦除操作必须是对NandFlash的一个快,由于设计了备用数据区,可以使用备用数据区的一个块来进行中转,具体的数据更新记录流程如下:第一步,定位需要更新的数据所在的数据块A以及在数据块内的偏移地址Offset;第二步,从备用数据区中选取一个数据块B并进行擦除;第三步,将数据块A中从地址0到偏移地址Offset的数据写入数据块B;第四步,将数据更新后,写入数据块B中偏移地址Offset之后RecordLen长度数据;第五步,将数据块A中剩余的数据写入数据块B中同样位置;第六步,将数据块A分配到备用数据区,更新数据存储区映射表与备用数据区映射表。以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1