CN103729303B - 一种Flash的数据写入和读取方法 - Google Patents
一种Flash的数据写入和读取方法 Download PDFInfo
- Publication number
- CN103729303B CN103729303B CN201410024168.6A CN201410024168A CN103729303B CN 103729303 B CN103729303 B CN 103729303B CN 201410024168 A CN201410024168 A CN 201410024168A CN 103729303 B CN103729303 B CN 103729303B
- Authority
- CN
- China
- Prior art keywords
- data
- index
- daily record
- physical page
- current
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 77
- 238000003860 storage Methods 0.000 claims description 50
- 238000013507 mapping Methods 0.000 claims description 17
- 238000004364 calculation method Methods 0.000 claims description 7
- 241001269238 Data Species 0.000 claims description 6
- 238000010304 firing Methods 0.000 claims 3
- 238000013500 data storage Methods 0.000 abstract description 9
- 230000009286 beneficial effect Effects 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 7
- 230000007547 defect Effects 0.000 description 1
- 238000000151 deposition Methods 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种Flash的数据写入和读取方法,属于存储器领域。其中,数据写入的方法包括:检查物理页面的数据区和索引区的剩余空间是否均充足,是则将本次写入数据顺序存储到物理页面的数据区,并生成一条索引日志顺序写入到物理页面的索引区;否则组织物理页面中的真实数据,将真实数据存储到空闲页面的数据区,并根据真实数据生成索引日志写入空闲页面的索引区;数据读取的方法包括:根据物理页面的索引区中的索引日志获取要读取的数据的真实存储地址,从真实存储地址中读取数据。本发明的有益效果在于:既能提高数据的更新和读取效率,又能保证Flash的空间利用率。
Description
技术领域
本发明涉及存储器领域,尤其涉及一种Flash的数据写入和读取方法。
背景技术
Flash是存储芯片的一种,Flash存储器又称闪存,它结合了ROM(只读存储器)和RAM(随机存储器)的长处,不仅具备电子可擦除可编程的性能,还可以快速读取数据,使数据不会因为断电而丢失。
发明人在实现本发明的过程中发现,基于Flash只能以块为单位或者对整片执行擦除操作的特性,现有技术中至少存在以下不足:有很多Flash芯片的页面非常大,但是应用中每次需要更新的内容却比较少,根据目前通用的方法,每次即使是更新几个字节的数据,也要重新查找空闲物理页面,然后将原始页面的内容在RAM中更新后写入新的物理页面,采用这种方法进行数据更新,效率低,且会缩短Flash的寿命;
针对上述问题的一种解决方式是将物理页面划分为有效数据区和日志区,有效数据区用于存储数据,当需要更新有效数据区中的数据时,不进行擦除操作,而是生成一条包含更新数据的更新日志写入日志区;这种方法的缺点在于会降低读取效率和空间利用率。
发明内容
本发明的目的是为了克服现有技术的缺陷,提出一种Flash的数据写入和读取方法。
本发明方法是通过下述技术方案实现的:
一方面,本发明提供了一种Flash的数据写入方法,其基本实施过程如下:
S10:根据写入地址计算得到本次写入数据的逻辑页号和本次写入数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与所述本次写入数据的逻辑页号对应的物理页面;
S20:判断所述物理页面的数据区和索引区的剩余空间是否均充足,是则将本次写入数据顺序存储到所述物理页面的数据区,并根据所述本次写入数据的页内偏移地址、本次写入数据的长度和本次写入数据的存储地址生成一条索引日志,将生成的索引日志顺序写入所述物理页面的索引区,结束,否则执行S30;
S30:查找空闲页面,执行S40;
S40:读取所述物理页面的数据区中存储的数据,根据所述物理页面的索引区中的索引日志和本次写入数据对读取到的数据进行组织,得到所述物理页面的数据区中的有效数据,将所述有效数据顺序写入所述空闲页面的数据区,并根据所述有效数据生成索引日志,将生成的索引日志顺序写入所述空闲页面的索引区,执行S50;
S50:更新所述逻辑页号和物理页号对应关系;
具体地,所述根据逻辑页号和物理页号对应关系查找与所述本次写入数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次写入数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
所述更新所述逻辑页号和物理页号对应关系具体包括:将所述逻辑页号物理页号映射表中与所述本次写入数据的逻辑页号对应的物理页号更新为所述空闲页面的物理页号;
所述判断所述物理页面的数据区的剩余空间是否充足具体包括:
步骤A1:根据所述物理页面的索引区中的最后一条索引日志计算本次写入数据的存储地址;
步骤A2:计算本次写入数据的存储地址加上本次写入数据的长度,判断计算结果是否大于所述物理页面的数据区的最大页内偏移地址,是则所述物理页面的数据区的剩余空间不充足,否则所述物理页面的数据区的剩余空间充足;
所述步骤A1具体包括:查找所述物理页面的索引区中的最后一条索引日志,获取所述最后一条索引日志中的写入数据的存储地址和写入数据的长度,计算获取到的写入数据的存储地址和写入数据的长度的和,得到本次写入数据的存储地址;
所述判断所述物理页面的索引区的剩余空间是否充足具体包括:
步骤B1:计算所述物理页面的索引区的剩余空间;
步骤B2:判断所述物理页面索引区的剩余空间是否大于一条索引日志的长度,是则所述物理页面的索引区的剩余空间充足,否则所述物理页面的索引区的剩余空间不充足;
所述步骤B1具体包括:查找所述物理页面的索引区中的最后一条索引日志,根据所述最后一条索引日志结尾处在所述物理页面中的偏移地址得到所述物理页面的索引区已使用的字节数,计算所述物理页面的索引区的大小减去所述物理页面的索引区已使用的字节数,得到所述物理页面的索引区的剩余空间;
所述S40具体包括:
步骤C1:初始化大小等于所述物理页面的数据区大小的内存空间;
步骤C2:顺序读取所述物理页面的索引区中的索引日志,根据索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
步骤C3:按照本次写入数据的页内偏移地址将本次写入数据写入所述内存空间的相应位置;
步骤C4:遍历所述内存空间,每当查找到所述内存空间中的一块非空闲区域时,读取所述非空闲区域中的数据,将读取到的数据写入所述空闲页面的数据区,并根据读取到的数据生成一条索引日志写入所述空闲页面的索引区;
进一步地,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志;
或者,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行a2;
a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行a3;
a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回a2,否则执行a4;
a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回a2;
或者,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行b2;
b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行b3;
b3:将读取到的数据之前的一个字节作为当前字节,返回b2;
其中,所述判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则判定读取到的数据不是一条索引日志,否则判定读取到的数据是一条索引日志。
另一方面,本发明还提供了一种Flash的数据读取方法,其基本实施过程如下:
T10:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
T20:根据本次要读取的数据的长度设置并复位与本次要读取的数据对应的读取标志;
T30:查找并读取所述物理页面的索引区中的最后一条索引日志,作为当前索引日志;
T40:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度判断当前索引日志是否涉及本次要读取的数据中读取标志未置位的数据,是则执行T60,否则执行T50;
T50:读取当前索引日志的前一条索引日志,作为当前索引日志,返回T40;
T60:根据当前索引日志中的写入数据的存储地址从所述物理页面中读取涉及到的数据,并将与读取到的数据对应的读取标志置位;
T70:检查所述与本次要读取的数据对应的读取标志,判断是否读取到全部的本次要读取的数据,是则结束,否则返回T50;
具体地,所述根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
所述T20具体包括:设置并复位个数等于本次要读取的数据的长度的读取标志,分别对应本次要读取的数据中的每个字节数据;
所述查找所述物理页面的索引区中的最后一条索引日志具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志;
或者,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行a2;
a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行a3;
a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回a2,否则执行a4;
a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回a2;
所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行b2;
b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行b3;
b3:将读取到的数据之前的一个字节作为当前字节,返回b2;
其中,所述判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则读取到的数据不是一条索引日志,否则读取到的数据是一条索引日志;
所述T40具体包括:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围,判断本次要读取的数据中读取标志未置位的数据的页内偏移地址是否有在计算得到的页内偏移地址范围内的,是则当前索引日志涉及本次要读取的数据中读取标志未置位的数据,执行T60,否则前索引日志不涉及本次要读取的数据中读取标志未置位的数据,执行T50;
所述T70具体包括:判断与本次要读取的数据对应的读取标志是否均置位,是则读取到全部的本次要读取的数据,结束,否则没有读取到全部的本次要读取的数据,返回T50。
又一方面,本发明还提供了一种Flash的数据读取方法,其基本实施过程如下:
U10:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
U20:初始化大小等于所述物理页面的数据区大小的内存空间;
U30:顺序读取所述物理页面的索引区中的索引日志,根据读取到的索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照读取到的索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
U40:根据本次要读取的数据的页内偏移地址和本次要读取的数据的长度从所述内存空间中读取本次要读取的数据,结束;
具体地,所述根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
所述U30具体包括:
c1:顺序读取一条所述物理页面的索引区中的索引日志,作为当前索引日志;
c2:按照当前索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
c3:判断所述物理页面的索引区中是否还有未读取的索引日志,是则返回c1,否则执行U40。
再一方面,本发明还提供了一种Flash的数据读取方法,其基本实施过程如下:
V10:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
V20:根据本次要读取的数据的页内偏移地址初始化当前页内偏移地址;
V30:查找并读取所述物理页面的索引区中的最后一条索引日志,作为当前索引日志,执行V40;
V40:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度判断当前索引日志是否涉及当前页内偏移地址,是则执行V60,否则执行V50;
V50:读取当前索引日志的前一条索引日志,作为当前索引日志,返回V40;
V60:根据当前索引日志中的写入数据的存储地址从所述物理页面的数据区中读取当前索引日志涉及到的本次要读取的数据中从当前页内偏移地址开始的数据,并根据读取到的数据更新当前页内偏移地址,执行V70;
V70:判断是否读取到全部的本次要读取的数据,是则结束,否则返回V30;
具体地,所述根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
所述根据本次要读取的数据的页内偏移地址初始化当前页内偏移地址具体包括:初始化当前页内偏移地址为本次要读取的数据的页内偏移地址;
所述根据读取到的数据更新当前页内偏移地址具体包括:更新当前页内偏移地址为读取到的数据中的最后一个字节数据对应的页内偏移地址的下一页内偏移地址;
所述判断是否读取到全部的本次要读取的数据具体包括:计算本次要读取的数据的页内偏移地址加上本次要读取的数据的长度,判断计算结果是否小于当前页内偏移地址,是则读取到全部的要读取的数据,否则未读取到全部的要读取的数据;
所述查找所述物理页面的索引区中的最后一条索引日志具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志;
所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行a2;
a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行a3;
a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回a2,否则执行a4;
a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回a2;
所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行b2;
b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行b3;
b3:将读取到的数据之前的一个字节作为当前字节,返回b2;
其中,所述判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则判定读取到的数据不是一条索引日志,否则判定读取到的数据是一条索引日志;
所述根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度判断当前索引日志是否涉及当前页内偏移地址,具体包括:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围,判断当前页内偏移地址是否在计算得到的页内偏移地址范围内,是则当前索引日志涉及当前页内偏移地址,否则当前索引日志不涉及当前页内偏移地址;
进一步地,所述V20中还包括:初始化当前计数;
所述V60中,所述根据当前索引日志中的写入数据的存储地址从所述物理页面的数据区中读取当前索引日志涉及到的本次要读取的数据中从当前页内偏移地址开始的数据,之后还包括:根据读取到的数据更新当前计数;
所述V70具体包括:判断当前计数是否等于预设值,是则读取到全部的本次要读取的数据,否则没有读取到全部的本次要读取的数据;
所述初始化当前计数具体包括:初始化当前计数为本次要读取的数据的长度;
所述根据读取到的数据更新当前计数具体包括:更新当前计数为其当前值减去读取到的数据的长度;
所述判断当前计数是否等于预设值具体包括:判断当前计数是否等于0;
或者,所述初始化当前计数具体包括:初始化当前计数为0;
所述根据读取到的数据更新当前计数具体包括:更新当前计数为其当前值加上读取到的数据的长度;
所述判断当前计数是否等于预设值具体包括:判断当前计数是否等于本次要读取的数据的长度。
本发明方法的有益效果在于,采用本发明提供的方法可以提高数据更新的效率,特别是在Flash页面较大,每次更新的数据量较小的情况下,能够大幅提升Flash的性能和寿命。
附图说明
为了更清楚的说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一提供的一种Flash的数据写入方法的流程图;
图2为本发明实施例一中所述物理页面的一种示意图;
图3为向图2所示的物理页面中写入本次写入数据之后,所述物理页面的示意图;
图4为向图3所示的物理页面中写入根据本次写入数据生成的索引日志之后,所述物理页面的示意图;
图5为本发明实施例一中所述物理页面的另一种示意图;
图6为本发明实施例一中查找到的空闲页面的示意图;
图7为向图6所示的空闲页面中写入所述物理页面的数据区中的有效数据后,所述空闲页面的示意图;
图8为向图7所示的空闲页面中写入根据所述物理页面的数据区中的有效数据生成的索引日志后,所述空闲页面的示意图;
图9为本发明实施例二提供的一种Flash的读取数据方法的流程图;
图10为本发明实施例三提供的一种Flash的读取数据方法的流程图;
图11为本发明实施例四提供的一种Flash的读取数据方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供的一种Flash的数据写入和读取方法,将Flash的物理页面划分为数据区和索引区,数据区用于存储数据,索引区用于存储索引日志,当需要向Flash的物理页面中写入数据时,将数据顺序写入该物理页面的数据区,同时添加一条索引日志到该物理页面的索引区,当该物理页面的索引区和/或数据区写满后,查找一个空闲页面,用查找到的空闲页面替换该物理页面;当需要读取Flash的物理页面中的数据时,根据该物理页面日志区中的索引日志得到要读取的页内偏移地址中的真实数据,读取所述真实数据并返回。
本发明中,索引日志中包含写入数据的页内偏移地址、写入数据的长度和写入数据的存储地址,其中,写入数据的页内偏移地址为写入数据应该写入的地址,写入数据的存储地址为写入数据实际写入的地址。
实施例一
参见图1,本发明实施例一提供一种Flash的数据写入方法,包括:
步骤101:根据写入地址计算得到本次写入数据的逻辑页号和本次写入数据的页内偏移地址;
例如,本实施例中,要向Flash的逻辑地址0x2005中写入数据,Flash的物理页面和逻辑页面的大小均为4KB,则本次写入数据的逻辑页号=|0x2005/0x1000|=2,本次写入数据的页内偏移地址=0x2005-2*0x1000=0x0005。
步骤102:根据逻辑页号和物理页号对应关系查找与本次写入数据的逻辑页号对应的物理页面;
优选地,本实施例中,逻辑页号和物理页号对应关系通过逻辑页号物理页号映射表体现,步骤102包括:查询逻辑页号物理页号映射表,得到与本次写入数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
例如,本实施例中,本次写入数据的逻辑页号为2,逻辑页号物理页号映射表如下:
则与本次写入数据的逻辑页号对应的物理页号为3,在Flash中查找物理页号为3的物理页面。
步骤103:判断所述物理页面的数据区和索引区的剩余空间是否均充足,是则执行步骤104,否则执行步骤106;
具体地,本实施例中,判断所述物理页面的数据区的剩余空间是否充足包括:
步骤A1:根据所述物理页面的索引区中的索引日志计算本次写入数据的存储地址;
本实施例中,步骤A1具体包括:查找所述物理页面的索引区中的最后一条索引日志,获取所述最后一条索引日志中的写入数据的存储地址和写入数据的长度,计算获取到的写入数据的存储地址和写入数据的长度的和,得到本次写入数据的存储地址;
例如,最后一条索引日志中的写入数据的存储地址为0x000A,写入数据的长度0x0006,则本次写入数据的存储地址=0x000A+0x0006=0x0010;
进一步地,本实施例中,查找所述物理页面的索引区中的最后一条索引日志的方法具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志;
优选地,本实施例中,预设个数为2,预设值为0xFF;
或者,本实施例中,采用二分法查找所述物理页面的索引区中的最后一条索引日志,具体包括:
步骤a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行步骤a2;
例如,本实施例中,所述物理页面的索引区的大小为32字节,有效存储空间从所述物理页面的索引区的第1个字节开始,若一条索引日志的长度为6个字节,则定位第32-32mod6=30个字节为所述物理页面的索引区中有效存储空间的最后一个字节;
步骤a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行步骤a3;
例如,所述当前起始字节为第1个字节,所述当前结尾字节为第30个字节则首先计算所述当前起始字节到所述当前结尾字节包含的字节数=30-1+1=30个,然后定位第0+30/2-30/2mod6=12个字节为所述当前起始字节到所述当前结尾字节的中间字节;
步骤a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回步骤a2,否则执行步骤a4;
例如,本实施例中,一条索引日志的长度为6个字节,若当前中间字节为第12个字节,则读取第13个字节到第18个字节;
本实施例中,判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则判定读取到的数据不是一条索引日志,否则判定读取到的数据是一条索引日志;
优选地,本实施例中,预设值为0xFF;
步骤a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回步骤a2;
或者,本实施例中,查找所述物理页面的索引区中的最后一条索引日志的方法具体包括:
步骤b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行步骤b2;
例如,本实施例中,所述物理页面的索引区的大小为32字节,若一条索引日志的长度为6个字节,则定位第32-32mod6=30个字节为所述物理页面的索引区中有效存储空间的最后一个字节;
步骤b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行步骤b3;
例如,本实施例中,一条索引日志的长度为6个字节,若当前字节为第30个字节,则读取第25个字节至第30个字节;
本实施例中,判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则判定读取到的数据不是一条索引日志,否则判定读取到的数据是一条索引日志;
优选地,本实施例中,预设值为0xFF;
步骤b3:将读取到的数据之前的一个字节作为当前字节,返回步骤b2;
例如,若读取到的数据为所述物理页面的索引区中的第25个字节至第30个字节,则将第24个字节作为当前字节;
步骤A2:根据本次写入数据的存储地址判断所述物理页面的数据区的剩余空间是否充足;
本实施例中,步骤A2具体包括:计算本次写入数据的存储地址加上本次写入数据的长度,判断计算结果是否大于所述物理页面的数据区的最大页内偏移地址,是则所述物理页面的数据区的剩余空间不充足,否则所述物理页面的数据区的剩余空间充足;
例如,本实施例中,本次写入数据的存储地址为0x0010,本次写入数据的长度为5个字节,所述物理页面的数据区的大小为3KB,即所述物理页面的数据区的最大页内偏移地址为0x0C00,0x0010+0x0005=0x0015<0x0C00,则判定所述物理页面的数据区的空闲区域充足;
具体地,判断所述物理页面的索引区的剩余空间是否充足具体包括:
步骤B1:计算所述物理页面的索引区的剩余空间;
本实施例中,步骤B1具体包括:查找所述物理页面的索引区中的最后一条索引日志,根据所述最后一条索引日志结尾处在所述物理页面中的偏移地址得到所述物理页面的索引区已使用的字节数,计算所述物理页面的索引区的大小减去所述物理页面的索引区已使用的字节数,得到所述物理页面的索引区的剩余空间;
例如,所述最后一条索引日志结尾处在所述物理页面中的偏移地址为0x0010,所述物理页面的大小为1024个字节,则所述物理页面的索引区已使用的字节数=0x0010=16,所述物理页面的索引区的剩余空间=1024个字节-16个字节=1008个字节;
查找所述物理页面的索引区中的最后一条索引日志的方法同上所述,在此不再赘述;
步骤B2:判断所述物理页面索引区的剩余空间是否大于一条索引日志的长度,是则所述物理页面的索引区的剩余空间充足,否则所述物理页面的索引区的剩余空间不充足;
例如,本实施例中,一条索引日志的长度为6个字节,若所述物理页面的索引区的剩余空间为10个字节,则所述物理页面的索引区的剩余空间充足。
步骤104:将本次写入数据顺序存储到所述物理页面的数据区;
例如,所述物理页面如图2所示,所述物理页面的数据区中的数据为0x 11 11 1111 11 22 22 22 22 22 33 33 33 33 33 44 44 44 44 44 55 55 55 55 55,所述物理页面的索引区中有五条索引日志,分别为0x 00 00 00 05 00 00、0x 00 05 00 05 00 05、0x00 00 00 05 00 0A、0x 00 05 00 05 00 0F和0x 00 00 00 05 00 14,将本次写入数据0x66 66 66 66 66顺序存储到所述物理页面的数据区后,所述物理页面如图3所示;
步骤105:根据本次写入数据的页内偏移地址、本次写入数据的长度和本次写入数据的存储地址生成一条索引日志,并将生成的索引日志顺序写入所述物理页面的索引区,结束;
具体地,本实施例中,索引日志为6个字节,前2个字节表示本次写入数据的页内偏移地址,中间2个字节表示本次写入数据的长度,后面2个字节表示本次写入数据的存储地址;
例如,本次写入数据的页内偏移地址为0x0005,本次写入数据的长度为5个字节,本次写入数据的存储地址为0x0019,则生成的索引日志为0x 00 05 00 05 00 19;若将本次写入数据写入所述物理页面的数据区之后的所述物理页面如图3所示,则将生成的索引日志0x 00 05 00 05 00 19顺序写入所述物理页面的索引区后的所述物理页面如图4所示。
步骤106:查找空闲页面;
具体地,本实施例中,若查找不到空闲页面则写入数据失败,结束。
步骤107:读取所述物理页面的数据区中的数据,根据所述物理页面的索引区中的索引日志和本次写入数据对读取到的数据进行组织,得到所述物理页面的数据区中的有效数据;
步骤108:将所述物理页面的数据区中的有效数据顺序写入所述空闲页面的数据区;
步骤109:根据所述物理页面的数据区中的有效数据生成索引日志,顺序写入所述空闲页面的索引区;
具体地,步骤107至步骤109包括:
步骤C1:初始化大小等于所述物理页面的数据区大小的内存空间;
例如,本实施例中,所述物理页面如图5所示,其数据区的大小为30个字节,则初始化大小为30个字节的内存空间;
本实施例中,初始化的内存空间中的数据均为0xFF;
步骤C2:顺序读取所述物理页面的索引区中的索引日志,根据索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
例如,当前索引日志为0x 00 00 00 05 00 0A,则根据当前索引日志中的写入数据的存储地址0x000A和写入数据的长度0x0005从所述物理页面的数据区中读取第11个字节到第15个字节的数据0x 33 33 33 33 33,按照当前索引日志中的写入数据的页内偏移地址0x0000将读取到的数据0x 33 33 33 33 33 33写入所述内存空间的第1个字节到第5个字节的位置;
步骤C3:按照本次写入数据的页内偏移地址将本次写入数据写入所述内存空间的相应位置;
例如,本次写入数据为0x 66 66 66 66 66,本次写入数据的页内偏移地址为0x0005,则按照本次写入数据的页内偏移地址0x0005将本次写入数据0x 66 66 66 66 66写入所述内存空间的第6个字节至第10个字节的位置;
步骤C4:遍历所述内存空间,每当查找到所述内存空间中的一块非空闲区域时,读取所述非空闲区域中的数据,将读取到的数据写入所述空闲页面的数据区,并根据读取到的数据生成一条索引日志写入所述空闲页面的索引区;
具体地,本实施例中,所述根据读取到的数据生成一条索引日志具体包括:根据读取到的数据在所述内存空间中的位置得到“写入数据的页内偏移地址”,根据读取到的数据的长度得到“写入数据的长度”,根据读取到的数据写入所述空闲页面的位置得到“写入数据的存储地址”,生成包含“写入数据的页内偏移地址”、“写入数据的长度”和“写入数据的存储地址”的索引日志;
例如,所述内存空间中共有两块非空区域(第一个字节至第五个字节和第十一个字节至第十五个字节),两块非空区域中的数据分别为:0x 11 11 11 11 11和0x 22 22 2222 22,所述空闲页面如图6所示,根据第一块非空区域中的数据生成的索引日志为0x 0000 00 05 00 00,将第一块非空区域中的数据顺序写入所述空闲页面的数据区,以及将根据第一块非空区域中的数据生成的索引日志写入所述空闲页面的索引区后,所述空闲页面如图7所示,根据第二块非空区域中的数据生成的索引日志为0x 00 0A 00 00 00 05,将第二块非空区域中的数据顺序写入所述空闲页面的数据区,以及将根据第二块非空区域中的数据生成的索引日志写入所述空闲页面的索引区后,所述空闲页面如图8所示。
步骤110:更新逻辑页号和物理页号对应关系,结束。
优选地,本实施例中,逻辑页号和物理页号对应关系通过逻辑页号物理页号映射表体现,步骤110包括:将逻辑页号物理页号映射表中与步骤101中计算得到的逻辑页号对应的物理页号更新为所述空闲页面的物理页号;
例如,本实施例中,步骤101中计算得到的逻辑页号为2,所述空闲页面的物理页号为7,原始逻辑页号物理页号映射表如下:
则更新后的逻辑页号物理页号映射表如下:
本实施例中,步骤110之后,对所述物理页面的处理流程不在本专利范畴内,其中,对所述物理页面的处理流程包括但不限于,清除所述物理页面中的数据,使之成为空闲页;进一步地,还可以设置掉电保护机制,即在步骤110之前,先将所述物理页面更新成备份页面,然后执行步骤110,待执行完步骤110后再清除所述物理页面中的数据,使之成为空闲页面。
实施例二
参见图9,本实施例二提供一种Flash的数据读取方法,本实施例二中的Flash采用实施例一中提供的方法进行数据写入;所述数据读取方法包括:
步骤201:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址;
例如,本实施例中,Flash的物理页面和逻辑页面的大小均为4KB,读取地址为0x2005,本次要读取的数据的逻辑页号=|0x2005/0x1000|=2,本次要读取的数据的页内偏移地址=0x2005-2*0x1000=0x0005。
步骤202:根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
优选地,本实施例中,逻辑页号和物理页号对应关系通过逻辑页号物理页号映射表体现,步骤202包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
例如,本实施例中,本次要读取的数据的逻辑页号为2,逻辑页号物理页号映射表如下:
则与本次要读取的数据的逻辑页号对应的物理页号为3,在Flash中查找物理页号为3的物理页面。
步骤203:根据本次要读取的数据的长度设置并复位与本次要读取的数据对应的读取标志;
具体地,本实施例中,步骤203具体包括为本次要读取的数据中的每个字节数据分别设置一个读取标志并复位;
例如,本次要读取的数据的长度为15个字节,则设置15个读取标志并复位,分别对应本次要读取的数据中的每个字节数据;
或者,本实施例中,步骤203具体包括:根据本次要读取的数据的长度设置一个总读取标志,同时设置所述总读取标志中的比特位为分读取标志并复位,分别对应本次要读取的数据中的每个字节数据;
例如,本次要读取的数据的长度为15个字节,则设置一个长度为2个字节的总读取标志,设置所述总读取标志中的15个比特位为分读取标志并复位,分别对应本次要读取的数据中的每个字节数据。
步骤204:查找并读取所述物理页面的索引区中的最后一条索引日志,作为当前索引日志;
查找所述物理页面的索引区中的最后一条索引日志的方法同实施例一中所述,在此不再赘述;
步骤205:判断当前索引日志是否涉及本次要读取的数据中读取标志未置位的数据,是则执行步骤207,否则执行步骤206;
具体地,本实施例中,步骤205具体包括:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围,判断本次要读取的数据中读取标志未置位的数据的页内偏移地址是否有在计算得到的页内偏移地址范围内的,是则当前索引日志涉及本次要读取的数据中读取标志未置位的数据,否则当前索引日志不涉及本次要读取的数据中读取标志未置位的数据;
例如,本次要读取的数据为所述物理页面的页内偏移地址0x0005至0x0013的数据,且本次要读取的数据中的每个字节数据的读取标志均未置位,当前索引日志为0x 0005 00 05 00 14,根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围为0x0005至0x0009,则当前索引日志涉及本次要读取的数据中读取标志未置位的页内偏移地址0x0005至0x0009中的数据。
步骤206:读取当前索引日志的前一条索引日志,作为当前索引日志,返回步骤205;
例如,当前索引日志为0x 00 05 00 05 00 14,当前索引日志的前一条索引日志为0x 00 00 00 05 00 0F,则将索引日志0x 00 00 00 05 00 0F作为当前日志。
步骤207:根据当前索引日志从所述物理页面中读取当前索引日志涉及到的本次要读取的数据,并置位读取到的数据对应的读取标志;
具体地,本实施例中,步骤207具体包括:根据当前索引日志中的写入数据的存储地址从所述物理页面中读取当前索引日志涉及的本次要读取的数据,并置位读取到的数据对应的读取标志;
例如,当前索引日志为0x 00 05 00 05 00 14,当前索引日志涉及的本次要读取的数据为所述物理页面的页内偏移地址0x0005至0x0009的数据,则根据当前索引日志中的写入数据的存储地址0x0014从所述物理页面中读取第21个字节到第25个字节的数据,得到所述物理页面的页内偏移地址0x0005至0x0009的数据,将本次要读取的数据中页内偏移地址为0x0005、0x0006、0x0007、0x0008和0x0009的5个字节数据分别对应的读取标志置位。
步骤208:根据本次要读取的数据的读取标志判断是否读取到全部的本次要读取的数据,是则结束,否则返回步骤206;
具体地,本实施例中,判断是否读取到全部的本次要读取的数据具体包括:判断本次要读取的数据中是否还有读取标志未置位的数据,是则没有读取到全部的本次要读取的数据,否则已读取到全部的本次要读取的数据;
或者本实施中,判断是否读取到全部的本次要读取的数据具体包括:判断总读取标志是否置位,是则已读取到全部的本次要读取的数据,否则没有读取到全部的本次要读取的数据;其中,总读取标志当各分读取标志置位后自动置位。
实施例三
参见图10,本实施例三提供一种Flash的数据读取方法,本实施例三中的Flash采用实施例一中提供的方法进行数据写入;所述数据读取方法包括:
步骤301:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址;
例如,本实施例中,Flash的物理页面和逻辑页面的大小均为4KB,读取地址为0x2005,本次要读取的数据的逻辑页号=|0x2005/0x1000|=2,本次要读取的数据的页内偏移地址=0x2005-2*0x1000=0x0005。
步骤302:根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
优选地,本实施例中,逻辑页号和物理页号对应关系通过逻辑页号物理页号映射表体现,步骤302包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
例如,本实施例中,本次要读取的数据的逻辑页号为2,逻辑页号物理页号映射表如下:
则与本次要读取的数据的逻辑页号对应的物理页号为3,在Flash中查找物理页号为3的物理页面。
步骤303:初始化大小等于所述物理页面的数据区大小的内存空间;
例如,本实施例中,所述物理页面的数据区的大小为30个字节,则初始化大小为3072个字节的内存空间;
本实施例中,初始化的内存空间中的数据均为0xFF;
步骤304:顺序读取所述物理页面的索引区中的索引日志,根据索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
具体地,本实施例中,步骤304包括:
步骤a1:顺序读取一条所述物理页面的索引区中的索引日志,作为当前索引日志;
步骤a2:按照当前索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
例如,当前索引日志为0x 00 00 00 05 00 0A,则根据当前索引日志中的写入数据的存储地址0x000A和写入数据的长度0x0005从所述物理页面的数据区中读取第11个字节到第15个字节的数据0x 33 33 33 33 33,按照当前索引日志中的写入数据的页内偏移地址0x0000将读取到的数据0x 33 33 33 33 33 33写入所述内存空间的第1个字节到第5个字节的位置;
步骤a3:判断所述物理页面的索引区中是否还有未读取的索引日志,是则返回步骤a1,否则执行步骤305;
步骤305:根据本次要读取的数据的页内偏移地址和本次要读取的数据的长度从所述内存空间中读取本次要读取的数据,结束。
例如,本次要读取的数据的页内偏移地址为0x0005,本次要读取的数据的长度为5个字节,则读取所述内存空间中的第6个字节到第10个字节,得到本次要读取的数据。
实施例四
参见图11,本实施例四提供一种Flash的数据读取方法,本实施例四中的Flash采用实施例一中提供的方法进行数据写入;所述数据读取方法包括:
步骤401:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址;
例如,本实施例中,Flash的物理页面和逻辑页面的大小均为4KB,读取地址为0x2005,本次要读取的数据的逻辑页号=|0x2005/0x1000|=2,本次要读取的数据的页内偏移地址=0x2005-2*0x1000=0x0005。
步骤402:根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
优选地,本实施例中,逻辑页号和物理页号对应关系通过逻辑页号物理页号映射表体现,步骤302包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面;
例如,本实施例中,本次要读取的数据的逻辑页号为2,逻辑页号物理页号映射表如下:
则与本次要读取的数据的逻辑页号对应的物理页号为3,在Flash中查找物理页号为3的物理页面。
步骤403:根据本次要读取的数据的页内偏移地址初始化当前页内偏移地址;
具体地,本实施例中,初始化当前页内偏移地址为本次要读取的数据的页内偏移地址;
本实施例中,步骤403中还可以包括:初始化当前计数;
具体地,本实施例中,初始化当前计数为本次要读取的数据的长度或初始化当前计数为0;
例如,本次要读取的数据的页内偏移地址为0x0005,本次要读取的数据的长度为15个字节,则初始化当前页内偏移地址为0x0005,初始化当前计数为15或0。
步骤404:查找并读取所述物理页面的索引区中的最后一条索引日志,作为当前索引日志;
查找所述物理页面的索引区中的最后一条索引日志的方法同实施例一中所述,在此不再赘述;
步骤405:判断当前索引日志是否涉及当前页内偏移地址,是则执行步骤407,否则执行步骤406;
具体地,本实施例中,步骤405具体包括:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围,判断当前页内偏移地址是否在计算得到的页内偏移地址范围内,是则当前索引日志涉及当前页内偏移地址,否则当前索引日志不涉及当前页内偏移地址;
例如,若当前索引日志为0x 00 05 00 05 00 14,则根据当前索引日志中的写入数据的页内偏移地址0x0005和写入数据的长度0x0005计算得到当期索引日志涉及的数据为所述物理页面的页内偏移地址0x0005至0x0009中的数据,如果当前页内偏移地址在0x0005至0x0009范围内,则当前索引日志涉及当前页内偏移地址,如果当前页内偏移地址不在0x0005至0x0009范围内,则当前索引日志不涉及当前页内偏移地址。
步骤406:读取当前索引日志的前一条索引日志,作为当前索引日志,返回步骤405;
步骤407:根据当前索引日志从所述物理页面中读取当前索引日志涉及到的本次要读取的数据中从当前页内偏移地址开始的数据;
具体地,本实施例中,步骤407具体包括:根据当前索引日志中的写入数据的存储地址从所述物理页面中读取当前索引日志涉及的本次要读取的数据;
例如,当前索引日志为0x 00 05 00 05 00 14,当前索引日志涉及的本次要读取的数据为所述物理页面的页内偏移地址0x0005至0x0009的数据,则根据当前索引日志中的写入数据的存储地址0x0014从所述物理页面中读取第21个字节到第25个字节的数据,得到所述物理页面的页内偏移地址0x0005至0x0009的数据。
步骤408:根据读取到的数据更新当前页内偏移地址;
具体地,本实施例中,更新当前页内偏移地址为读取到的数据中的最后一个字节数据的页内偏移地址的下一页内偏移地址;
本实施例中,步骤408中还可以包括:根据读取到的数据更新当前计数;
具体地,本实施例中,更新当前计数为其当前值减去读取到的数据的长度或更新当前计数为其当前值加上读取到的数据的长度;
例如,当前页内偏移地址为0x0000,当前计数为15或0,读取到的数据的页内偏移地址范围为0x0005至0x0009,则更新当前页内偏移地址为0x000A,更新当前计数为10或5。
步骤409:根据当前页内偏移地址判断是否读取到全部的本次要读取的数据,是则结束,否则返回步骤404;
本实施例中,根据当前页内偏移地址判断是否读取到全部的要读取的数据具体包括:计算本次要读取的数据的页内偏移地址加上本次要读取的数据的长度,判断计算结果是否小于当前页内偏移地址,是则读取到全部的要读取的数据,否则未读取到全部的要读取的数据;
或者,本实施例中,还可以根据当前计数判断是否读取到全部的要读取的数据,是则结束,否则返回步骤404;
具体地,本实施例中,根据当前计数判断是否读取到全部的要读取的数据具体包括:判断当前计数是否等于0或判断当前计数是否等于本次要读取的数据的长度,是则读取到全部的要读取的数据,否则未读取到全部的要读取的数据;
例如,本次要读取的数据的页内偏移地址为0x0005,本次要读取的数据的长度为15个字节,即本次要读取的数据的页内偏移地址加上本次要读取的数据的长度的计算结果为0x0013,则判断当前页内偏移地址是否大于0x0013,是则读取到全部的要读取的数据,否则未读取到全部的要读取的数据。
以上所述的实施例只是本发明较优选的具体实施方式,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。
Claims (35)
1.一种Flash的数据写入方法,其特征在于,包括:
S10:根据写入地址计算得到本次写入数据的逻辑页号和本次写入数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与所述本次写入数据的逻辑页号对应的物理页面;
S20:判断所述物理页面的数据区和索引区的剩余空间是否均充足,是则将本次写入数据顺序存储到所述物理页面的数据区,并根据所述本次写入数据的页内偏移地址、本次写入数据的长度和本次写入数据的存储地址生成一条索引日志,将生成的索引日志顺序写入所述物理页面的索引区,结束,否则执行S30;
S30:查找空闲页面,执行S40;
S40:读取所述物理页面的数据区中存储的数据,根据所述物理页面的索引区中的索引日志和本次写入数据对读取到的数据进行组织,得到所述物理页面的数据区中的有效数据,将所述有效数据顺序写入所述空闲页面的数据区,并根据所述有效数据生成索引日志,将生成的索引日志顺序写入所述空闲页面的索引区,执行S50;
S50:更新所述逻辑页号和物理页号对应关系。
2.根据权利要求1所述的方法,其特征在于,所述根据逻辑页号和物理页号对应关系查找与所述本次写入数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次写入数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面。
3.根据权利要求2所述的方法,其特征在于,所述更新所述逻辑页号和物理页号对应关系具体包括:将所述逻辑页号物理页号映射表中与所述本次写入数据的逻辑页号对应的物理页号更新为所述空闲页面的物理页号。
4.根据权利要求1所述方法,其特征在于,所述判断所述物理页面的数据区的剩余空间是否充足具体包括:
步骤A1:根据所述物理页面的索引区中的最后一条索引日志计算本次写入数据的存储地址;
步骤A2:计算本次写入数据的存储地址加上本次写入数据的长度,判断计算结果是否大于所述物理页面的数据区的最大页内偏移地址,是则所述物理页面的数据区的剩余空间不充足,否则所述物理页面的数据区的剩余空间充足。
5.根据权利要求4述的方法,其特征在于,所述步骤A1具体包括:查找所述物理页面的索引区中的最后一条索引日志,获取所述最后一条索引日志中的写入数据的存储地址和写入数据的长度,计算获取到的写入数据的存储地址和写入数据的长度的和,得到本次写入数据的存储地址。
6.根据权利要求1述的方法,其特征在于,所述判断所述物理页面的索引区的剩余空间是否充足具体包括:
步骤B1:计算所述物理页面的索引区的剩余空间;
步骤B2:判断所述物理页面的索引区的剩余空间是否大于一条索引日志的长度,是则所述物理页面的索引区的剩余空间充足,否则所述物理页面的索引区的剩余空间不充足。
7.根据权利要求6所述的方法,其特征在于,所述步骤B1具体包括:查找所述物理页面的索引区中的最后一条索引日志,根据所述最后一条索引日志结尾处在所述物理页面中的偏移地址得到所述物理页面的索引区已使用的字节数,计算所述物理页面的索引区的大小减去所述物理页面的索引区已使用的字节数,得到所述物理页面的索引区的剩余空间。
8.根据权利要求5或7所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志。
9.根据权利要求5或7所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
步骤a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行步骤a2;
步骤a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行步骤a3;
步骤a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回步骤a2,否则执行步骤a4;
步骤a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回步骤a2。
10.根据权利要求5或7所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
步骤b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行步骤b2;
步骤b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行步骤b3;
步骤b3:将读取到的数据之前的一个字节作为当前字节,返回步骤b2。
11.根据权利要求10所述的方法,其特征在于,所述判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则读取到的数据不是一条索引日志,否则读取到的数据是一条索引日志。
12.根据权利要求1所述的方法,其特征在于,所述S40具体包括:
步骤C1:初始化大小等于所述物理页面的数据区大小的内存空间;
步骤C2:顺序读取所述物理页面的索引区中的索引日志,根据索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
步骤C3:按照本次写入数据的页内偏移地址将本次写入数据写入所述内存空间的相应位置;
步骤C4:遍历所述内存空间,每当查找到所述内存空间中的一块非空闲区域时,读取所述非空闲区域中的数据,将读取到的数据写入所述空闲页面的数据区,并根据读取到的数据生成一条索引日志写入所述空闲页面的索引区。
13.一种Flash的数据读取方法,其特征在于,包括:
T10:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
T20:根据本次要读取的数据的长度设置并复位与本次要读取的数据对应的读取标志;
T30:查找并读取所述物理页面的索引区中的最后一条索引日志,作为当前索引日志;
T40:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度判断当前索引日志是否涉及本次要读取的数据中读取标志未置位的数据,是则执行T60,否则执行T50;
T50:读取当前索引日志的前一条索引日志,作为当前索引日志,返回T40;
T60:根据当前索引日志中的写入数据的存储地址从所述物理页面中读取涉及到的数据,并将与读取到的数据对应的读取标志置位;
T70:检查与本次要读取的数据对应的读取标志,判断是否读取到全部的本次要读取的数据,是则结束,否则返回T50。
14.根据权利要求13所述的方法,其特征在于,所述根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面。
15.根据权利要求13所述的方法,其特征在于,所述T20具体包括:设置并复位个数等于本次要读取的数据的长度的读取标志,分别对应本次要读取的数据中的每个字节数据。
16.根据权利要求13所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志。
17.根据权利要求13所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行a2;
a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行a3;
a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回a2,否则执行a4;
a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回a2。
18.根据权利要求13所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行b2;
b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行b3;
b3:将读取到的数据之前的一个字节作为当前字节,返回b2。
19.根据权利要求18所述的方法,其特征在于,所述判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则读取到的数据不是一条索引日志,否则读取到的数据是一条索引日志。
20.根据权利要求13所述的方法,其特征在于,所述T40具体包括:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围,判断本次要读取的数据中读取标志未置位的数据的页内偏移地址是否有在计算得到的页内偏移地址范围内的,是则当前索引日志涉及本次要读取的数据中读取标志未置位的数据,执行T60,否则前索引日志不涉及本次要读取的数据中读取标志未置位的数据,执行T50。
21.根据权利要求13所述的方法,其特征在于,所述T70具体包括:判断与本次要读取的数据对应的读取标志是否均置位,是则读取到全部的本次要读取的数据,结束,否则没有读取到全部的本次要读取的数据,返回T50。
22.一种Flash的数据读取方法,其特征在于,包括:
U10:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
U20:初始化大小等于所述物理页面的数据区大小的内存空间;
U30:顺序读取所述物理页面的索引区中的索引日志,根据读取到的索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照读取到的索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
U40:根据本次要读取的数据的页内偏移地址和本次要读取的数据的长度从所述内存空间中读取本次要读取的数据,结束。
23.根据权利要求22所述的方法,其特征在于,所述根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面。
24.根据权利要求22所述的方法,其特征在于,所述U30具体包括:
c1:顺序读取一条所述物理页面的索引区中的索引日志,作为当前索引日志;
c2:按照当前索引日志中的写入数据的存储地址和写入数据的长度从所述物理页面的数据区中读取相应的数据,按照索引日志中的写入数据的页内偏移地址将读取到的数据写入所述内存空间的相应位置;
c3:判断所述物理页面的索引区中是否还有未读取的索引日志,是则返回c1,否则执行U40。
25.一种Flash的数据读取方法,其特征在于,包括:
V10:根据读取地址计算本次要读取的数据的逻辑页号和本次要读取的数据的页内偏移地址,根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面;
V20:根据本次要读取的数据的页内偏移地址初始化当前页内偏移地址;
V30:查找并读取所述物理页面的索引区中的最后一条索引日志,作为当前索引日志,执行V40;
V40:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度判断当前索引日志是否涉及当前页内偏移地址,是则执行V60,否则执行V50;
V50:读取当前索引日志的前一条索引日志,作为当前索引日志,返回V40;
V60:根据当前索引日志中的写入数据的存储地址从所述物理页面的数据区中读取当前索引日志涉及到的本次要读取的数据中从当前页内偏移地址开始的数据,并根据读取到的数据更新当前页内偏移地址,执行V70;
V70:判断是否读取到全部的本次要读取的数据,是则结束,否则返回V30。
26.根据权利要求25所述的方法,其特征在于,所述根据逻辑页号和物理页号对应关系查找与本次要读取的数据的逻辑页号对应的物理页面具体包括:查询逻辑页号物理页号映射表,得到与本次要读取的数据的逻辑页号对应的物理页号,在Flash中查找物理页号为所述物理页号的物理页面。
27.根据权利要求25所述的方法,其特征在于,所述根据本次要读取的数据的页内偏移地址初始化当前页内偏移地址具体包括:初始化当前页内偏移地址为本次要读取的数据的页内偏移地址;
所述根据读取到的数据更新当前页内偏移地址具体包括:更新当前页内偏移地址为读取到的数据中的最后一个字节数据对应的页内偏移地址的下一页内偏移地址;
所述判断是否读取到全部的本次要读取的数据具体包括:计算本次要读取的数据的页内偏移地址加上本次要读取的数据的长度,判断计算结果是否小于当前页内偏移地址,是则读取到全部的要读取的数据,否则未读取到全部的要读取的数据。
28.根据权利要求25所述的方法,其特征在于,所述V20中还包括:初始化当前计数;
所述V60中,所述根据当前索引日志中的写入数据的存储地址从所述物理页面的数据区中读取当前索引日志涉及到的本次要读取的数据中从当前页内偏移地址开始的数据,之后还包括:根据读取到的数据更新当前计数;
所述V70具体包括:判断当前计数是否等于预设值,是则读取到全部的本次要读取的数据,否则没有读取到全部的本次要读取的数据。
29.根据权利要求28所述的方法,其特征在于,所述初始化当前计数具体包括:初始化当前计数为本次要读取的数据的长度;
所述根据读取到的数据更新当前计数具体包括:更新当前计数为其当前值减去读取到的数据的长度;
所述判断当前计数是否等于预设值具体包括:判断当前计数是否等于0。
30.根据权利要求28所述的方法,其特征在于,所述初始化当前计数具体包括:初始化当前计数为0;
所述根据读取到的数据更新当前计数具体包括:更新当前计数为其当前值加上读取到的数据的长度;
所述判断当前计数是否等于预设值具体包括:判断当前计数是否等于本次要读取的数据的长度。
31.根据权利要求25所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:遍历所述物理页面的索引区,当查找到连续的不少于预设个数的值为预设值的字节数据时,确定这些字节数据之前的索引日志为所述物理页面的索引区中的最后一条索引日志。
32.根据权利要求25所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
a1:定位所述物理页面的索引区中有效存储空间的首字节和末字节,将所述首字节作为当前起始字节、所述末字节作为当前结尾字节,执行a2;
a2:定位所述当前起始字节到所述当前结尾字节的中间字节,作为当前中间字节,执行a3;
a3:从当前中间字节之后的一个字节开始,向后读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则将当前中间字节作为当前起始字节,返回a2,否则执行a4;
a4:从当前中间字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则将当前中间字节作为当前结尾字节,返回a2。
33.根据权利要求25所述的方法,其特征在于,所述查找所述物理页面的索引区中的最后一条索引日志具体包括:
b1:定位所述物理页面的索引区中有效存储空间的末字节,将所述末字节作为当前字节,执行b2;
b2:从当前字节开始,向前读取长度等于一条索引日志的长度的数据,判断读取到的数据是否为一条索引日志,是则读取到的数据为所述物理页面的索引区中的最后一条索引日志,否则执行b3;
b3:将读取到的数据之前的一个字节作为当前字节,返回b2。
34.根据权利要求33所述的方法,其特征在于,所述判断读取到的数据是否为一条索引日志具体包括:判断读取到的数据的每个字节是否均为预设值,是则判定读取到的数据不是一条索引日志,否则判定读取到的数据是一条索引日志。
35.根据权利要求25所述的方法,其特征在于,所述根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度判断当前索引日志是否涉及当前页内偏移地址,具体包括:根据当前索引日志中的写入数据的页内偏移地址和写入数据的长度计算得到当前索引日志涉及的页内偏移地址范围,判断当前页内偏移地址是否在计算得到的页内偏移地址范围内,是则当前索引日志涉及当前页内偏移地址,否则当前索引日志不涉及当前页内偏移地址。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410024168.6A CN103729303B (zh) | 2014-01-20 | 2014-01-20 | 一种Flash的数据写入和读取方法 |
PCT/CN2014/094668 WO2015096698A1 (zh) | 2013-12-24 | 2014-12-23 | 一种Flash的数据写入和读取方法 |
US15/107,326 US10228875B2 (en) | 2013-12-24 | 2014-12-23 | Data writing and reading methods for flash |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410024168.6A CN103729303B (zh) | 2014-01-20 | 2014-01-20 | 一种Flash的数据写入和读取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103729303A CN103729303A (zh) | 2014-04-16 |
CN103729303B true CN103729303B (zh) | 2017-03-29 |
Family
ID=50453384
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410024168.6A Expired - Fee Related CN103729303B (zh) | 2013-12-24 | 2014-01-20 | 一种Flash的数据写入和读取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103729303B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10228875B2 (en) | 2013-12-24 | 2019-03-12 | Feitian Technologies Co., Ltd. | Data writing and reading methods for flash |
WO2017015891A1 (zh) * | 2015-07-29 | 2017-02-02 | 深圳市锐明技术股份有限公司 | 一种监控数据的写入方法及装置 |
CN107315543B (zh) * | 2017-07-03 | 2020-10-09 | 合肥联宝信息技术有限公司 | 一种对ec的存储器中数据的读写方法及装置 |
CN107832234B (zh) * | 2017-08-07 | 2020-07-03 | 北京时代民芯科技有限公司 | 一种用于nand flash的日志块快速命中方法 |
CN107678980B (zh) * | 2017-10-19 | 2021-04-16 | 歌尔科技有限公司 | 数据存储方法、装置及可穿戴设备 |
CN107608639A (zh) * | 2017-10-20 | 2018-01-19 | 深圳益邦阳光有限公司 | 基于闪存的队列式循环存储方法、电子设备和存储介质 |
CN108334457B (zh) * | 2018-02-12 | 2020-06-30 | 杭州宏杉科技股份有限公司 | 一种io处理方法及装置 |
CN108694129B (zh) * | 2018-03-22 | 2021-06-22 | 霍尼韦尔环境自控产品(天津)有限公司 | 确定Flash存储器的存储区中最后写入位置的方法 |
CN108710578B (zh) * | 2018-04-20 | 2022-07-26 | 深圳市战音科技有限公司 | 基于闪存的数据存储方法和装置 |
CN108875075A (zh) * | 2018-07-09 | 2018-11-23 | 深圳市道通智能航空技术有限公司 | 无人机系统日志的存储方法及无人机图传系统 |
CN109273035B (zh) * | 2018-08-02 | 2020-03-17 | 北京知存科技有限公司 | 闪存芯片的控制方法、终端 |
CN111352594B (zh) * | 2020-03-12 | 2023-06-20 | 湖州旻合科技有限公司 | eFuse中写入数据、读取数据的方法及装置 |
CN111913890B (zh) * | 2020-08-13 | 2024-06-11 | 北京万协通信息技术有限公司 | 一种基于安全模组的非易失存储器随机化读写方法 |
CN112052193B (zh) * | 2020-09-28 | 2023-04-07 | 成都佰维存储科技有限公司 | 一种垃圾回收方法、装置、可读存储介质及电子设备 |
CN113157212B (zh) * | 2021-04-23 | 2023-02-28 | 歌尔股份有限公司 | Flash存储方法、装置、智能穿戴设备及存储介质 |
CN114327292B (zh) * | 2021-12-31 | 2024-02-02 | 上海移为通信技术股份有限公司 | 文件管理方法、系统、电子设备和存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102279805A (zh) * | 2011-09-06 | 2011-12-14 | 四川九洲电器集团有限责任公司 | 一种存储器数据存放及读取方法 |
CN103389881A (zh) * | 2012-05-08 | 2013-11-13 | 索尼公司 | 控制装置、存储装置以及数据写入方法 |
US8589620B2 (en) * | 2010-12-24 | 2013-11-19 | Phison Electronics Corp. | Data writing method, memory controller, and memory storage apparatus |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101799783A (zh) * | 2009-01-19 | 2010-08-11 | 中国人民大学 | 一种数据存储处理方法、查找方法及其装置 |
-
2014
- 2014-01-20 CN CN201410024168.6A patent/CN103729303B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8589620B2 (en) * | 2010-12-24 | 2013-11-19 | Phison Electronics Corp. | Data writing method, memory controller, and memory storage apparatus |
CN102279805A (zh) * | 2011-09-06 | 2011-12-14 | 四川九洲电器集团有限责任公司 | 一种存储器数据存放及读取方法 |
CN103389881A (zh) * | 2012-05-08 | 2013-11-13 | 索尼公司 | 控制装置、存储装置以及数据写入方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103729303A (zh) | 2014-04-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103729303B (zh) | 一种Flash的数据写入和读取方法 | |
WO2015096698A1 (zh) | 一种Flash的数据写入和读取方法 | |
CN113196260B (zh) | 能够选择性使用键部分的键值存储树 | |
US20200065256A1 (en) | Logical to physical memory address mapping tree | |
EP2605142B1 (en) | Lba bitmap usage | |
CN105242871B (zh) | 一种数据写入方法及装置 | |
JP5184462B2 (ja) | ページ−ディファレンシャルを使用して、dbmsに独立的な方法でフラッシュメモリーにデータを格納する方法 | |
CN103140840B (zh) | 数据管理的方法及装置 | |
CN104090730B (zh) | 一种对存储设备进行数据读写的方法及装置 | |
CN108733510A (zh) | 数据储存装置及映射表重建方法 | |
KR101428189B1 (ko) | 비휘발성 메모리를 갖는 시스템을 위한 고속 트리 플래트닝 | |
KR20210058988A (ko) | 키-값 저장 트리 데이터 블록의 카운터 기반 압축 | |
CN101446921B (zh) | 一种Flash存储器的动态存储方法 | |
US8412881B2 (en) | Modified B+ tree to store NAND memory indirection maps | |
CN103186617B (zh) | 一种存储数据的方法和装置 | |
US20120110300A1 (en) | Data management method, memory controller and memory storage apparatus | |
CN103229164A (zh) | 数据访问方法和装置 | |
CN110018971A (zh) | 缓存替换技术 | |
CN102521146B (zh) | 一种flash存储器块细分的数据寻址存储方法 | |
CN103020323B (zh) | 一种基于未知长度二分查找的闪存数据检索存储的方法 | |
CN111737162A (zh) | 一种快速恢复数据的固态硬盘使用方法及计算机可读存储介质 | |
CN107273306A (zh) | 一种固态硬盘的数据读取、数据写入方法及固态硬盘 | |
CN202443462U (zh) | 辅助上位机检索页映射单元块中空闲块的装置 | |
TW201040717A (en) | Flash memory managing methods and computing systems utilizing the same | |
CN102591782A (zh) | 一种采用三级地址查找表的Nandflash存储系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170329 |