CN101526922A - 一种闪存的数据存取方法及装置 - Google Patents
一种闪存的数据存取方法及装置 Download PDFInfo
- Publication number
- CN101526922A CN101526922A CN200910106393A CN200910106393A CN101526922A CN 101526922 A CN101526922 A CN 101526922A CN 200910106393 A CN200910106393 A CN 200910106393A CN 200910106393 A CN200910106393 A CN 200910106393A CN 101526922 A CN101526922 A CN 101526922A
- Authority
- CN
- China
- Prior art keywords
- memory
- data
- flash memory
- sram
- order
- 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
Images
Abstract
本发明适用于数据存储领域,提供了一种闪存的数据存取方法和装置,所述方法包括下述步骤:将闪存中的数据加载至内存,读取静态存储器中存储的修改命令;对内存中的数据执行修改命令后,将内存中的数据拷贝至闪存,并清空静态存储器中存储的修改命令;在对内存中的数据执行修改命令时,将修改命令保存至静态存储器;当静态存储器满时,直接将内存中的数据拷贝到闪存,并清空SRAM中存储的修改命令。本发明实施例通过将对内存中的数据执行的修改命令存储至SRAM中,并在SRAM满时,将内存中的数据拷贝至闪存,从而较大程度上降低了对闪存的擦写频率,延长了闪存的使用寿命。
Description
技术领域
本发明属于数据存储领域,尤其涉及一种闪存的数据存储方法及装置。
背景技术
在嵌入式产品中,特别是带有嵌入式操作系统的工控产品中,通常采用非易失性闪存(FLASH)作为存储器,来存储程序或者中间数据,以降低产品的功耗和成本,提高产品的性能和质量。现有的闪存的数据存取方法一般如下:先根据闪存的物理结构将闪存划分为一个以上的段,并给予每个段唯一编号,在每段内划分一个以上的逻辑块,并在段内给予每个逻辑块唯一编号,闪存的基本读写方式是以页为单位写入,以块为单位擦除,且必须在擦除之后才能写入数据,对闪存中段的擦除是循环交替进行的,通过设计合理的文件系统算法,使闪存中每一段的擦除次数相同,从而实现对闪存的均匀磨损和断电保护,可以有效延长闪存的使用寿命。
但由于闪存的基本读写方式是以页为单位写入,以块为单位擦除,且必须在擦除之后才能写入数据,而闪存的可擦除次数是有限的,一般为100000到1000000次,当闪存中的某个位被擦除的次数达到极限值(一般为100000到1000000次)后,闪存的该位就无法再被擦除,这样即使有文件系统的优化保护,但当对闪存的擦写较频繁时,还是会减少闪存的使用寿命。
发明内容
本发明实施例的目的在于提供一种闪存的数据存取方法,旨在解决现有的闪存的数据存取方法对闪存的擦写次数过多而减少闪存的使用寿命的问题。
本发明实施例是这样实现的,一种闪存的数据存取方法,所述方法包括下述步骤:
将闪存中的数据加载至内存;
读取静态存储器中存储的修改命令,对内存中的数据执行所述修改命令,将内存中的数据拷贝至闪存,并清空静态存储器中存储的修改命令;
在对内存中的数据执行修改命令时,将所述修改命令保存至静态存储器;
当所述静态存储器已满时,将内存中的数据拷贝至闪存。
本发明实施例的另一目的在于提供一种闪存的数据存取装置,所述装置包括:
数据加载单元,用于将闪存中的数据加载至内存;
修改命令存储单元,用于将对内存中的数据的修改命令保存至静态存储器;
修改命令读取单元,用于在系统启动时,读取所述静态存储器中存储的修改命令;
数据拷贝单元,用于对内存中的数据执行所述修改命令读取单元读取的修改命令,得到更新后的数据,并将更新后的数据拷贝至闪存,或者在所述静态存储器满时,将内存中的数据拷贝至闪存。
在本发明实施例中,将闪存中的数据加载至内存,读取SRAM中存储的修改命令,对内存中的数据执行这些修改命令后,将内存中的数据拷贝至闪存,清空SRAM中存储的修改命令,在对内存中的数据执行修改命令,得到更新后的数据时,将该修改命令存储至SRAM,当SRAM满时,将内存中的数据拷贝至闪存,并清空SRAM中存储的修改命令,从而在保证闪存中的数据的准确性的同时,减少了对闪存的擦写频率,延长了闪存的使用寿命。
附图说明
图1是本发明实施例提供的闪存的数据存取方法的实现流程图;
图2是本发明实施例提供的闪存的数据存取装置的结构框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明实施例中,将闪存中的数据加载至内存,读取SRAM中存储的修改命令,对内存中的数据执行这些修改命令后,将内存中的数据拷贝至闪存,清空SRAM中存储的修改命令,在对内存中的数据执行修改命令,得到更新后的数据时,将该修改命令存储至SRAM,当SRAM满时,将内存中的数据拷贝至闪存,并清空SRAM中存储的修改命令,从而减少了对闪存的擦写频率,延长了闪存的使用寿命。
图1示出了本发明实施例提供的闪存的数据存取方法的实现流程,详述如下:
在步骤S101中,对静态存储器(Static RAM)进行初始化,将SRAM初始化为可访问状态。
在本发明实施例中,仅在第一次使用该方法对闪存的数据进行存取时需要对静态存储器进行初始化。需要对SRAM进行的初始化包括设置SRAM的空间用途和将SRAM映射到内存的某一地址。
其中设置SRAM的空间用途是为了避免SRAM中的数据存储混乱而造成的系统性能的下降。在设置SRAM的空间用途时,可以根据系统的需要,灵活的设置,举例说明如下,但设置SRAM的空间用途的方式不以该举例说明为限:
将该SRAM的空间设置为两部分,其中一部分用于保存修改命令,称为修改命令存储区,另一部分用于保存当前SRAM中有效修改命令的条数,称为命令总数存储区。为了后续的扩展应用,在设置SRAM的空间用途时,也可以将该SRAM的空间设置为三部分,分别为修改命令存储区、命令总数存储区和保留区,其中保留区备后续使用。其它则没有限定,若需要划分为更多部分也可以,根据具体的环境而定。当然,还可以根据整个系统的需要来设置SRAM的控件用途。其中每个存储区的大小可以根据每个存储区需要存储的数据量来确定,如:假设SRAM的空间总大小为256K,则可以按照如下方式设置SRAM的空间用途:
将SRAM的前1K的设置为命令总数存储区,用于保存当前SRAM中有效修改命令的条数;将SRAM的中间240K设置为修改命令存储区,用于存储对加载至内存中的数据的执行的修改命令;将SRAM的剩余空间设置为保留区,以备后用。
将SRAM映射到内存的某一地址是为了可以对SRAM进行读写操作。其具体过程如下:
先执行SRAM的硬件驱动程序,实现MMAP函数以将SRAM映射到内存的某一地址,并对SRAM控制寄存器的相关参数进行设置。其中,实现MMAP函数只需调用如下内核函数即可:
remap_page_range(vm->vm_start,SRAM_ADDR_START+(vm->vm_pgoff<<PAGE_SHIFT),SRAM_ADDR_SIZE,vm->vm_page_prot)
其中需要设置的SRAM控制寄存器为硬件中SRAM所使用的是第几个通道,如SMCBCR2,地址为0xf0080008。根据SRAM的读写单元的长度,设置SRAM控制寄存器的数据长度,在本发明实施例中,以SRAM的读写长度为16位为例,进行说明。此时将SRAM控制寄存器的数据长度设置为16位,并将其总线占用周期数设置为6到8区间内的任意值,以使该闪存的数据存储达到最佳效果。在本发明实施例中,当SRAM控制寄存器的总线占用周期数太长,如设置为大于8时,根据测试,将影响其它部件的正常运转,其外在表现是每次读取SRAM时,将造成屏幕闪烁。
执行了SRAM硬件驱动程序后,通过在应用程序里调用如下系统函数:(INT16U*)mmap(NULL,TOTAL_SRAM,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0),即可获得SRAM映射到内存中的虚拟地址的首地址,从而将SRAM初始化为可访问状态。
在步骤S102中,将闪存中的数据加载至内存,并读取SRAM中的修改命令,对加载至内存中的数据执行读取的修改命令,得到更新后的数据。
在本发明实施例中,在系统启动后,先将闪存中的数据加载至内存,此时,如果SRAM中存储有修改命令,则读取SRAM中存储的修改命令,并对加载至内存中的数据执行读取的修改命令,得到更新后的数据。
在步骤S103中,将更新后的数据拷贝至闪存,并清空SRAM中存储的修改命令。
在本发明实施例中,对加载至内存中的数据执行读取的修改命令,得到更新后的数据,并将更新后的数据拷贝至闪存后,从而保证闪存中的数据就是最新的数据,最后清除SRAM中存储的所有修改命令。
在步骤S104中,在对内存中的数据执行修改命令,得到更新后的数据时,将该修改命令保存至SRAM。
当对内存中的数据执行修改命令时,将该修改命令存储至SRAM。在本发明实施例中,当SRAM的读写单元为16位时,将修改命令存储至SRAM的步骤具体如下:
先对修改命令的字符串进行拆分,将修改命令的字符串中每两个字符转换成ASCII码后组合成一个16位的无符号数,然后写入SRAM。由于修改命令的字符串中字符个数可能是奇数个,也可能是偶数个。修改命令的字符串中字符个数为奇数个时,将修改命令的字符串的最后一个字符和结束标志字符‘\0’进行组合后,写入SRAM中;修改命令的字符串中字符个数为偶数个时,在修改命令的字符串后写入由两个结束标志字符‘\0’组合而成的16位无符号数,以标志修改命令结束。
在将修改命令写入SRAM时,可以采用日志结构,举例说明如下:
//获得正确的写入地址
INT32U addr=ORDER_START+VALUE(ORDER_NUMBER_START)*REC_UNIT;
//每一个写入单元都是半字,即2个字节
addr/=2;
INT16U length=strlen(order);
//检查修改命令的字符串是否过长
if(length>REC_UNIT-1)
{return;}
memcpy((INT8U*)(pVirtualAddress+addr),order,length+1);
通过上述步骤即可将对内存中的数据的修改命令存储至SRAM中。
在步骤S105中,检测SRAM是否已满,如果否,继续检测SRAM是否已满,直到检测到SRAM已满时,执行步骤S106。
在本发明实施例中,由于预先设置了SRAM的空间用途,其中修改命令存储区用于存储对内存中的数据执行的修改命令,因此,在检测SRAM是否已满时,可以直接检测该SRAM的修改命令存储区是否被写满,如果是,则判定SRAM已满,否则,判定SRAM未满。
在步骤S106中,将内存中的数据拷贝至闪存中。在本发明实施例中,由于在对从闪存加载至内存中的数据执行修改命令时,并不是每一条命令执行完毕,就将内存中的数据拷贝至闪存,而是在对从闪存加载至内存中的数据执行修改命令时,将该修改命令存储至SRAM中,当SRAM中被存满时,才将内存中的数据拷贝至闪存,保证闪存中的数据是最新的数据的同时,减少了对闪存的擦写次数,从而延长了闪存的使用寿命。
在本发明另一实施例中,在将内存中的数据拷贝至闪存后,清空SRAM中存储的修改命令,以释放空间,存储后续的修改命令。
在本发明实施例中,当SRAM未被存满,而由于外在因素,如断电、系统程序结束等而造成的内存中的数据丢失时,由于在SRAM未满时,没有将内存中的数据拷贝至闪存中,从而造成闪存中的数据可能不准确。但由于对内存中的数据执行修改命令时,已将该修改命令保存至SRAM中,由于SRAM具有快速、无限次、可随机访问等特点,并且用电池供电可以确保在系统关闭外置电源后数据依然存在的特点,从而在系统断电后,SRAM中依然保存有对内存中的数据执行的修改命令,从而通过在每次系统启动时,先将闪存中的数据加载至内存,并从SRAM中读取修改命令,对加载至内存中的数据执行读取的修改命令,得到更新后的数据后,将得到的更新后的数据拷贝至闪存以后,再执行步骤S103,即可在保证闪存的数据的准确性的同时,减少对闪存的擦写频率,延长闪存的使用寿命。
图2示出了本发明实施例提供的闪存的数据存取装置的结构,为了便于说明,仅示出了与本发明实施例相关的部分。其中:
初始化单元21对SRAM进行初始化,将SRAM初始化为可访问状态。在本发明实施例中,对SRAM进行的初始化包括设置SRAM的空间用途和将SRAM映射到内存的某一地址。
其中设置SRAM的空间用途是为了避免SRAM中的数据存储混乱而造成的系统性能的下降。在设置SRAM的空间用途时,可以根据系统的需要,灵活的设置,举例说明如下,但设置SRAM的空间用途的方式不以该举例说明为限,将该SRAM的空间设置为三部分,分别为命令总数存储区、修改命令存储区和保留区。其中命令总数存储区用于存储SRAM中存储的有效修改命令的条数,数据存储区用于存储修改命令,保留区备用。
将SRAM映射到内存的某一地址是为了可以对SRAM进行读写操作,其具体过程如上所述,在此不再赘述。
数据加载单元22在系统启动后,将闪存中的数据加载至内存。
修改命令存储单元23将对内存中的数据执行的修改命令保存至SRAM。
在本发明实施例中,当静态存储器的读写单元为16位时,该修改命令存储单元23包括字符串拆分模块231和命令写入模块232,其中字符串拆分模块231对修改命令的字符串进行拆分,将修改命令的字符串中每两个字符转换成ASCII码后组合成一个16位的无符号数,命令写入模块232在修改命令的字符串中字符个数为奇数个时,将修改命令的字符串的最后一个字符和结束标志字符‘\0’进行组合后,写入SRAM中;在修改命令的字符串中字符个数为偶数个时,在修改命令的字符串后写入由两个结束标志字符‘\0’组合而成的16位无符号数,以标志修改命令结束。
修改命令读取单元24在系统启动时,从SRAM读取所有修改命令。
数据拷贝单元25对内存中的数据执行修改命令读取单元23读取的所有修改命令,得到新的数据,并将得到的新的数据拷贝至闪存,或者在静态存储器满时,将内存中的数据拷贝至闪存。
在本发明实施例中,由于外在因素,如断电、系统程序结束等原因,而造成由于SRAM未被存满,没有将内存中的数据及时拷贝至闪存中,内存中的数据已经丢失的情况,此时,为了保证闪存中数据的准确性,在每次系统启动时,先通过数据加载单元22将闪存中的数据加载至内存,再通过修改命令读取单元24从SRAM中读取所有修改命令,通过数据拷贝单元25对数据加载单元22加载至内存中的数据执行修改命令读取单元23读取的所有修改命令,得到新的数据,并将得到的新的数据拷贝至闪存。
在本发明另一实施例中,该装置还包括清空单元26,该清空单元26在数据拷贝单元25将得到的更新后的数据拷贝至闪存,并在数据拷贝单元25将内存中的数据拷贝至闪存后,清空SRAM中存储的修改命令,以释放空间,存储以后的修改命令。
在本发明实施例中,将闪存中的数据加载至内存,读取SRAM中存储的修改命令,对内存中的数据执行这些修改命令后,将内存中的数据拷贝至闪存,清空SRAM中存储的修改命令,在对内存中的数据执行修改命令,得到更新后的数据时,将该修改命令存储至SRAM,当SRAM满时,将内存中的数据拷贝至闪存,并清空SRAM中存储的修改命令,从而在保证闪存中的数据的准确性的同时,减少了对闪存的擦写频率,延长了闪存的使用寿命。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (8)
1、一种闪存的数据存取方法,其特征在于,所述方法包括下述步骤:
将闪存中的数据加载至内存;
读取静态存储器中存储的修改命令,对内存中的数据执行所述修改命令,将内存中的数据拷贝至闪存,并清空静态存储器中存储的修改命令;
在对内存中的数据执行修改命令时,将所述修改命令保存至静态存储器;
当所述静态存储器已满时,将内存中的数据拷贝至闪存。
2、如权利要求1所述的方法,其特征在于,所述方法还包括下述步骤:
对静态存储器进行初始化,将所述静态存储器初始化为可访问状态。
3、如权利要求2所述的方法,其特征在于,所述对静态存储器的初始化包括设置所述静态存储器的空间用途和将所述静态存储器映射到内存的某一地址。
4、如权利要求3所述的方法,其特征在于,所述设置所述静态存储器的空间用途的步骤具体为:
将所述静态存储器的空间设置为用于存储修改命令条数的命令总数存储区、用于存储修改命令的修改命令存储区和用于备用的保留区。
5、如权利要求1至4任一权利要求所述的方法,其特征在于,在所述步骤当所述静态存储器已满时,将内存中的数据拷贝至闪存之后,所述方法还包括下述步骤:
清空所述静态存储器中存储的修改命令。
6、一种闪存的数据存取装置,其特征在于,所述装置包括:
数据加载单元,用于将闪存中的数据加载至内存;
修改命令存储单元,用于将对内存中的数据的修改命令保存至静态存储器;
修改命令读取单元,用于在系统启动时,读取所述静态存储器中存储的修改命令;
数据拷贝单元,用于对内存中的数据执行所述修改命令读取单元读取的修改命令,得到更新后的数据,并将更新后的数据拷贝至闪存,或者在所述静态存储器满时,将内存中的数据拷贝至闪存。
7、如权利要求6所述的装置,其特征在于,所述装置还包括:
初始化单元,用于对所述静态存储器进行初始化,将所述静态存储器初始化为可访问状态。
8、如权利要求6或7所述的装置,其特征在于,所述装置还包括:
清空单元,用于在所述数据拷贝单元将得到的更新后的数据或者内存中的数据拷贝至闪存后,清空所述静态存储器中存储的修改命令。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101063933A CN101526922B (zh) | 2009-04-03 | 2009-04-03 | 一种闪存的数据存取方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101063933A CN101526922B (zh) | 2009-04-03 | 2009-04-03 | 一种闪存的数据存取方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101526922A true CN101526922A (zh) | 2009-09-09 |
CN101526922B CN101526922B (zh) | 2011-09-07 |
Family
ID=41094792
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101063933A Expired - Fee Related CN101526922B (zh) | 2009-04-03 | 2009-04-03 | 一种闪存的数据存取方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101526922B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763426B (zh) * | 2010-01-08 | 2011-12-28 | 浙江大学 | 一种实现文件分配表文件系统可靠性的方法和装置 |
CN103369284A (zh) * | 2012-03-31 | 2013-10-23 | 浙江大华技术股份有限公司 | 一种音视频数据预录方法及装置 |
CN105843711A (zh) * | 2016-06-21 | 2016-08-10 | 北京飞杰信息技术有限公司 | 数据防掉电保护方法及系统 |
CN111273868A (zh) * | 2020-01-19 | 2020-06-12 | 西安奥卡云数据科技有限公司 | 一种全闪存阵列垃圾回收减少写放大的方法 |
CN113448639A (zh) * | 2021-08-27 | 2021-09-28 | 阿里云计算有限公司 | 用户配置变量区的访问方法、装置、设备和存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6675281B1 (en) * | 2002-01-22 | 2004-01-06 | Icreate Technologies Corporation | Distributed mapping scheme for mass storage system |
CN1277213C (zh) * | 2004-12-31 | 2006-09-27 | 大唐微电子技术有限公司 | 一种闪存文件系统管理方法 |
CN101071362A (zh) * | 2006-05-11 | 2007-11-14 | 安国国际科技股份有限公司 | 一种通过通用序列总线读写储存装置的方法 |
CN101211314B (zh) * | 2006-12-31 | 2010-07-14 | 创惟科技股份有限公司 | 闪存资料读写寿命提升方法 |
-
2009
- 2009-04-03 CN CN2009101063933A patent/CN101526922B/zh not_active Expired - Fee Related
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763426B (zh) * | 2010-01-08 | 2011-12-28 | 浙江大学 | 一种实现文件分配表文件系统可靠性的方法和装置 |
CN103369284A (zh) * | 2012-03-31 | 2013-10-23 | 浙江大华技术股份有限公司 | 一种音视频数据预录方法及装置 |
CN105843711A (zh) * | 2016-06-21 | 2016-08-10 | 北京飞杰信息技术有限公司 | 数据防掉电保护方法及系统 |
CN111273868A (zh) * | 2020-01-19 | 2020-06-12 | 西安奥卡云数据科技有限公司 | 一种全闪存阵列垃圾回收减少写放大的方法 |
CN113448639A (zh) * | 2021-08-27 | 2021-09-28 | 阿里云计算有限公司 | 用户配置变量区的访问方法、装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN101526922B (zh) | 2011-09-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101425041B (zh) | 在nand flash存储器上建立fat文件系统的优化方法 | |
CN102081577B (zh) | 对Flash存储器的数据存储结构进行数据操作的方法 | |
US8041884B2 (en) | Controller for non-volatile memories and methods of operating the memory controller | |
CN109643275B (zh) | 存储级存储器的磨损均衡设备和方法 | |
US8954648B2 (en) | Memory device and operating method thereof | |
CN1900919B (zh) | 包括多个块的闪速存储器 | |
CN100533408C (zh) | 一种闪存的安全读写方法 | |
CN102737715B (zh) | 用于nor闪存的数据掉电保护方法 | |
CN101656106B (zh) | 一种向eeprom写入数据的方法及装置 | |
CN105630405B (zh) | 一种存储系统及采用该存储系统的读写方法 | |
TWI473100B (zh) | Flash memory system and its operation method | |
CN101673245A (zh) | 包括存储器管理装置的信息处理装置和存储器管理方法 | |
WO2009015285A1 (en) | Hybrid nonvolatile ram | |
CN101324862B (zh) | 闪存存储管理方法 | |
CN103946819A (zh) | 用于非易失性系统存储器的统计耗损均衡 | |
WO2009015309A1 (en) | Power interrupt recovery in a hybrid memory subsystem | |
CN101526922B (zh) | 一种闪存的数据存取方法及装置 | |
CN101156129A (zh) | 将数据块存储到多个非易失存储器的闪存块的方法和系统 | |
JP2005301591A (ja) | 不揮発性メモリを備えた装置及びメモリコントロ−ラ | |
CN101625897B (zh) | 用于快闪存储器的数据写入方法、储存系统与控制器 | |
US7925821B2 (en) | Nonvolatile semiconductor storage device and method of managing the same | |
CN101901189A (zh) | 更新用户数据的方法以及恢复用户数据的方法 | |
CN105630701B (zh) | 数据存储装置及使用不可用页表或不可用块表的读写方法 | |
CN105608016B (zh) | Dram与mram结合的固态硬盘及使用mram的存储卡 | |
CN109669889B (zh) | 一种轻量型Nor Flash闪存控制方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20110907 Termination date: 20150403 |
|
EXPY | Termination of patent right or utility model |