CN108415852A - 一种Flash存储器的数据存取方法 - Google Patents
一种Flash存储器的数据存取方法 Download PDFInfo
- Publication number
- CN108415852A CN108415852A CN201810172152.8A CN201810172152A CN108415852A CN 108415852 A CN108415852 A CN 108415852A CN 201810172152 A CN201810172152 A CN 201810172152A CN 108415852 A CN108415852 A CN 108415852A
- Authority
- CN
- China
- Prior art keywords
- record
- root
- subpool
- subclassification
- free time
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0238—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
- G06F12/0246—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory in block erasable memory, e.g. flash memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种Flash存储器的数据存取方法,所述Flash存储器重新规划分为根存储区、子存储区池和数据存储区,子存储区池包括1个以上的子存储区。所述存取方法包括根存储区操作、子存储区操作及数据存储区操作;其中根存储区操作包括根存储区初始化、根分类记录读取、根分类记录插入和根分类记录删除;子存储区操作包括子存储区初始化、子存储区销毁、子分类记录读取、子分类记录插入和子分类记录删除;数据存储区操作包括数据存储区初始化、数据记录读取、数据记录插入和数据记录删除。本发明能够解决使用FLASH存储器程序代码长和操作复杂的问题。
Description
技术领域
本发明属于数据存储领域,具体涉及一种Flash存储器的数据存取方法。
背景技术
数据存储是单片机系统中不可缺少的功能,主要用于存储系统的运行参数,以及在运行过程中采集到的大量数据。在单片机系统中使用的数据存储器分为EEPROM和FLASH两种。EEPROM具有单字节读写的能力,操作灵活,但是容量小,价格高,适合存储少量的运行参数等信息。FLASH具有按块擦除和按页读写的能力,容量大,价格低,适合存储大量的记录数据。FLASH有两种存储方式,一种存取方式是直接在FLASH上建立FAT16或者是FAT32文件分配表,以文件夹存储分类信息,以文件存储数据信息。这种方式操作方便,但是存储密度低,并且需要大量的程序代码,不适合小程序存储容量的单片机使用。第二是直接以扇区为单位按扇区编号顺序存取。这种方式存储密度高,程序代码量少,但是不能实现信息的分类存储,并且不能实现数据的插入、删除及自动覆盖等操作。
发明内容
本发明的目的在于提供一种基于Flash存储器的数据存取方法,解决使用FLASH存储器程序代码长和操作复杂的问题。
为了解决所述技术问题,本发明采用的技术方案是:一种Flash存储器的数据存取方法,所述Flash存储器包括根存储区、子存储区池和数据存储区,子存储区池包括1个以上的子存储区,其中根存储区用于存储数据的根分类信息,子存储区用于存储数据的子分类信息,数据存储区用于存储数据信息;所述根存储区包括根存储区占用链表、根存储区空闲链表和根分类记录区,其中根存储区占用链表为根存储区占用记录组成的静态链表,根存储区空闲链表为根存储区空闲记录组成的静态链表,根分类记录区用于存储根分类记录;所述子存储区包括子存储区占用链表、子存储区空闲链表和子分类记录区,其中子存储区占用链表为子存储区占用记录组成的静态链表,子存储区空闲链表为子存储区空闲记录组成的静态链表,子分类记录区用于存储子分类记录;所述数据存储区包括数据存储区空闲链表和数据记录区,数据存储区空闲链表为数据存储区空闲记录组成的静态链表,数据记录区用于存储数据记录;所述数据存取方法包括根存储区操作、子存储区操作及数据存储区操作;其中根存储区操作包括根存储区初始化、根分类记录读取、根分类记录插入和根分类记录删除;子存储区操作包括子存储区初始化、子存储区销毁、子分类记录读取、子分类记录插入和子分类记录删除;数据存储区操作包括数据存储区初始化、数据记录读取、数据记录插入和数据记录删除。
本发明所述的一种Flash存储器的数据存取方法,根存储区初始化步骤为:规划出FLASH存储器的部分扇区为根存储区,初始化根存储区占用链表,初始化根存储区空闲链表;其中根存储占用链表包括根存储区占用链表头和根存储区占用链表长度,根存储空闲链表包括根存储区空闲链表头和根存储区空闲链表长度;根存储占用链表初始化步骤为:将根存储区占用链表头置为系统定义的最大数,将根存储区占用链表长度置为0;根存储空闲链表初始化步骤为:将根存储区空闲链表头置为1,将根存储区空闲链表长度置为根分类记录数,将编号为1的根分类记录的后一条空闲记录的位置字段置为2,将编号为2的根分类记录的后一条空闲记录位置的字段置为3,依次类推,直到最后一条根分类记录的后一条空闲记录位置字段置为系统定义的最大数。
本发明所述的一种Flash存储器的数据存取方法,根分类记录读取的步骤包括:S01)、若根存储区占用链表长度为0,则退出根分类记录读取操作;S02)、若根存储区占用链表长度为一个正整数,将根存储区占用链表头的值作为当前根分类记录的位置,读取当前根分类记录的后一条占用记录位置字段;S03)、若后一条占用记录位置字段等于系统定义的最大数,则退出根分类记录读取操作;S04)、若后一条占用记录位置字段小于系统定义的最大数,将当前根分类记录的后一条占用记录作为当前根分类记录,依次类推,直到当前根分类记录的后一条占用记录位置字段等于系统定义的最大数或者是判断当前根分类记录为要查找的记录为止。
本发明所述的一种Flash存储器的数据存取方法,根分类记录插入的步骤包括:S01)、若根存储区空闲链表长度为0,则退出根分类记录插入操作;S02)、若根存储区空闲链表长度为一个正整数,将第一条根存储区空闲记录作为当前根分类记录,将要插入的根分类信息写入当前根分类记录的根分类信息标识字段;若当前插入的根分类的下一级是子分类则执行子存储区初始化操作,并将初始化的子存储区的起始位置赋值给当前根分类记录的下一级位置字段,当前记录的下一级类型标识置为子分类;S03)、若当前插入的根分类的下一级为数据,则执行数据记录插入操作,并将插入的数据记录的起始位置赋值给当前根分类记录的下一级位置字段,当前根分类记录的下一级类型标识置为数据;S04)、将当前根分类记录的后一条空闲记录位置字段的值赋值给根存储区空闲链表头;将根存储区占用链表头的值赋值给当前根分类记录的后一条空闲记录位置字段;将当前根分类记录的位置赋值给根存储区占用链表头。
本发明所述的一种Flash存储器的数据存取方法,根分类记录删除的步骤包括:S01)、若根存储区占用链表长度为0,则退出根分类记录删除操作;S02)、若根存储区占用链表长度为一个正整数,将根存储区占用链表头的值作为当前根分类记录的位置,若当前根分类记录不是要删除的根分类记录,则将当前根分类记录的后一条占用记录作为当前根分类记录继续比较,直到当前根分类记录为要删除的根分类记录为止;若没有找到要删除的根分类记录,则退出根分类记录删除操作;S03)、若找到要删除的根分类记录,将当前根分类记录的后一条占用记录位置字段的值赋值给当前根分类记录的前一条根分类记录的后一条占用记录位置字段,如果当前根分类记录为第一条根存储区占用记录,则将当前根分类记录的后一条占用记录位置字段的值赋值给根存储区占用链表头;然后,将根存储区空闲链表头的值赋值给当前根分类记录的后一条占用记录位置字段,将当前根分类记录的位置值赋值给根存储区空闲链表头;S04)、若当前根分类记录的下一级类型标识为子分类则执行子存储区销毁操作,若当前根分类记录的下一级类型标识为数据则执行数据记录删除操作。
本发明所述的-种Flash存储器的数据存取方法,子存储区初始化步骤为:从子存储区池中选择一个未使用的子存储区,然后初始化子存储区占用链表,初始化子存储区空闲链表;其中子存储区占用链表包括子存储区占用链表头和子存储区占用链表长度,子存储区空闲链表包括子存储区空闲链表头和子存储区空闲链表长度;子存储区占用链表初始化步骤包括:将子存储区占用链表头置为系统定义的最大数,将子存储区占用链表长度置为0;子存储区空闲链表初始化步骤包括:将子存储区空闲链表头置为1,将子存储区空闲链表长度置为子分类记录数,将编号为1的子分类记录的后一条空闲记录位置字段置为2,将编号为2的子分类记录的后一条空闲记录位置字段置为3,依次类推,直到最后一条子分类记录的后一条空闲记录位置字段置为系统定义的最大数。
本发明所述的一种Flash存储器的数据存取方法,所述的子存储区销毁操作步骤包括:将要销毁的子存储区的所有扇区执行擦除操作,如果要销毁的子存储区还有下一级子存储区,则通过子存储区销毁操作逐级销毁。
本发明所述的一种Flash存储器的数据存取方法,所述的子分类记录读取操作步骤包括:S01)、若子存储区占用链表长度为0,则退出子分类记录读取操作;S02)、若子存储区占用链表长度为一个正整数,将子存储区占用链表头的值作为当前子分类记录的位置,读取当前子分类记录的后一条占用记录位置字段;S03)、若该字段等于系统定义的最大数,则退出子分类记录读取操作;否则,将当前子分类记录的后一条占用记录作为当前子分类记录,依次类推,直到当前子分类记录的后一条占用记录位置字段等于系统定义的最大数或者是判断当前子分类记录为要查找的记录为止。
本发明所述的一种Flash存储器的数据存取方法,所述的子分类记录插入操作步骤包括:S01)、若子存储区空闲链表长度为0,则退出子分类记录插入操作;S02)、若子存储区空闲链表长度为一个正整数,将第一条子存储区空闲记录作为当前子分类记录,将要插入的子分类信息写入当前子分类记录的本级分类信息字段;若当前插入的子分类的下一级也是子分类,则执行子存储区初始化操作,并将初始化的子存储区的起始位置赋值给当前子分类记录的下一级位置字段,当前子分类记录的下一级类型标识置为子分类;S03)、若当前插入的子分类的下一级为数据,则执行数据记录插入操作,并将插入的数据记录的起始位置赋值给当前子分类记录的下一级位置字段,当前子分类记录的下一级类型标识置为数据;S04)、将当前子分类记录的后一条空闲记录位置字段的值赋值给子存储区空闲链表头;将子存储区占用链表头的值赋值给当前子分类记录的后一条空闲记录位置字段;将当前子分类记录的位置赋值给子存储区占用链表头。
本发明所述的一种Flash存储器的数据存取方法,所述的子分类记录删除操作步骤包括:S01)、若子存储区占用链表长度为0,则退出子分类记录删除操作;S02)、若子存储区占用链表长度为一个正整数,将子存储区占用链表头的值作为当前子分类记录的位置,若当前子分类记录不是要删除的子分类记录,则将当前子分类记录的后一条占用记录作为当前子分类记录继续比较,直到当前子分类记录是要删除的子分类记录为止;S03)、若没有相同记录,则退出子分类记录删除操作;否则将当前子分类记录的后一条占用记录位置字段的值赋值给当前子分类记录的前一条子分类记录的后一条占用记录位置字段;S04)、如果当前子分类记录为第一条子存储区占用记录,则将当前子分类记录的后一条占用记录位置字段的值赋值给子存储区占用链表头,然后,将子存储区空闲链表头的值赋值给当前子分类记录的后一条占用记录位置字段,将当前子分类记录的位置赋值给子存储区空闲链表头;S05)、若当前子分类记录的下一级类型标识为子分类则执行子存储区销毁操作,若当前子分类记录的下一级类型标识为数据则执行数据记录删除操作。
本发明所述的一种Flash存储器的数据存取方法,数据存储区初始化步骤包括:规划出FLASH存储器的部分扇区为数据存储区,将数据记录按顺序编号,初始化数据存储区空闲链表,数据存储区空闲链表包括数据存储区空闲链表头和数据存储区空闲链表长度;数据存储区空闲链表初始化步骤包括:将数据存储区空闲链表头置为1,将数据存储区空闲链表长度置为数据记录数,将编号为1的数据记录的后一条空闲记录位置字段置为2,将编号为2的数据记录的后一条空闲记录位置字段置为3,依次类推,直到最后一条数据记录的后一条空闲记录位置字段置为系统定义的最大数。
本发明所述的一种Flash存储器的数据存取方法,数据记录读取操作步骤包括:通过根分类记录读取操作及子分类记录读取操作逐级找到数据记录的位置,将数据读出。
本发明所述的一种Flash存储器的数据存取方法,数据记录插入操作步骤包括:若数据存储区空闲链表长度为0,则退出数据记录插入操作;否则,将第一条数据存储区空闲记录作为当前数据记录,将当前数据记录的后一条空闲记录的位置字段值赋值给数据存储区空闲链表头。然后,将要插入的数据信息写入当前数据记录。
本发明所述的一种Flash存储器的数据存取方法,数据记录删除操作步骤包括:通过根分类记录读取操作及子分类记录读取操作逐级找到数据记录作为当前数据记录,将数据存储区空闲链表头的值赋值给当前数据记录的后一条空闲记录位置字段,将当前数据记录的位置赋值给数据存储区空闲链表头。
本发明的有益效果:本发明所述数据存取方法分别对根存储区、子存储区和数据存储区进行操作,降低了原有Flash存储器文件存储方式对硬件及软件资源占用,有效解决小程序存储容量的单片机存储大量数据的问题,各分类信息区采用静态链表的组织结构,提高了存储器的读写寿命。本发明所述的一种Flash存储器的存取方法并不仅限于应用单片机系统中,还可以应用在嵌入式系统中。
附图说明
图1为实施例1中Flash存储器的数据存储结构整个存储区的结构图;
图2为实施例1中根存储区的结构示意图;
图3为实施例1中子存储区的结构示意图;
图4为实施例1中数据存储区的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为了能够更清晰的了解数据存储结构,如图1所示。本实施例所述Flash存储器的数据存储结构由根存储区、子存储区构成的子存储区池和数据存储区三部分组成,根存储区用于存储数据的根分类信息,子存储区用于存储数据的子分类信息,数据存储区用于存储数据本身的信息。
可以根据实际需求来确定各部分占用的实际存储空间容量,对于分类信息层次深且数量多而数据量小的情况,可以为子存储区池分配更大的空间;对于分类信息层次浅且数量少而数据量大的情况,可以为数据存储区分配更大的空间。子存储区的大小可以根据实际需要分配,且各子存储区大小可以不一样。FLASH存储器一般以512字节为一页,根存储区可以由一页或者多页存储,子存储区池也可以由一页或多页存储,数据存储区的每条数据记录亦可以由一页或多页存储。
根存储区结构如图2所示。根存储区由根存储区占用链表、根存储区空闲链表和根分类记录区组成。其中根存储区占用链表为根存储区占用记录组成的静态链表,由占用链表头指向该链表。根存储区占用链表包括根存储区占用链表头、根存储区占用链表长度。根存储区占用链表头为一正整数,是第一条根存储区占用记录的位置。所述的根存储区占用链表长度为一正整数或0,是根存储区占用记录的数量。
根存储区空闲链表为根存储区空闲记录组成的静态链表,由空闲链表头指向该链表。根存储区空闲链表包括根存储区空闲链表头、根存储区空闲链表长度。根存储区空闲链表头为一正整数,是第一条根存储区空闲记录的位置。根存储区空闲链表长度为一正整数或0,是根存储区空闲记录的数量。
可以将根存储区占用链表头和占用链表长度,以及空闲链表头和空闲链表长度单元放在FLASH存储器第一个扇区中固定的位置。各单元的数据宽度为4个字节。根分类记录区存储的根分类记录包括根存储区占用记录和根存储区空闲记录,根存储区占用记录由根分类信息标识、下一级类型标识、下一级位置和后一条占用记录位置组成。其中根分类信息标识为标识该条根分类记录的内容信息,可以是一个设备的名称或者是一个日期类型等。下一级类型标识为子类型或者是数据。下一级位置用于指向下一级存储区的位置,可以为子存储区的位置或者是数据记录的位置。后一条占用记录位置用于指向后一条根存储区占用记录位置。根存储区空闲记录只有后一条空闲记录位置有效,其余三个字段无效。其中后一条空闲记录位置用于指向后一条根存储区空闲记录位置。根分类记录由从第二个扇区开始的若干个连续的扇区组成,每个扇区可以存储多条根分类记录。
根存储区操作包括根存储区初始化、根分类记录读取、根分类记录插入和根分类记录删除。
根存储区初始化用来构建根存储区结构,使用FLASH存储器的第一个扇区存储占用链表头、占用链表长度、空闲链表头和空闲链表长度,如有必要可以在第一个扇区中存储数据应用类型、用户类型以及加密类型等信息。将从第二个扇区开始的若干个连续的扇区规划为根分类记录区,定义根分类记录结构,将根分类记录按顺序编号。初始化根存储区占用链表和根存储区空闲链表,将根存储区占用链表头置为系统定义的最大数(对于数据宽度为4个字节的情况,可以定义最大数为0xFFFFFFFF),将根存储区占用链表长度置为0,此时表明整个FLASH存储器为空。将根存储区空闲链表头置为1,将根存储区空闲链表长度置为根分类记录数,将编号为1的根分类记录的后一条空闲记录位置字段置为2,将编号为2的根分类记录的后一条空闲记录位置字段置为3,依次类推,直到最后一条根分类记录的后一条空闲记录位置字段置为系统定义的最大数,表明这是空闲链表的最后一条记录。
在对根存储区进行根分类记录读取操作时,首先读取根存储区占用链表长度字段,若该字段为0,则退出根分类记录读取操作,并返回根存储区为空的标识信息;否则,将根存储区占用链表头的值作为当前根分类记录的位置,读取当前根分类记录的后一条占用记录位置字段。若该字段等于系统定义的最大数,则退出根分类记录读取操作;否则,将当前根分类记录的后一条占用记录作为当前根分类记录,依次类推。若是读取整个根存储区记录信息,则直到当前根分类记录的后一条占用记录位置字段等于系统定义的最大数为止;若是查找某条根分类记录,则判断当前根分类记录为要查找的根分类记录为止。
在对根分类记录进行插入操作时,首先读取根存储区空闲链表长度字段,若该字段为0,则退出根分类记录插入操作,并返回根存储区满的标识信息;若不为0,则将第一条根存储区空闲记录作为当前根分类记录,将要插入的根分类信息写入当前根分类记录的根分类信息标识字段;若当前根分类记录的下一级是子分类则执行子存储区初始化操作,并将初始化的子存储区的起始位置赋值给当前根分类记录的下一级位置字段,当前根分类记录的下一级类型标识置为子分类;若当前根分类记录的下一级为数据,则执行数据记录插入操作,并将插入的数据记录的起始位置赋值给当前根分类记录的下一级位置字段,当前根分类记录的下一级类型标识置为数据。将当前根分类记录的后一条空闲记录位置字段的值赋值给根存储区空闲链表头;将根存储区占用链表头的值赋值给当前根分类记录的后一条空闲记录位置字段;将当前根分类记录的位置赋值给根存储区占用链表头。
在对根分类记录进行删除操作时,首先读取根存储区占用链表长度字段,若该字段为0,则退出根分类记录删除操作,并返回根存储区为空的标识信息;否则,将根存储区占用链表头的值作为当前根分类记录的位置,若当前根分类记录与要删除的根分类记录不相同,则将当前根分类记录的后一条占用记录作为当前根分类记录继续比较,直到当前根分类记录为要删除的根分类记录为止。若没有相同记录,则退出根分类记录删除操作;否则将当前根分类记录的后一条占用记录位置字段的值赋值给当前根分类记录的前一条根存储区占用记录的后一条占用记录位置字段。特别的,如果当前根分类记录为第一条根存储区占用记录,则将当前根分类记录的后一条占用记录位置字段的值赋值给根存储区占用链表头。然后,将根存储区空闲链表头的值赋值给当前根分类记录的后一条占用记录位置字段,将当前根分类记录的位置赋值给根存储区空闲链表头。若当前根分类记录的下一级类型标识为子分类则执行子存储区销毁操作,若当前根分类记录的下一级类型标识为数据则执行数据存储区删除操作。
子存储区结构如图3所示。子存储区由子存储区占用链表、子存储区空闲链表和子分类记录区组成。其中子存储区占用链表为子存储区占用记录组成的静态链表,由占用链表头指向该链表。子存储区占用链表包括子存储区占用链表头、子存储区占用链表长度。子存储区占用链表头为一正整数,是第一条子存储区占用记录的位置。子存储区占用链表长度为一正整数或0,是子存储区占用记录的数量。
子存储区空闲链表为子存储区空闲记录组成的静态链表,由空闲链表头指向该链表。子存储区空闲链表包括子存储区空闲链表头、子存储区空闲链表长度。子存储区空闲链表头为一正整数,是第一条子存储区空闲记录的位置。子存储区空闲链表长度为一正整数或0,是子存储区空闲记录的数量。
可以将子存储区占用链表头和占用链表长度,以及空闲链表头和空闲链表长度单元放在该子存储区的第一个扇区中固定的位置。各单元的数据宽度为4个字节。子分类记录区存储的子分类记录包括子存储区占用记录和子存储区空闲记录,子存储区占用记录由本级分类信息标识、下一级类型标识、下一级位置和后一条占用记录位置组成。其中本级分类信息标识为标识该条子分类记录的内容信息,可以是一个日期类型或时间类型等。下一级类型标识为子类型或者是数据。下一级子位置用于指向下一级子存储区或者是数据记录的位置。后一条占用记录位置用于指向后一条子存储区占用记录位置。子存储区空闲记录只有后一条空闲记录位置有效,其余三个字段无效。其中后一条空闲记录位置用于指向后一条子存储区空闲记录位置。子分类记录由从该子存储区第二个扇区开始的若干个连续的扇区组成,每个扇区可以存储多条子分类记录。
子存储区操作包括子存储区初始化、子存储区销毁、子分类记录读取、子分类记录插入和子分类记录删除。
在对子存储区进行初始化时,首先从子存储区池中选择一个未使用的子存储区,构建子存储区结构,使用该子存储区的第一个扇区存储占用链表头、占用链表长度、空闲链表头和空闲链表长度。将从第二个扇区开始的若干个连续的扇区规划为子分类记录区,定义子分类记录结构,将子分类记录按顺序编号。初始化子存储区占用链表和根存储区空闲链表,将子存储区占用链表头置为系统定义的最大数(对于数据宽度为4个字节的情况,可以定义最大数为0xFFFFFFFF),将子存储区占用链表长度置为0,此时表明整个子存储区为空。将子存储区空闲链表头置为1,将子存储区空闲链表长度置为子分类记录数,将编号为1的子分类记录的后一条空闲记录位置字段置为2,将编号为2的子分类记录的后一条空闲记录位置字段置为3,依次类推,直到最后一条子分类记录的后一条空闲记录位置字段置为系统定义的最大数,表明这是空闲链表的最后一条记录。
当某一子存储区的上一级被删除时,需要销毁该存储区,将要销毁的子存储区的所有扇区执行擦除操作,然后把销毁的子存储区归还到子存储区池。
在对子分类记录进行读取操作时,首先读取子存储区占用链表长度字段,若该字段为0,则退出子分类记录读取操作,并返回子存储区为空的标识信息;否则,将子存储区占用链表头的值作为当前子分类记录的位置,读取当前子分类记录的后一条占用记录位置字段。若该字段等于系统定义的最大数,则退出子分类记录读取操作;否则,将当前子分类记录的后一条子存储区占用记录作为当前子分类记录,依次类推。若是读取整个子存储区记录信息,则直到当前子分类记录的后一条占用记录位置字段等于系统定义的最大数为止;若是查找某个子分类记录,则判断当前子分类记录为要查找的子分类记录为止。
在对子分类记录进行插入操作时,首先读取子存储区空闲链表长度字段,若该字段为0,则退出子分类记录插入操作,并返回子存储区满的标识信息;若不为0,则将第一条子存储区空闲记录作为当前子分类记录,将要插入的子分类信息写入当前子分类记录的本级分类信息字段;若插入的子分类的下一级是子分类,则执行子存储区初始化操作,并将初始化的子存储区的起始位置赋值给当前子分类记录的下一级位置字段,当前子分类记录的下一级类型标识置为子分类;若插入的子分类的下一级为数据,则执行数据记录插入操作,并将插入的数据记录的起始位置赋值给当前子分类记录的下一级位置字段,当前子分类记录的下一级类型标识置为数据。将当前子分类记录的后一条空闲记录位置字段的值赋值给子存储区空闲链表头;将子存储区占用链表头的值赋值给当前子分类记录的后一条空闲记录位置字段;将当前子分类记录的位置赋值给子存储区占用链表头。
在对子分类记录进行删除操作时,首先读取子存储区占用链表长度字段,若该字段为0,则退出子分类记录删除操作,并返回子存储区为空的标识信息;否则,将子存储区占用链表头的值作为当前子分类记录的位置,若当前子分类记录与要删除的子分类记录不相同,则将当前子分类记录的后一条占用记录作为当前子分类记录继续比较,直到当前子分类记录为要删除的子分类记录为止。若没有相同记录,则退出子分类记录删除操作;否则将当前子分类记录的后一条占用记录位置字段的值赋值给当前子分类记录的前一条子存储区占用记录的后一条占用记录位置字段。特别的,如果当前子分类记录为第一条子存储区占用记录,则将当前子分类记录的后一条占用记录位置字段的值赋值给子存储区占用链表头。然后,将子存储区空闲链表头的值赋值给当前子分类记录的后一条占用记录位置字段,将当前子分类记录的位置赋值给子存储区空闲链表头。若当前子分类记录的下一级类型标识为子分类则执行子存储区销毁操作,若当前子分类记录的下一级类型标识为数据则执行数据存储区删除操作。
数据存储区结构如图4所示。数据存储区由数据存储区空闲链表和数据记录组成。数据存储区空闲链表为数据存储区空闲记录组成的静态链表,由空闲链表头指向该链表。可以将空闲链表头和空闲链表长度单元放在数据存储区的第一个扇区中固定的位置,各单元的数据宽度为4个字节。数据存储区空闲记录包含后一条空闲记录位置字段,用以指向后一条空闲记录位置。该字段可以直接利用空闲记录的第一个扇区的某一固定位置来存放。
数据存储区操作包括子数据存储区初始化、数据记录读取、数据记录插入和数据记录删除。
对数据存储初始化时,首先构建数据存储区结构,使用数据存储区的第一个扇区存储空闲链表头和空闲链表长度,将从第二个扇区开始的若干个连续的扇区规划为数据记录区,将数据记录按顺序编号。初始化数据存储区空闲链表,将数据存储区空闲链表头置为1,将数据存储区空闲链表长度置为数据记录数,将编号为1的数据记录的后一条空闲数据记录位置字段置为2,将编号为2的数据记录的后一条空闲数据记录位置字段置为3,依次类推,直到最后一条数据记录的后一条空闲数据记录位置字段置为系统定义的最大数,表明此时数据记录区为空。
通过前述的根分类记录读取操作及子分类记录读取操作逐级找到数据记录的位置,将数据记录读出。
在对数据记录进行插入操作时,首先读取数据存储区空闲链表长度字段,若该字段为0,则退出数据记录插入操作,并返回数据存储区为满的标识信息;否则,将第一条数据存储区空闲记录作为当前插入记录,将当前插入记录的后一条数据存储区空闲记录的位置字段值赋值给数据存储区空闲链表头。然后,将要插入的数据信息写入当前插入记录。
通过前述的根分类记录读取操作及子分类记录读取操作逐级找到数据记录作为当前删除记录。将数据存储区空闲链表头的值赋值给当前删除记录的后一条空闲数据记录位置字段,将当前删除记录的位置赋值给数据存储区空闲链表头。
综上所述,本发明的一种Flash存储器的数据存取方法可以满足单片机系统对存储器容量的要求,降低了原有Flash存储器文件存储方式对硬件及软件资源占用,有效解决小程序存储容量的单片机存储大量数据的问题,各分类信息区采用静态链表的组织结构,提高了存储器的读写寿命。
本发明的一个实施例中,在单片机系统中使用512MB的Flash存储器,由根分类、一级子分类和数据组成整个数据存储,实现了500个根分类,每个根分类下有1000个子分类,每条数据记录1kB的存储容量。
应当指出的是,本发明所述的Flash存储器的数据存取方法并不仅限于应用单片机系统中,还可以应用在嵌入式系统中。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (14)
1.一种Flash存储器的数据存取方法,其特征在于:所述Flash存储器的数据存储结构包括根存储区、子存储区池和数据存储区,子存储区池包括1个以上的子存储区,其中根存储区用于存储数据的根分类信息,子存储区用于存储数据的子分类信息,数据存储区用于存储数据信息;所述根存储区包括根存储区占用链表、根存储区空闲链表和根分类记录区,其中根存储区占用链表为根存储区占用记录组成的静态链表,根存储区空闲链表为根存储区空闲记录组成的静态链表,根分类记录区用于存储根分类记录;所述子存储区包括子存储区占用链表、子存储区空闲链表和子分类记录区,其中子存储区占用链表为子存储区占用记录组成的静态链表,子存储区空闲链表为子存储区空闲记录组成的静态链表,子分类记录区用于存储子分类记录;所述数据存储区包括数据存储区空闲链表和数据记录区,数据存储区空闲链表为数据存储区空闲记录组成的静态链表,数据记录区用于存储数据记录;所述数据存取方法包括根存储区操作、子存储区操作及数据存储区操作;其中根存储区操作包括根存储区初始化、根分类记录读取、根分类记录插入和根分类记录删除;子存储区操作包括子存储区初始化、子存储区销毁、子分类记录读取、子分类记录插入和子分类记录删除;数据存储区操作包括数据存储区初始化、数据记录读取、数据记录插入和数据记录删除。
2.根据权利要求1所述的Flash存储器的数据存取方法,其特征在于:根存储区初始化步骤为:规划出FLASH存储器的部分扇区为根存储区,初始化根存储区占用链表,初始化根存储区空闲链表;其中根存储占用链表包括根存储区占用链表头和根存储区占用链表长度,根存储空闲链表包括根存储区空闲链表头和根存储区空闲链表长度;根存储占用链表初始化步骤为:将根存储区占用链表头置为系统定义的最大数,将根存储区占用链表长度置为0;
根存储空闲链表初始化步骤为:将根存储区空闲链表头置为1,将根存储区空闲链表长度置为根分类记录数,将编号为1的根分类记录的后一条空闲记录的位置字段置为2,将编号为2的根分类记录的后一条空闲记录位置的字段置为3,依次类推,直到最后一条根分类记录的后一条空闲记录位置字段置为系统定义的最大数。
3.根据权利要求2所述的Flash存储器的数据存取方法,其特征在于:根分类记录读取的步骤包括:S01)、若根存储区占用链表长度为0,则退出根分类记录读取操作;S02)、若根存储区占用链表长度为一个正整数,将根存储区占用链表头的值作为当前根分类记录的位置,读取当前根分类记录的后一条占用记录位置字段;S03)、若后一条占用记录位置字段等于系统定义的最大数,则退出根分类记录读取操作;S04)、若后一条占用记录位置字段小于系统定义的最大数,将当前根分类记录的后一条占用记录作为当前根分类记录,依次类推,直到当前根分类记录的后一条占用记录位置字段等于系统定义的最大数或者是判断当前根分类记录为要查找的记录为止。
4.根据权利要求2所述的Flash存储器的数据存取方法,其特征在于:根分类记录插入的步骤包括:S01)、若根存储区空闲链表长度为0,则退出根分类记录插入操作;S02)、若根存储区空闲链表长度为一个正整数,将第一条根存储区空闲记录作为当前根分类记录,将要插入的根分类信息写入当前根分类记录的根分类信息标识字段;若当前插入的根分类的下一级是子分类则执行子存储区初始化操作,并将初始化的子存储区的起始位置赋值给当前根分类记录的下一级位置字段,当前记录的下一级类型标识置为子分类;S03)、若当前插入的根分类的下一级为数据,则执行数据记录插入操作,并将插入的数据记录的起始位置赋值给当前根分类记录的下一级位置字段,当前根分类记录的下一级类型标识置为数据;S04)、将当前根分类记录的后一条空闲记录位置字段的值赋值给根存储区空闲链表头;将根存储区占用链表头的值赋值给当前根分类记录的后一条空闲记录位置字段;将当前根分类记录的位置值赋值给根存储区占用链表头。
5.根据权利要求2所述的Flash存储器的数据存取方法,其特征在于:根分类记录删除的步骤包括:S01)、若根存储区占用链表长度为0,则退出根分类记录删除操作;S02)、若根存储区占用链表长度为一个正整数,将根存储区占用链表头的值作为当前根分类记录的位置,若当前根分类记录不是要删除的根分类记录,则将当前根分类记录的后一条占用记录作为当前根分类记录继续比较,直到当前根分类记录为要删除的根分类记录为止;若没有找到要删除的根分类记录,则退出根分类记录删除操作;S03)、若找到要删除的根分类记录,将当前根分类记录的后一条占用记录位置字段的值赋值给当前根分类记录的前一条根分类记录的后一条占用记录位置字段,如果当前根分类记录为第一条根存储区占用记录,则将当前根分类记录的后一条占用记录位置字段的值赋值给根存储区占用链表头;然后,将根存储区空闲链表头的值赋值给当前根分类记录的后一条占用记录位置字段,将当前根分类记录的位置赋值给根存储区空闲链表头;S04)、若当前根分类记录的下一级类型标识为子分类则执行子存储区销毁操作,若当前根分类记录的下一级类型标识为数据则执行数据记录删除操作。
6.根据权利要求1所述的Flash存储器的数据存取方法,其特征在于:子存储区初始化步骤为:从子存储区池中选择一个未使用的子存储区,然后初始化子存储区占用链表,初始化子存储区空闲链表;其中子存储区占用链表包括子存储区占用链表头和子存储区占用链表长度,子存储区空闲链表包括子存储区空闲链表头和子存储区空闲链表长度;子存储区占用链表初始化步骤包括:将子存储区占用链表头置为系统定义的最大数,将子存储区占用链表长度置为0;子存储区空闲链表初始化步骤包括:将子存储区空闲链表头置为1,将子存储区空闲链表长度置为子分类记录数,将编号为1的子分类记录的后一条空闲记录位置字段置为2,将编号为2的子分类记录的后一条空闲记录位置字段置为3,依次类推,直到最后一条子分类记录的后一条空闲记录位置字段置为系统定义的最大数。
7.根据权利要求1或6所述的Flash存储器的数据存取方法,其特征在于:所述的子存储区销毁操作步骤包括:将要销毁的子存储区的所有扇区执行擦除操作,如果要销毁的子存储区还有下一级子存储区,则通过子存储区销毁操作逐级销毁。
8.根据权利要求6所述的Flash存储器的数据存取方法,其特征在于:所述的子分类记录读取操作步骤包括:S01)、若子存储区占用链表长度为0,则退出子分类记录读取操作;S02)、若子存储区占用链表长度为一个正整数,将子存储区占用链表头的值作为当前子分类记录的位置,读取当前子分类记录的后一条占用记录位置字段;S03)、若该字段等于系统定义的最大数,则退出子分类记录读取操作;否则,将当前子分类记录的后一条占用记录作为当前子分类记录,依次类推,直到当前子分类记录的后一条占用记录位置字段等于系统定义的最大数或者是判断当前子分类记录为要查找的记录为止。
9.根据权利要求6所述的Flash存储器的数据存取方法,其特征在于:所述的子分类记录插入操作步骤包括:S01)、若子存储区空闲链表长度为0,则退出子分类记录插入操作;S02)、若子存储区空闲链表长度为一个正整数,将第一条子存储区空闲记录作为当前子分类记录,将要插入的子分类信息写入当前子分类记录的本级分类信息字段;若当前插入的子分类的下一级也是子分类,则执行子存储区初始化操作,并将初始化的子存储区的起始位置赋值给当前子分类记录的下一级位置字段,当前子分类记录的下一级类型标识置为子分类;S03)、若当前插入的子分类的下一级为数据,则执行数据记录插入操作,并将插入的数据记录的起始位置赋值给当前子分类记录的下一级位置字段,当前子分类记录的下一级类型标识置为数据;S04)、将当前子分类记录的后一条空闲记录位置字段的值赋值给子存储区空闲链表头;将子存储区占用链表头的值赋值给当前子分类记录的后一条空闲记录位置字段;将当前子分类记录的位置赋值给子存储区占用链表头。
10.根据权利要求6所述的Flash存储器的数据存取方法,其特征在于:所述的子分类记录删除操作步骤包括:S01)、若子存储区占用链表长度为0,则退出子分类记录删除操作;S02)、若子存储区占用链表长度为一个正整数,将子存储区占用链表头的值作为当前子分类记录的位置,若当前子分类记录不是要删除的子分类记录,则将当前子分类记录的后一条占用记录作为当前子分类记录继续比较,直到当前子分类记录是要删除的子分类记录为止;S03)、若没有相同记录,则退出子分类记录删除操作;否则将当前子分类记录的后一条占用记录位置字段的值赋值给当前子分类记录的前一条子分类记录的后一条占用记录位置字段;S04)、如果当前子分类记录为第一条子存储区占用记录,则将当前子分类记录的后一条占用记录位置字段的值赋值给子存储区占用链表头,然后,将子存储区空闲链表头的值赋值给当前子分类记录的后一条占用记录位置字段,将当前子分类记录的位置赋值给子存储区空闲链表头;S05)、若当前子分类记录的下一级类型标识为子分类则执行子存储区销毁操作,若当前子分类记录的下一级类型标识为数据则执行数据记录删除操作。
11.根据权利要求1所述的Flash存储器的数据存取方法,其特征在于:数据存储区初始化步骤包括:规划出FLASH存储器的部分扇区为数据存储区,将数据记录按顺序编号,初始化数据存储区空闲链表,数据存储区空闲链表包括数据存储区空闲链表头和数据存储区空闲链表长度;数据存储区空闲链表初始化步骤包括:将数据存储区空闲链表头置为1,将数据存储区空闲链表长度置为数据记录数,将编号为1的数据记录的后一条空闲记录位置字段置为2,将编号为2的数据记录的后一条空闲记录位置字段置为3,依次类推,直到最后一条数据记录的后一条空闲记录位置字段置为系统定义的最大数。
12.根据权利要求1或11所述的Flash存储器的数据存取方法,其特征在于:数据记录读取操作步骤包括:通过根分类记录读取操作及子分类记录读取操作逐级找到数据记录的位置,将数据读出。
13.根据权利要求11所述的Flash存储器的数据存取方法,其特征在于:数据记录插入操作步骤包括:若数据存储区空闲链表长度为0,则退出数据记录插入操作;否则,将第一条数据存储区空闲记录作为当前数据记录,将当前数据记录的后一条空闲记录的位置字段值赋值给数据存储区空闲链表头,然后,将要插入的数据信息写入当前数据记录。
14.根据权利要求11所述的Flash存储器的数据存取方法,其特征在于:数据记录删除操作步骤包括:通过根分类记录读取操作及子分类记录读取操作逐级找到数据记录作为当前数据记录,将数据存储区空闲链表头的值赋值给当前数据记录的后一条空闲记录位置字段,将当前数据记录的位置赋值给数据存储区空闲链表头。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810172152.8A CN108415852B (zh) | 2018-03-01 | 2018-03-01 | 一种Flash存储器的数据存取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810172152.8A CN108415852B (zh) | 2018-03-01 | 2018-03-01 | 一种Flash存储器的数据存取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108415852A true CN108415852A (zh) | 2018-08-17 |
CN108415852B CN108415852B (zh) | 2021-12-14 |
Family
ID=63129761
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810172152.8A Active CN108415852B (zh) | 2018-03-01 | 2018-03-01 | 一种Flash存储器的数据存取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108415852B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1405683A (zh) * | 2001-09-18 | 2003-03-26 | 华为技术有限公司 | Flash存储文件管理方法 |
CN1811901A (zh) * | 2005-01-26 | 2006-08-02 | 电装波动株式会社 | 具有用于显示已存储的符号图像的屏幕的信息读取装置 |
CN1836268A (zh) * | 2003-06-20 | 2006-09-20 | 汤姆森普罗梅特里克公司 | 利用高速缓存和可高速缓存对象扩展测试驱动应用程序的功能的基于计算机测试的系统和方法 |
CN1851708A (zh) * | 2006-04-30 | 2006-10-25 | 山东浪潮电子设备有限公司 | 一种不定长税控电子发票的存储方法 |
US7701843B1 (en) * | 2004-10-26 | 2010-04-20 | Sprint Communications Company L.P. | Intelligent-topology-driven alarm placement |
WO2012058333A1 (en) * | 2010-10-26 | 2012-05-03 | Barnes & Noble, Inc | System and method for formatting multifunctional electronic books for electronic readers |
CN106247000A (zh) * | 2016-08-09 | 2016-12-21 | 曲阜师范大学 | 一种可分析油井供液情况的单流阀及油井供液情况的分析方法 |
-
2018
- 2018-03-01 CN CN201810172152.8A patent/CN108415852B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1405683A (zh) * | 2001-09-18 | 2003-03-26 | 华为技术有限公司 | Flash存储文件管理方法 |
CN1836268A (zh) * | 2003-06-20 | 2006-09-20 | 汤姆森普罗梅特里克公司 | 利用高速缓存和可高速缓存对象扩展测试驱动应用程序的功能的基于计算机测试的系统和方法 |
US7701843B1 (en) * | 2004-10-26 | 2010-04-20 | Sprint Communications Company L.P. | Intelligent-topology-driven alarm placement |
CN1811901A (zh) * | 2005-01-26 | 2006-08-02 | 电装波动株式会社 | 具有用于显示已存储的符号图像的屏幕的信息读取装置 |
CN1851708A (zh) * | 2006-04-30 | 2006-10-25 | 山东浪潮电子设备有限公司 | 一种不定长税控电子发票的存储方法 |
WO2012058333A1 (en) * | 2010-10-26 | 2012-05-03 | Barnes & Noble, Inc | System and method for formatting multifunctional electronic books for electronic readers |
CN106247000A (zh) * | 2016-08-09 | 2016-12-21 | 曲阜师范大学 | 一种可分析油井供液情况的单流阀及油井供液情况的分析方法 |
Non-Patent Citations (3)
Title |
---|
W. J. TSAI: "Data retention behavior of a SONOS type two-bit storage flash memory cell", 《INTERNATIONAL ELECTRON DEVICES MEETING. TECHNICAL DIGEST (CAT. NO.01CH37224),》 * |
孙天佑: "基于SD卡的单片机软件自更新的实现方法", 《计算机应用与软件》 * |
田海峰: "基于ARM和CDMA的油井工况远程监测系统", 《中国优秀博硕士学位论文全文数据库(硕士)工程科技Ⅰ辑》 * |
Also Published As
Publication number | Publication date |
---|---|
CN108415852B (zh) | 2021-12-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103608866B (zh) | 用于闪存存储器的数据擦除方法及装置 | |
EP1771862B1 (en) | Method and device to improve usb flash write performance | |
US5442611A (en) | Method of recording information on record medium having data record region and file management information record region | |
CN100419713C (zh) | 对大容量存储器储存装置进行分割的方法 | |
CN101354681B (zh) | 存储器系统、非易失性存储器的磨损均衡方法及装置 | |
KR101329068B1 (ko) | 블록 관리를 가지는 비휘발성 메모리 | |
JPH07191892A (ja) | フラッシュ消去可能なプログラマブル・リードオンリメモリを用いてファイルシステムをマネージする方法及びシステム | |
CN101488153A (zh) | 嵌入式Linux下大容量闪存文件系统的实现方法 | |
JP2005182793A5 (zh) | ||
CN108710578A (zh) | 基于闪存的数据存储方法和装置 | |
CN101510332B (zh) | 一种智能卡中存储空间的管理方法和装置 | |
CN100533443C (zh) | 利用文件分配表进行磁盘数据簇链接及寻道的方法 | |
CN108021513A (zh) | 一种数据存储方法及装置 | |
CN108959119A (zh) | 存储系统中垃圾收集的方法和系统 | |
CN108733306A (zh) | 一种文件合并方法及装置 | |
TWI399642B (zh) | 具區塊管理之非揮發性記憶體 | |
KR100907477B1 (ko) | 플래시 메모리에 저장된 데이터의 인덱스 정보 관리 장치및 방법 | |
CN100543748C (zh) | 一种利用文件分配表进行文件寻道的方法及系统 | |
CN108376121A (zh) | 一种Flash存储器的数据存储结构 | |
CN102004697B (zh) | 一种Flash的回收方法和装置 | |
CN108415852A (zh) | 一种Flash存储器的数据存取方法 | |
KR20100011137A (ko) | 고속 파일 복구가 가능한 fat 파일시스템을 사용한데이터 처리장치 및 데이터 처리방법 | |
CN111324284B (zh) | 一种存储器 | |
CN114281242B (zh) | 存储器负载均衡的方法、装置和设备 | |
CN112597102B (zh) | 一种高效的镜像文件系统实现方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |