一种适用于Nor Flash数据存储的磨损均衡方法及存储设备

文档序号:1965066 发布日期:2021-12-14 浏览:11次 >En<

阅读说明:本技术 一种适用于Nor Flash数据存储的磨损均衡方法及存储设备 (Wear leveling method suitable for Nor Flash data storage and storage device ) 是由 陈斌 陈国虎 肖斌 张亚伟 于 2021-08-14 设计创作,主要内容包括:本发明涉及一种适用于NorFlash数据存储的磨损均衡方法,包括对存储器进行存储页分配的方法、初始化方法和数据的写入、读出方法。存储页分配的方法:将存储空间划分出两个存储页;初始化方法包括:选择一个存储页作为活动页,另一个作为备用页,并更新内存中全局变量的值;数据的写入方法包括:判断活动页的剩余存储空间是否不小于需要写入的数据所需的空间,如果不小于,则从数据偏移地址写入需存储的数据,如果小于则将备用页切换为活动页,重新写入活动页;数据的读出方法为:获取需读出数据的相关参数,从后向前查找活动页中的数据,将最先查找到的且符合相关参数要求的数据读出到内存中。本发明还涉及一种存储设备,并用于执行上述方法。(The invention relates to a wear leveling method suitable for NorFlash data storage, which comprises a method for allocating memory pages to a memory, an initialization method and a method for writing and reading data. The method for allocating the storage pages comprises the following steps: dividing a storage space into two storage pages; the initialization method comprises the following steps: selecting one storage page as an active page and the other storage page as a standby page, and updating the value of a global variable in a memory; the data writing method comprises the following steps: judging whether the residual storage space of the active page is not less than the space required by the data needing to be written, if not, writing the data needing to be stored from the data offset address, and if so, switching the standby page into the active page and rewriting the active page; the data reading method comprises the following steps: and acquiring related parameters of the data to be read, searching the data in the active page from back to front, and reading the data which is searched firstly and meets the requirements of the related parameters into a memory. The invention also relates to a storage device and for carrying out the above method.)

一种适用于Nor Flash数据存储的磨损均衡方法及存储设备

技术领域

本发明涉及一种非易失闪存技术,尤其是一种适用于Nor Flash数据存储的磨损均衡方法及存储设备。

背景技术

Nor Flash是一种非易失闪存技术,其特点是芯片内执行(XIP,eXecute InPlace),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。Flash闪存的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是一般用于存储代码量小的程序或者数据。

Nor Flash在写入数据时,常用的做法是在固定地址写入数据,当这个位置的数据需要改动时,需要先擦除然后再写入,数据只可以由1写成0,不可由0写成1,擦除后Norflash数据全部变为0xFF,在面对需要频繁改动的数据时,Nor Flash很低的写入和擦除速度大大影响到它的性能,目前通用的Nor Flash存储器每个编程单元擦写寿命一般在十万次左右,当超出这个次数限制后,就会有出现坏块的可能,此时再继续改写存储的数据,正确性就无法保证。

鉴于此提出本发明。

发明内容

本发明的一个目的在于克服现有技术的不足,提供一种适用于Nor Flash数据存储的磨损均衡方法,通过降低擦写次数,来延缓Nor Flash存储器到达擦写寿命上限,从而提高Nor Flash存储器的使用寿命。

本发明的另一个目的在于提供存储设备,用于执行上述的适用于Nor Flash数据存储的磨损均衡方法。

为了实现第一发明目的,本发明采用如下技术方案:

一种适用于Nor Flash数据存储的磨损均衡方法,包括对Nor Flash存储器进行存储页分配的方法、初始化方法和数据的写入、读出方法;

所述存储页分配的方法包括:将Nor Flash存储空间至少划分出两个相同大小的存储页,确定两个存储页的起始地址和大小;

所述初始化的方法包括:选择其中一个存储页作为活动页,另一个作为备用页,更新内存中的活动页地址、活动页的数据偏移地址、页切换标记三个全局变量的值;

所述数据的写入方法包括:

步骤a1、获取需要写入的数据;

步骤a2、判断活动页的剩余存储空间是否不小于需要写入的数据所需的空间,如果不小于,则从活动页的数据偏移地址开始,写入待存储的数据;如果小于则将备用页切换为活动页,然后将需要写入的数据写入新的活动页;

步骤a3、更新内存中的活动页的数据偏移地址,写入结束;

所述数据的读出方法为:

步骤b1、获取需要读出数据的参数;

步骤b2、根据获取的参数,从活动页的数据偏移地址开始,从后向前查找需要读出的数据,将最先查找到的且符合参数要求的数据读出到内存中。

进一步,所述存储页包括页面属性和数据单元;

所述页面属性至少用于定义当前存储页为活动页或备用页;

所述数据单元为多个,需要存储的数据以数据单元为单位进行存储,所述数据单元由数据体和数据头组成,所述数据体中存储原始数据,所述数据头的长度为一定值,用于记录数据单元的属性信息。

进一步,所述页面属性由页面累加数和页面校验码组成,所述页面累加数为一变量,用于区分当前存储页为活动页或备用页,所述页面校验码为一预设的固定值,用于校验页面属性是否出错。

进一步,所述数据头包括:数据编号、数据长度、数据校验值、数据单元偏移量和数据头校验码;

所述数据编号用于区分不同数据体,为预设值;

所述数据长度用于表示数据体占用存储空间的大小;

所述数据校验值为根据数据体通过校验算法计算出的校验值,用于校验数据体是否损坏;

所述数据单元偏移量用于表示该数据单元尾部在存储页中的偏移地址;

所述数据头校验码为一预设的固定值,用于校验数据头是否损坏。

进一步,所述步骤a2中,将备用页切换为活动页包括以下步骤:

步骤d1、将备用页的数据全部擦除;

步骤d2、从活动页的数据偏移地址开始,从后向前逐个读取数据头,获得数据头中存储的数据编号、数据长度、数据校验值、数据单元偏移量和数据头校验码;

步骤d3、对数据头校验码进行校验,如果校验通过则执行步骤d4,如果校验未通过,则跳过该条数据头,执行步骤d5;

步骤d4、判断当前数据编号是否为已读取过,如果是,则跳过该条数据头,执行步骤d5,如果否,则根据数据单元偏移量和数据长度,将数据体读出,计算数据体的校验值,并与数据头中的数据校验值比对,如果相等则将该数据单元写入备用页的数据偏移地址,并标注该数据编号为已读取过,更新备用页的数据偏移地址,然后执行步骤d5,如果不相等则放弃该条数据体,执行步骤d5;

步骤d5、判断活动页中是否有下一条数据头,如果有,则读取下一条数据头,并返回步骤d3,如果没有,则将内存中的页切换标记自加1后赋值给备用页的页面累加数,备用页的页面校验码为定义好的固定值,并写入备用页的页面属性;

步骤d6、更新内存中的全局变量:活动页地址的值为备用页所在存储页的起始地址,活动页的数据偏移地址的值为备用页的数据偏移地址;完成备用页与活动页的相互切换。

进一步,所述步骤b1中,获取的参数为需要读出数据的编号;

所述步骤b2包括以下步骤:

步骤b2-1、从活动页的数据偏移地址开始,从后向前逐个读取数据头,获得数据头中存储的数据编号、数据长度、数据校验值、数据单元偏移量和数据头校验码;

步骤b2-2、对数据头校验码进行校验,如果校验通过,则执行下一步;如果校验未通过,则将备用页切换为活动页,并在切换完成后返回步骤b2-1;

步骤b2-3、对比数据头中的数据编号与需要读出的数据的编号是否一致,如果不一致则执行下一步,如果一致,则根据数据单元偏移量和数据长度,将数据体读出,计算数据体的校验值,并与数据头中的数据校验值比对,如果相等则数据读取成功,结束读取;如果不相等,则放弃该条数据体,执行下一步;

步骤b2-4、判断活动页中是否有下一条数据头,如果有,则向前读取下一条数据头,并返回步骤b2-2,如果没有则返回错误,结束读取;

所述步骤b2-2中,将备用页切换为活动页的方法与步骤a2相同。

进一步,在步骤d5和步骤b2-4中,判断活动页中是否有下一条数据头的方法为:

步骤c1、根据当前数据单元偏移量、数据长度和数据头长度,计算得到下一条数据的数据单元偏移量;

步骤c2、判断计算得到的数据单元偏移量是否大于页面属性长度+数据头长度,如果大于则说明还有下一条数据头,如果不大于则说明无下一条数据头。

进一步,所述初始化的方法包括:首次上电初始化的方法和非首次上电初始化的方法;

所述首次上电初始化的方法包括以下步骤:

S1、指定其中一个存储页作为活动页,另一个作为备用页,更新内存中三个全局变量的值:活动页地址为活动页所在存储页的起始地址,活动页的数据偏移地址为页面属性结束地址在活动页中的偏移地址,页切换标记为0;

S2、将两个存储页都擦除一遍,然后预设页面校验码为一固定值,页面累加数为0,并写入活动页的页面属性中,完成初始化;

所述非首次上电初始化的方法包括以下步骤:

S'1、读取两个存储页的页面属性,对两个页面属性的页面校验码进行校验,如果校验都通过,则执行S'2,如果校验只通过一个,则执行S'3,如果校验都未通过,则执行首次上电初始化;

S'2、选择页面累加数大的存储页作为活动页,并查找活动页数据的结束位置,更新内存中三个全局变量的值:活动页地址为活动页所在存储页的起始地址,页切换标记为活动页的页面累加数,活动页的数据偏移地址为数据结束位置在活动页中的偏移地址,完成初始化;

S'3、选择通过校验的存储页作为活动页,并查找活动页数据的结束位置,更新内存中三个全局变量的值:活动页地址为活动页所在存储页的起始地址,页切换标记为活动页的页面累加数,活动页的数据偏移地址为数据结束位置在活动页中的偏移地址,完成初始化。

进一步,在数据的写入过程中,每次写完数据后,需要更新内存中的活动页的数据偏移地址,更新后的活动页的数据偏移地址=当前活动页的数据偏移地址+数据长度+数据头长度。

为了实现第二发明目的,本发明采用如下技术方案:

一种存储设备,所述存储设备被配置为执行上述的适用于Nor Flash数据存储的磨损均衡方法。

采用本发明所述的技术方案后,带来以下有益效果:

1、本发明通过减少Nor Flash的擦除和写入次数,提高了Nor Flash的使用寿命。由于本发明采用的写入方法,每次向Nor Flash写数据时,始终在活动页的数据偏移地址位置写入,不会擦除前面的数据,在活动页数据写满后,才会将活动页的数据擦除一遍,从而大大减少了擦除和写入Nor Flash的操作,提高了Nor Flash的使用寿命。

2、本发明采用双区备份数据,确保在Nor Flash擦写过程中断电数据不丢失。

本发明由于在向Nor Flash写数据时,始终在活动页的数据偏移地址写入,不会擦除前面的数据,即使在Nor Flash写入数据过程中断电,也可以保证断电时除正在写入的数据之外的数据不会丢失,如果断电时未完整写入数据,那么在下次上电读取数据时会校验失败,从而进行切换活动页操作,将有效数据全部搬运到新的活动页,保证了数据的安全性。在切换活动页过程中,擦除旧活动页操作是在将有效数据全部写入新活动页,然后将页面属性写入新活动页之后,所以即使在切换活动页过程中断电,切换不成功,旧活动页的数据仍然存在,下次上电会将旧活动页作为活动页处理,保证数据不会丢失。

附图说明

图1:本发明存储页结构图;

图2:本发明数据头结构图;

图3:本发明的数据写入流程图;

图4:本发明的数据读出流程图;

图5:本发明的活动页与备用页相互切换的流程图。

具体实施方式

下面结合附图对本发明的具体实施方式作进一步详细的描述。

结合图1至图5所示,一种适用于Nor Flash数据存储的磨损均衡方法,包括对NorFlash存储器进行存储页分配的方法、初始化方法和数据的写入、读出方法。

所述存储页分配的方法包括:将Nor Flash存储空间至少划分出两个相同大小的存储页,确定两个存储页的起始地址和大小。

在内存中设置三个全局变量:活动页地址(g_PgAcitve)、活动页的数据偏移地址(g_PgOffset)、页切换标记(g_PgCycle)。

具体地,在划分存储页时,设置每个存储页由页面属性(pageHeader)和数据单元(dataItem)组成。

所述页面属性(pageHeader)占用存储页的前八个字节,包含页面累加数(Pg_Cnt)和页面校验码(Pg_Magic)两部分,并各占四个字节。页面累加数(Pg_Cnt)为一变量,初始值为0。所述页面校验码(Pg_Magic)为一预设的固定值,用于校验页面属性(pageHeader)是否出错。

所述数据单元(dataItem)为数据存储的基本单位,数据单元(dataItem)由数据体(data)和数据头(header)组成。所述数据体(data)中存储原始数据。所述数据头(header)用于记录数据单元(dataItem)的属性信息,数据头长度(header_len)为一固定长度值。当需要存储数据时,将待存储的数据封装为数据单元(dataItem)进行存储。

如图2所示,所述数据头(header)包括:数据编号(ID)、数据长度(len)、数据单元偏移量(hofs)、数据头校验码(magic)和数据校验值。其中,所述数据编号(ID)用于区分不同的数据体(data),为预设值;如应用在门禁设备上时,一个门禁设备假设支持识别1000张卡片,可以分配编号1到1000,即每张卡片对应一个唯一的ID,可以设置0001代表第一张卡片,0002代表第二张,以此类推。所述数据长度(len)用于表示数据体(data)占用存储空间的大小,如占用10个字节,则用0010表示。所述数据单元偏移量(hofs)用于表示该数据单元(dataItem)的结束位置在其所在的存储页中的偏移地址。所述数据头校验码(magic)为一预设的固定值,用于校验数据头(header)是否损坏。所述数据校验值为根据数据体(data)通过校验算法计算出的校验值,用于读出数据时校验数据体(data)是否正确。优选地,所述数据校验值为crc8校验值,通过计算数据体(data)的crc8值得到。

所述初始化的方法包括:首次上电初始化的方法和非首次上电初始化的方法。

具体地,所述首次上电初始化的方法包括以下步骤:

S1、指定其中一个存储页作为活动页(active_page),另一个作为备用页(backup_page),更新内存中三个全局变量的值:活动页地址(g_PgAcitve)为活动页所在存储页的起始地址,活动页的数据偏移地址(g_PgOffset)为页面属性结束地址在活动页中的偏移地址,页切换标记(g_PgCycle)为0;

S2、将两个存储页都擦除一遍,然后给页面校验码(Pg_Magic)赋值为预先设定好的固定值,页面累加数(Pg_Cnt)为0,并写入活动页的页面属性(pageHeader)中,完成首次上电初始化。

首次上电初始化之后,即可向Nor Flash存储器写入和读出数据。

具体地,数据的写入方法如下:

步骤a1、获取需要写入的数据;

步骤a2、判断活动页的剩余存储空间是否不小于需要写入的数据所需的空间,如果不小于,则从活动页的数据偏移地址(g_PgOffset)开始将待存储的数据封装为数据单元(dataItem)写入活动页;如果小于则说明活动页已经存满,需要先将备用页切换为活动页,然后从新的活动页的数据偏移地址(g_PgOffset)开始,将待存储的数据封装为数据单元(dataItem)写入活动页。

步骤a3、在写完数据后,更新内存中的活动页的数据偏移地址(g_PgOffset),写入结束。在数据的写入过程中,每次写完数据后,都需要更新内存中的活动页的数据偏移地址,以方便下次数据写入和读取,更新后的活动页的数据偏移地址(g_PgOffset)=当前活动页的数据偏移地址(g_PgOffset)+数据长度(len)+数据头长度(header_len),所述数据长度(len)为当前写入数据的长度,数据头长度(header_len)为一定值。

具体在写入数据时,数据头(header)中的各参数通过以下方式确认:

数据编号(ID)=需要写入的数据的编号,

数据长度(len)=需要写入的数据长度,

数据体(data)=需要存储的原始数据,

数据单元偏移量(hofs)=活动页的数据偏移地址(g_PgOffset)+数据长度(len)+数据头长度(header_len),

数据头校验码(magic)=设定的固定值,

数据校验值crc8=对数据体(data)计算出的crc8值。

数据头(header)封装后写入的地址为:活动页地址(g_PgAcitve)+活动页的数据偏移地址(g_PgOffset)+数据长度(len)。

数据体(data)的写入地址为:活动页地址(g_PgAcitve)+活动页的数据偏移地址(g_PgOffset)。

步骤a2中,判断活动页的剩余存储空间是否不小于需要写入的数据所需的空间的方法为:将活动页的存储容量(active-page_len)、数据偏移地址(g_PgOffset)、需要写入的数据的数据长度(len)、数据头长度(header_len),代入以下公式:

active-page_len≥g_PgOffset+len+header_len,

如果公式成立,则活动页的剩余存储空间不小于需要写入的数据所需的空间,如果公式不成立,则活动页的剩余存储空间小于需要写入的数据所需的空间。

在首次上电初始化后,活动页的剩余存储空间一般不会小于需要写入的数据所需的空间,所以不会执行将备用页切换为活动页的操作。

具体地,将备用页切换为活动页的方法为:

步骤d1、将备用页的数据全部擦除,初始化备用页的数据偏移地址(b_PgOffset)为备用页页面属性(pageHeader)结束地址在该存储页的偏移地址。

步骤d2、从活动页的数据偏移地址(g_PgOffset)开始,从后向前逐个读取数据头(header),获得数据头(header)中存储的数据编号(ID)、数据长度(len)、数据校验值、数据单元偏移量(hofs)和数据头校验码(magic)。

步骤d3、对当前数据头校验码(magic)进行校验,如果校验通过则执行步骤d4,如果校验未通过,则跳过该条数据头(header),直接执行步骤d5;

步骤d4、判断当前数据编号(ID)是否为已读取过,如果是,则跳过该条数据头(header),执行步骤d5,如果否,则根据数据单元偏移量(hofs)和数据长度(len),将数据体(data)读出,计算数据体(data)的校验值,并与数据头(header)中的数据校验值比对,如果相等则将该数据单元(dataItem)写入备用页的数据偏移地址(b_PgOffset),并在内存中标注该数据编号(ID)为已读取过,然后更新备用页的数据偏移地址(b_PgOffset)=备用页的当前数据偏移地址(b_PgOffset)+数据长度(len)+数据头长度(header_len),然后执行步骤d5,如果不相等则放弃该条数据体(data),继续执行步骤d5;

需要说明的是,在将数据单元(dataItem)写入备用页时,需要更新数据头(header)中的数据单元偏移量(hofs),更新后的数据单元偏移量(hofs)=备用页的数据偏移地址(b_PgOffset)+数据长度(len)+数据头长度(header_len)。

步骤d5、判断活动页中是否有下一条数据头(header),如果有,则读取下一条数据头(header),并返回步骤d3,如果没有,则将页切换标记(g_PgCycle)自加1后赋值给备用页的页面累加数(Pg_Cnt),备用页的页面校验码(Pg_Magic)为定义好的固定值,并写入备用页的页面属性(pageHeader);

步骤d6、更新内存中的全局变量:活动页地址(g_PgAcitve)的值为备用页所在存储页的起始地址,活动页的数据偏移地址(g_PgOffset)的值为备用页的数据偏移地址(b_PgOffset);完成备用页与活动页的相互切换;

具体地,数据的读出方法如下:

步骤b1、获取需要读出数据的参数;

步骤b2、根据获取的参数,从活动页的数据偏移地址(g_PgOffset)开始,从后向前查找需要读出的数据,将最先查找到的且符合该参数要求的数据读出到内存中。

具体地,所述步骤b1中,获取的参数为需要读出数据的编号。

所述步骤b2包括以下步骤:

步骤b2-1、从活动页的数据偏移地址(g_PgOffset)开始,从后向前逐个读取数据头(header),获得数据头(header)中存储的数据编号(ID)、数据长度(len)、数据校验值、数据单元偏移量(hofs)和数据头校验码(magic)。

步骤b2-2、对数据头校验码(magic)进行校验,如果校验通过,则执行下一步;如果校验未通过,则将备用页切换为活动页,并在切换完成后返回步骤b2-1;

步骤b2-3、对比数据头(header)中的数据编号(ID)与需要读出的数据的编号是否一致,如果不一致则执行下一步,如果一致,则根据数据单元偏移量(hofs)和数据长度(len),将数据体(data)读出,计算数据体(data)的校验值,并与数据头(header)中的数据校验值比对,如果相等则该数据体(data)即是要读出的数据,数据读取成功,结束读取;如果不相等,则放弃该条数据体,执行下一步;

步骤b2-4、判断活动页中是否有下一条数据头(header),如果有,则向前读取下一条数据头(header),并返回步骤b2-2;如果没有,则返回错误,结束读取。

所述步骤b2-2中,将备用页切换为活动页的方法与步骤a2相同。

具体地、在步骤d5和步骤b2-4中,判断活动页中是否有下一条数据头(header)的方法为:

步骤c1、根据当前数据单元偏移量(hofs)、数据长度(len)和数据头长度(header_len),计算得到下一条数据的数据单元偏移量(hofs);下一条数据的数据单元偏移量(hofs)=当前数据单元偏移量(hofs)-数据长度(len)-数据头长度(header_len);

步骤c2、判断计算得到的数据单元偏移量(hofs)是否大于页面属性(pageHeader)长度+数据头长度(header_len),如果大于则说明还有下一条数据,如果不大于则说明无下一条数据。

在Nor Flash存储器断电后重新上电或重启时,需要执行非首次上电初始化,非首次上电初始化的方法包括以下步骤:

S'1、读取两个存储页的页面属性(pageHeader),对两个页面属性(pageHeader)的页面校验码(Pg_Magic)进行校验,如果校验都通过,则执行S'2,如果校验只通过一个,则执行S'3,如果校验都未通过,则执行首次上电初始化;

S'2、选择页面累加数(Pg_Cnt)大的存储页作为活动页,并查找活动页数据的结束地址,更新内存中三个全局变量的值:活动页地址(g_PgAcitve)的值为活动页所在存储页的起始地址,页切换标记(g_PgCycle)的值为活动页的页面累加数(Pg_Cnt),活动页的数据偏移地址(g_PgOffset)的值为数据结束地址在活动页中的偏移地址,完成初始化;

S'3、选择通过校验的存储页作为活动页,并查找活动页数据的结束地址,更新内存中三个全局变量的值:活动页地址(g_PgAcitve)的值为活动页所在存储页的起始地址,页切换标记(g_PgCycle)的值为活动页的页面累加数,活动页的数据偏移地址(g_PgOffset)的值为数据结束地址在活动页中的偏移地址,完成初始化。

在S'2和S'3中,查找活动页数据结束地址的方法为:从活动页最后一个地址开始,从后向前逐个字节读取存储的数据,当读取的数据不为0xFF时,标记该位置的下一个字节的地址为数据结束地址。

本发明由于在向Nor Flash写数据时,始终在活动页的数据偏移地址(g_PgOffset)写入,不会擦除前面的数据,正常情况下,只有在活动页数据写满后,进行切换活动页操作时会擦除一遍存储页,这样大大减少了擦写Nor Flash的操作,从而提高了NorFlash的使用寿命。另外,由于读出数据时,是从活动页的数据偏移地址(g_PgOffset)位置从后向前查找读取,所以当同一个数据编号(ID)的数据经过多次写入后,读出的数据就是最后写入的数据,即最新的数据,前面写入的自动变为无效数据。

本发明还涉及一种存储设备,所述存储设备被配置为执行上述的适用于NorFlash数据存储的磨损均衡方法。

以上所述为本发明的实施方式,应当指出,对于本领域的普通技术人员而言,在不脱离本发明原理前提下,还可以做出多种变形和改进,这也应该视为本发明的保护范围。

16页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:存储装置和存储设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!