CN113689909A - 一种磨损均衡的可变数据页宽度的flash读写方法 - Google Patents
一种磨损均衡的可变数据页宽度的flash读写方法 Download PDFInfo
- Publication number
- CN113689909A CN113689909A CN202110964225.9A CN202110964225A CN113689909A CN 113689909 A CN113689909 A CN 113689909A CN 202110964225 A CN202110964225 A CN 202110964225A CN 113689909 A CN113689909 A CN 113689909A
- Authority
- CN
- China
- Prior art keywords
- data
- block
- state
- index
- page number
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 27
- 238000013500 data storage Methods 0.000 claims description 10
- 125000004122 cyclic group Chemical group 0.000 claims description 4
- 230000009191 jumping Effects 0.000 claims description 4
- 238000005299 abrasion Methods 0.000 claims description 2
- 238000006073 displacement reaction Methods 0.000 abstract 2
- 230000002035 prolonged effect Effects 0.000 abstract 1
- 230000002159 abnormal effect Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 238000004590 computer program Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G11—INFORMATION STORAGE
- G11C—STATIC STORES
- G11C16/00—Erasable programmable read-only memories
- G11C16/02—Erasable programmable read-only memories electrically programmable
- G11C16/06—Auxiliary circuits, e.g. for writing into memory
Landscapes
- Read Only Memory (AREA)
Abstract
本发明涉及一种FLASH存储器数据结构及其读写方法,包括动态适应写入数据块的页数,将数据循环写入存储空间中的不同区域且在每个循环后将之平移一定位移量。平移的基准是上一个当前页号之后、上个循环之中最近的写入起始页号,因此位移量随循环变化、同时实现相较上个循环中的一个数据块进行了页号偏移,两者写入的数据块内容大部分重叠而无需更改、少部分错开而避免了集中写入某些地址而过多损耗寿命。上述方法解决了一些应用中写入的少部分数据频繁变化,多数数据通常为0、仅偶尔变化,如此数据特性造成的FLASH存储单元寿命磨损不平均的问题,在保证空间使用效率的同时延长FLASH存储器的使用寿命。
Description
技术领域
本发明涉及存储设备领域,具体涉及一种延长FLASH写寿命的方法。
背景技术
在嵌入式系统设计中,经常会遇到断电后需保留部分动态参数的应用,通常使用但EEPROM(Electrically Erasable Programmable read only memory,带电可擦可编程只读存储器)实现断电存储功能。
EEPROM的缺点之一是写入和擦除有寿命限制,一般为10万次;之二是价格高、容量低。
FLASH是一种类似EEPROM的存储器,由于原理的差异,其价格相较EEPROM低、容量高。
但是,相对于EEPROM一次可任意改写某一字节的存储内容,FLASH清除并改写的最小单位是一个页(通常由数百以上个字节组成),即只要一个页内任何数据需要改写,同页的数据将被全部清0、再重新写入非0的内容。
通常,延长FLASH写寿命的方法是将其存储空间固定划分为若干区域,每次写入时论轮流使用各个区域,避免重复写入同一个地址而不使用其他空间,使得整个存储空间的写入寿命均匀损耗。
但是,在一些应用中,在每次存储数据时,部分参数会有变化,但其余多数参数是0,并不需要重复写入。按照常用的分区域写入方法,意味着频繁变化的参数的存储位置的损耗速度远高于通常为0的参数的存储位置,即存储空间的写入寿命没有均匀损耗。
一个典型的例子是程序日志的记录。为了保持数据结构的完整,通常会有跨多个页区域被预留以写入程序日志。在多数情况下,程序不发生异常,不产生异常日志,因此多数预留空间不会被改变而为0;部分参数和惯例日志则会被写入固定区域。这显然造成参数和惯例日志区域被频繁改写而寿命损耗,异常日志区则鲜有被使用,即没有均匀损耗、充分利用存储器寿命。
发明内容
基于此,有必要针对FLASH存储数据部分频繁改变、部分通常为0造成的寿命磨损不均的问题,提供一种磨损均衡的可变数据页宽度的FLASH读写方法。
一种磨损均衡的可变数据页宽度的FLASH读写方法,包括如下步骤。
步骤之一,启动FLASH存储器及配套的、用于存储状态信息的EEPROM存储器;从预设值获取状态存储区单元数Sstate和数据存储区单元数Sdata,将存储空间划分为状态存储区和数据存储区;
所述状态存储区各个单元以从0开始递增的状态地址标识,每个单元的容量固定为一定字节数并占据1个地址;每个单元存储数据块编号、数据块起始页号和数据块终止页号三个值;所有所述数据块编号在复位时写入Sstate+1;
所述数据存储区各个单元以从0开始递增的数据页号标识,每个单元的容量固定为一页并占据1个地址,每个单元存储数据,若干个连续单元构成存储一个数据块;
所述地址均允许循环访问,即所述存储地址中的末尾地址的下一位,自动指向所述存储地址中的首位地址,所述数据地址中的末尾页号的下一位,自动指向所述数据地址中的首位页号;数学上,这可以通过取余运算进行,符号为%。
步骤之二,开始读取流程,从所述状态存储区读取各个单元的所述数据块编号,将之组成数据块编号序列并保留其前后顺序,并在下述访问过程中允许循环访问,即序列的末尾的下一位定义为序列的首位。
步骤之三,在所述数据块编号序列中,从首位向后搜索第一个编号不连续的位置;
如果不存在不连续位置,则记录当前块状态地址Pindex=0,当前块编号Vindex=0,当前块起始页号为Bdata=0,输出空数据,结束读取流程,并跳转到步骤之十一;
否则,记录所述编号不连续位置的两个编号中的靠前一个的地址为最后写入块状态地址Pindex,-1(如果是末尾编号和首位编号不连续,Pindex,-1=Sstate-1),并进行下一步骤。
步骤之四,按照所述最后写入块状态地址Pindex,-1,从状态存储区读出其指向的存储单元中存储的状态信息,分别记为最后写入块编号Vindex,-1、最后写入块起始页号Bdata,-1和最后写入块终止页号Edata,-1。
步骤之五,读出并输出数据存储区中Bdata,-1到Edata,-1页号中的数据,结束读取流程。
步骤之六,记当前块编号Vindex=(Vindex,-1+1)%(Sstate+1),当前块状态地址Pindex=(Pindex,-1+1)%Sstate。
步骤之七,从所述状态存储区读取各个单元的一对所述数据块起始页号和所述数据块终止页号,将每一对视为一个元素,组成数据块起止页号序列并保留其前后顺序,并在下述访问过程中允许循环访问这个序列,即序列的末尾的下一位定义为序列的首位。
步骤之八,在所述数据块起止页号序列中,从所述最后写入块状态地址的前一地址(Pindex,-1-1)%Sstate开始,向前搜索第一个所述起止页号的区间包含所述最后写入块终止页号的单元,直到返回最后写入块状态地址的后一地址(Pindex,-1+1)%Sstate;
如果搜索无结果,则记当前块起始页号为Bdata=(Edata,-1+1)%Sdata,并跳转步骤之十一;
否则,则记搜索到的元素对应所述状态存储单元中记录的所述数据块编号为前重叠块编号Vindex,op,并进行下一步骤。
步骤之九,记前重叠块后块编号Vindex,aop=(Vindex,op+1)%Sstate。
步骤之十,在所述状态存储区中,读出数据块编号等于所述前重叠块后块编号的单元中的数据块起始页号,记为前重叠块后块起始页号Bdata,aop;计算当前块起始页号Bdata=(Edata,aop+1)%Sdata。
步骤之十一,开始写入流程,从外部输入数据,长度为Sblock,计算当前块终止页号Edata=(Bdata+Sblock-1)%Sdata。
步骤之十二,将所述状态Vindex,Bdata,Edata分别写入所述地址Pindex指向的所述状态存储区的单元,将所述输入数据写入所述页号Bdata开始到Edata地址所指向的数据存储区的单元,结束写入流程。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他实施例的附图。
图1是示例程序中,EEPROM及FLASH区的初始状态。
图2是示例配置下,EEPROM及FLASH区第1次写入后状态。
图3是示例配置下,EEPROM及FLASH区第2次写入后状态。
图4是示例配置下,EEPROM及FLASH区第3次写入后状态。
图5是示例配置下,EEPROM及FLASH区第4次写入后状态。
图6是示例配置下,EEPROM及FLASH区第5次写入后状态。
图7是示例配置下,EEPROM及FLASH区第6次写入后状态。
图8是示例配置下,EEPROM及FLASH区第7次写入后状态。
图9是示例配置下,EEPROM及FLASH区第8次写入后状态。
图10是示例配置下,EEPROM及FLASH区第9次写入后状态。
图11是读写流程的流程图。
具体实施方式
现在详细参考附图并描述实施例。为了全面理解本发明,在以下详细描述中提到了众多具体细节。但是本领域技术人员应该理解,本发明可以无需这些具体细节而实现。在其他实例中,不详细描述公知的方法、过程、组件和电路,以免不必要地使实施例模糊。
在本实施例中,EEPROM写入程序的参数配置为:状态区单元数:Sstate=6,数据区单元数:Sdata=16;另外,为了便于直观反映数据更新的效果,假定频繁变化的数据为数据块的前2字节,为便于鉴别,依次循环取英文大小写值,即a、b到z;不频繁编号的其他数据为0。
为符合一般计算机程序规则并便于理解,以下数据地址、序号值均以0为最小值。
本读写方法针对的EEPROM使用流程中,主要情景是程序启动时从EEPROM中读取状态信息,在程序结束写回EEOROM以断电储存,所以读操作必然伴随一次写操作,且两者涉及的数据紧密相关,因此这其中使用的变量并不严格区分用于写入流程还是读取流程。
由于读操作不改变存储内容,并且读操作的目标内容就是上次写操作的数据,所以以下的示意图均针对写操作完成后的状态;读操作后的状态、以及读出的数据,可以从前一次循环后的结果示意图查看。
对于一次读取操作,记其运算得到的最后写入块编号为Vindex,-1,最后写入块状态地址是Pindex,-1,最后写入块起始页号是Bdata,-1,最后写入块终止页号是Edata,-1。
对一次写入操作,记前重叠块编号为Vindex,op;前重叠块后块编号为Vindex,aop,前重叠块后块起始页号是Bdata,aop;记待写入数据长度为Sblock,当前块编号为Vindex,当前块状态地址为Pindex,当前块起始页号是Bdata,当前块终止页号是Edata。
各内容区的物理存储形式及存储器的初始状态如图1所示。其中,块编号被全部初始化为Sstate+1=7。
以下示意若干次读写循环以展示存储器的更新逻辑。
完成第1次写入后的存储器状态如图2所示。其中标注灰色背景的是发生更改的内容,其运算流程如下。
存储器读取图1所示的前状态。
由于所有状态地址的块编号为Sstate+1,为初始状态,因此读取的是空数据,并且当前块状态地址为0=Pindex,当前块编号为0=Vindex,当前块起始页号是0=Bdata。
从外部获得数据输入长度为3=Sblock,因而当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(0+3-1)%16=2。
所以,将状态[Vindex,Bdata,Edata]=[0,0,2]写入Pindex=0页,将输入数据写入Bdata=0开始到Edata=2的页。
完成第2次写入后的存储器状态如图3所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图2所示的前状态。块编号在状态地址0和1之间不连续,因此最后写入块状态地址是Pindex,-1=0;从此地址读出最后写入块编号为Vindex,-1=0,最后写入块起始页号是Edata,-1=0,最后写入块终止页号是Edata,-1=2,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(0+1)%6=1,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(0+1)%(6+1)=1;由于Edata,-1不包含在其他块的页号范围内,当前块起始页号Bdata=(Edata,-1+1)%Sdata=(2+1)%16=3。
存储器获得数据输入长度为4=Sblock,因而当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(3+4-1)%16=6。
所以,将状态[Vindex,Bdata,Edata]=[1,3,6]写入Pindex=1地址,将输入数据写入Bdata=3开始到Edata=6的页。
完成第3次写入后的存储器状态如图4所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图3所示的前状态。块编号在状态地址1和2之间不连续,因此最后写入块状态地址是Pindex,-1=1;从此地址读出最后写入块编号为Vindex,-1=1,最后写入块起始页号是Edata,-1=3,最后写入块终止页号是Edata,-1=6,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(1+1)%6=2,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(1+1)%(6+1)=2;由于Edata,-1不包含在其他块的页号范围内,当前块起始页号Bdata=(Edata,-1+1)%Sdata=(6+1)%16=7。
存储器获得数据输入长度为5=Sblock,因而当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(7+5-1)%16=11。
所以,将状态[Vindex,Bdata,Edata]=[2,7,11]写入Pindex=2地址,将输入数据写入Bdata=7开始到Edata=11的页。
完成第4次写入后的存储器状态如图5所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图4所示的前状态。块编号在状态地址2和3之间不连续,因此最后写入块状态地址是Pindex,-1=2;从此地址读出最后写入块编号为Vindex,-1=2,最后写入块起始页号是Edata,-1=7,最后写入块终止页号是Edata,-1=11,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(2+1)%6=3,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(2+1)%(6+1)=3;由于Edata,-1不包含在其他块的页号范围内,当前块起始页号Bdata=(Edata,-1+1)%Sdata=(11+1)%16=12。
存储器获得数据输入长度为5=Sblock,因而当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(12+5-1)%16=0。
所以,将状态[Vindex,Bdata,Edata]=[3,12,0]写入Pindex=3地址,将输入数据写入Bdata=12开始到Edata=0的页号,即从Bdata写入直到数据区末尾、再将剩余部分从数据区起始写入直到Edata;
接下来的循环,将会出现前重叠快处理。
完成第5次写入后的存储器状态如图6所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图5所示的前状态,块编号在状态地址3和4之间不连续,因此最后写入块状态地址是Pindex,-1=3;从此地址读出最后写入块编号为Vindex,-1=3,最后写入块起始页号是Bdata,-1=12,最后写入块终止页号是Edata,-1=0,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(3+1)%6=4,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(3+1)%(6+1)=4;由最后写入块向前搜寻,由于Edata,-1=0包含在块编号0的地址范围[0,2]内,因而前重叠块编号为0=Vindex,op;进而,前重叠块后块编号为Vindex,aop=(Vindex,op+1)%Sstate=(0+1)%5=1。
根据编号Vindex,aop读出前重叠块后块起始页号为Bdata,aop=3;进而当前块起始页号Bdata=(Edata,aop+1)%Sdata=(3+1)%16=4。
存储器获得数据输入长度为5=Sblock,当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(4+5-1)%16=8。
所以,将状态[Vindex,Bdata,Edata]=[4,4,8]写入Pindex=4地址,将输入数据写入Bdata=4开始到Edata=8的地址。
完成第6次写入后的存储器状态如图7所示。其中标注灰色背景的是发生更改的内容。其运算流程是如下。
存储器读取图6所示的前状态,块编号在状态地址4和5之间不连续,因此最后写入块状态地址是Pindex,-1=4;从此地址读出最后写入块编号为Vindex,-1=4,最后写入块起始页号是Bdata,-1=4,最后写入块终止页号是Edata,-1=8,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(4+1)%6=5,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(4+1)%(6+1)=5;由最后写入块向前搜寻,由于Edata,-1=8包含在块编号2的地址范围[7,11]内,因而前重叠块编号为2=Vindex,op;进而,前重叠块后块编号为Vindex,aop=(Vindex,op+1)%Sstate=(2+1)%5=3。
根据编号Vindex,aop读出前重叠块后块起始页号为Bdata,aop=12;进而当前块起始页号Bdata=(Edata,aop+1)%Sdata=(12+1)%16=13。
存储器获得数据输入长度为6=Sblock,当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(13+6-1)%16=2。
所以,将状态[Vindex,Bdata,Edata]=[5,13,2]写入Pindex=5地址,将输入数据写入Bdata=13开始到Edata=2的地址,即从Bdata写入直到数据区末尾、再将剩余部分从数据区起始写入直到Edata。
完成第7次写入后的存储器状态如图8所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图7所示的前状态。块编号在状态地址5和0之间不连续,因此最后写入块状态地址是Pindex,-1=5;从此地址读出最后写入块编号为Vindex,-1=5,最后写入块起始页号是Bdata,-1=13,最后写入块终止页号是Edata,-1=2,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(5+1)%6=0,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(5+1)%(6+1)=6;由最后写入块向前搜寻,由于Edata,-1=2包含在块编号0的地址范围[0,2]内(写入前状态,即图7所示),因而前重叠块编号为0=Vindex,op;进而,前重叠块后块编号为Vindex,aop=(Vindex,op+1)%Sstate=(0+1)%5=1。
根据编号Vindex,aop读出前重叠块后块起始页号为Bdata,aop=3;进而当前块起始页号Bdata=(Edata,aop+1)%Sdata=(3+1)%16=4。
存储器获得数据输入长度为7=Sblock,当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(4+7-1)%16=10。
所以,将状态[Vindex,Bdata,Edata]=[6,4,10]写入Pindex=0地址,将输入数据写入Bdata=4开始到Edata=10的地址。
完成第8次写入后的存储器状态如图9所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图8所示的前状态,块编号在状态地址0和1之间不连续,因此最后写入块状态地址是Pindex,-1=0;从此地址读出最后写入块编号为Vindex,-1=6,最后写入块起始页号是Bdata,-1=4,最后写入块终止页号是Edata,-1=10,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(0+1)%6=1,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(6+1)%(6+1)=0;由最后写入块向前搜寻,由于Edata,-1=10包含在块编号2的地址范围[7,11]内,因而前重叠块编号为2=Vindex,op;进而,前重叠块后块编号为Vindex,aop=(Vindex,op+1)%Sstate=(2+1)%6=3。
根据编号Vindex,aop读出前重叠块后块起始页号为Bdata,aop=12;进而当前块起始页号Bdata=(Edata,aop+1)%Sdata=(12+1)%16=13。
存储器获得数据输入长度为4=Sblock,当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(13+4-1)%16=0。
所以,将状态[Vindex,Bdata,Edata]=[0,13,0]写入Pindex=1地址,将输入数据写入Bdata=14开始到Edata=0的地址,即从Bdata写入直到数据区末尾、再将剩余部分从数据区起始写入直到Edata。
完成第9次写入后的存储器状态如图10所示。其中标注灰色背景的是发生更改的内容。其运算流程如下。
存储器读取图9所示的前状态,块编号在状态地址1和2之间不连续,因此最后写入块状态地址是Pindex,-1=1;从此地址读出最后写入块编号为Vindex,-1=0,最后写入块起始页号是Bdata,-1=14,最后写入块终止页号是Edata,-1=0,可读出[Edata,-1,Edata,-1]段数据。
进而,当前状态地址Pindex=(Pindex,-1+1)%Sstate=(1+1)%6=2,当前块编号为Vindex=(Vindex,-1+1)%(Sstate+1)=(0+1)%(6+1)=1;由最后写入块向前搜寻,由于Edata,-1=0包含在块编号5的地址范围[13,2]内,因而前重叠块编号为5=Vindex,op;进而,前重叠块后块编号为Vindex,aop=(Vindex,op+1)%Sstate=(5+1)%6=0。
根据编号Vindex,aop读出前重叠块后块起始页号为Bdata,aop=4;进而当前块起始页号Bdata=(Edata,aop+1)%Sdata=(4+1)%16=5。
存储器获得数据输入长度为4=Sblock,当前块终止页号Edata=(Bdata+Sblock-1)%Sdata=(5+4-1)%16=8。
所以,将状态[Vindex,Bdata,Edata]=[1,5,8]写入Pindex=2地址,将输入数据写入Bdata=5开始到Edata=8的地址。
至此,已展示了所有变量完成一次循环的流程中的关键步骤。
本发明的不局限于上述实施方式,本发明的上述各个实施方式的技术方案彼此可以交叉组合形成新的技术方案,另外凡采用等同替换形成的技术方案,均落在本发明要求的保护范围内。
Claims (1)
1.一种磨损均衡的可变数据页宽度的FLASH读写方法,其特征在于,包括如下步骤:
步骤之一,启动FLASH存储器及配套的、用于存储状态信息的EEPROM存储器;从预设值获取状态存储区单元数Sstate和数据存储区单元数Sdata,将存储空间划分为状态存储区和数据存储区;
所述状态存储区各个单元以从0开始递增的状态地址标识,每个单元的容量固定为一定字节数并占据1个地址;每个单元存储数据块编号、数据块起始页号和数据块终止页号三个值;所有所述数据块编号在复位时写入Sstate+1;
所述数据存储区各个单元以从0开始递增的数据页号标识,每个单元的容量固定为一页并占据1个地址,每个单元存储数据,若干个连续单元构成存储一个数据块;
所述地址均允许循环访问,即所述存储地址中的末尾地址的下一位,自动指向所述存储地址中的首位地址,所述数据地址中的末尾页号的下一位,自动指向所述数据地址中的首位页号;数学上,这可以通过取余运算进行,符号为%;
步骤之二,开始读取流程,从所述状态存储区读取各个单元的所述数据块编号,将之组成数据块编号序列并保留其前后顺序,并在下述访问过程中允许循环访问,即序列的末尾的下一位定义为序列的首位;
步骤之三,在所述数据块编号序列中,从首位向后搜索第一个编号不连续的位置;
如果不存在不连续位置,则记录当前块状态地址Pindex=0,当前块编号Vindex=0,当前块起始页号为Bdata=0,输出空数据,结束读取流程,并跳转到步骤之十一;
否则,记录所述编号不连续位置的两个编号中的靠前一个的地址为最后写入块状态地址Pindex,-1(如果是末尾编号和首位编号不连续,Pindex,-1=Sstate-1),并进行下一步骤;
步骤之四,按照所述最后写入块状态地址Pindex,-1,从状态存储区读出其指向的存储单元中存储的状态信息,分别记为最后写入块编号Vindex,-1、最后写入块起始页号Bdata,-1和最后写入块终止页号Edata,-1;
步骤之五,读出并输出数据存储区中Bdata,-1到Edata,-1页号中的数据,结束读取流程;
步骤之六,记当前块编号Vindex=(Vindex,-1+1)%(Sstate+1),当前块状态地址Pindex=(Pindex,-1+1)%Sstate;
步骤之七,从所述状态存储区读取各个单元的一对所述数据块起始页号和所述数据块终止页号,将每一对视为一个元素,组成数据块起止页号序列并保留其前后顺序,并在下述访问过程中允许循环访问这个序列,即序列的末尾的下一位定义为序列的首位;
步骤之八,在所述数据块起止页号序列中,从所述最后写入块状态地址的前一地址(Pindex,-1-1)%Sstate开始、直到最后写入块状态地址的后一地址(Pindex,-1+1)%Sstate结束,向前搜索第一个所述起止页号的区间包含所述最后写入块终止页号的单元;
如果搜索无结果,则记当前块起始页号为Bdata=(Edata,-1+1)%Sdata,并跳转步骤之十一;
否则,则记搜索到的元素对应所述状态存储单元中记录的所述数据块编号为前重叠块编号Vindex,op,并进行下一步骤;
步骤之九,记前重叠块后块编号Vindex,aop=(Vindex,op+1)%Sstate;
步骤之十,在所述状态存储区中,读出数据块编号等于所述前重叠块后块编号的单元中的数据块起始页号,记为前重叠块后块起始页号Bdata,aop;计算当前块起始页号Bdata=(Edata,aop+1)%Sdata;
步骤之十一,开始写入流程,从外部输入数据,长度为Sblock,计算当前块终止页号Edata=(Bdata+Sblock-1)%Sdata;
步骤之十二,将所述状态Vindex,Bdata,Edata分别写入所述地址Pindex指向的所述状态存储区的单元,将所述输入数据写入所述页号Bdata开始到Edata地址所指向的数据存储区的单元,结束写入流程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110964225.9A CN113689909A (zh) | 2021-08-22 | 2021-08-22 | 一种磨损均衡的可变数据页宽度的flash读写方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110964225.9A CN113689909A (zh) | 2021-08-22 | 2021-08-22 | 一种磨损均衡的可变数据页宽度的flash读写方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113689909A true CN113689909A (zh) | 2021-11-23 |
Family
ID=78581582
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110964225.9A Pending CN113689909A (zh) | 2021-08-22 | 2021-08-22 | 一种磨损均衡的可变数据页宽度的flash读写方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113689909A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114546291A (zh) * | 2022-02-28 | 2022-05-27 | 徐工汉云技术股份有限公司 | 一种车辆总线数据循环存储的方法、装置和系统 |
-
2021
- 2021-08-22 CN CN202110964225.9A patent/CN113689909A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114546291A (zh) * | 2022-02-28 | 2022-05-27 | 徐工汉云技术股份有限公司 | 一种车辆总线数据循环存储的方法、装置和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
TWI775122B (zh) | 用來存取至少一非揮發性記憶體元件的處理單元 | |
US8312554B2 (en) | Method of hiding file at data protecting mode for non-volatile memory module, memory controller and portable memory storage apparatus | |
US8291155B2 (en) | Data access method, memory controller and memory storage system | |
US7725646B2 (en) | Method of using a flash memory for a circular buffer | |
US8117172B2 (en) | Compact encoding methods, media and systems | |
KR20140146229A (ko) | 동적 멀티 모드 동작의 비휘발성 메모리 | |
US9141530B2 (en) | Data writing method, memory controller and memory storage device | |
CN106649144A (zh) | 数据储存设备及其操作方法 | |
CN104765569A (zh) | 数据写入方法、存储器控制电路单元与存储器储存装置 | |
JP7095568B2 (ja) | メモリコントローラ及びこれを備えるフラッシュメモリシステム | |
TWI450271B (zh) | 用來管理一快閃記憶體的複數個區塊之方法以及相關之記憶裝置及其控制器 | |
CN113689909A (zh) | 一种磨损均衡的可变数据页宽度的flash读写方法 | |
TWI435216B (zh) | 用來進行超區塊管理之方法以及記憶裝置及控制器 | |
US10290346B2 (en) | Method and apparatus for low-latency read of flash storage devices using fractional bits per cell | |
JP4235646B2 (ja) | メモリコントローラおよびフラッシュメモリシステム | |
CN106354651B (zh) | 平均磨损方法、存储器控制电路单元及存储器储存装置 | |
KR20040072875A (ko) | 낸드 플래시 메모리를 이용한 저장장치 | |
CN109522237B (zh) | 存储器的数据管理方法及存储器装置 | |
CN113687786A (zh) | 一种可变数据块宽度的eeprom读写方法 | |
CN106469019B (zh) | 存储器管理方法、存储器控制电路单元及存储器储存装置 | |
US10528287B2 (en) | Memory, memory controller, storage apparatus, information processing system, and control method for tracking erase count and rewrite cycles of memory pages | |
CN113687787A (zh) | 一种磨损均衡的固定数据页宽度的flash读写方法 | |
CN109411000A (zh) | 一种固态存储器的控制方法、固态存储器及存储介质 | |
CN113687785A (zh) | 一种固定数据块宽度的eeprom读写方法 | |
US8631187B2 (en) | Dual-scope directory for a non-volatile memory storage system |
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 | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20211123 |
|
WD01 | Invention patent application deemed withdrawn after publication |