本发明涉及仪器仪表技术领域,尤其是涉及一种可有效提高非易失存储器使用寿命的数据存储方法和系统。
背景技术:
仪器仪表要保存大量的历史数据,因而需要大容量的非易失存储器,用来存放这些历史数据。大容量flash是目前仪器仪表上广泛使用的性价比较高的非易失存储器,但flash(flash是存储芯片的一种,全名叫flasheeprommemory,flash存储器又称闪存,它结合了rom和ram的长处,不仅具备电子可擦除可编程的性能,还可以快速读取数据,使数据不会因为断电而丢失。)的最大问题是擦写次数受限,一般flash只有10万次的擦写次数,有的更低。超过其允许的擦写次数,器件就会损坏,从而造成整机损坏。
非易失flash的写操作要求:1)擦除,将欲保存的空间先擦除掉,一般都是按页擦除,尽管保存的数据小于一页,但也要擦除一页。如不擦除,将无法正确保存数据;2)将欲保存数据写到已擦除的空间。
针对非易失flash的写操作特性,常规操作流程是这样的:
1)读,保存数据前,先读出欲保存数据所在页内的所有数据。一般非易失flash每页有4k大小,这样需要预留4k的随机存取存储器(randomaccessmemory,ram)空间,用于临时保存读出的数据,4k的ram,对多数mcu仍属较大的硬件开销;2)擦除,擦除欲保存页;3)修改,将欲保存数据覆盖读出的4kram空间的相应区域;4)写,将更新后的包含有修改数据的4kram写到非易失flash的对应页上。
以上常规操作有3个问题:
1)如果每次保存的数据较少,4k的页空间包含有很多点数据,每保存1次就要擦除1次非易失flash,造成频繁擦除,加大了擦除次数,增加了flash损坏的概率;
2)4k的ram是笔不小的硬件开销,尤其是在一些小仪器仪表中,在选择mcu时,要充分考虑mcu的硬件资源,选择不当,mcu资源不足,无法支撑后续应用;
3)如果欲保存数据刚好处在2页之间,需要跨页保存,此时需要对2页分别操作,不但增加了擦写次数,而且增加了编程难度,程序易遗留bug,增加了设备出错概率。
技术实现要素:
有鉴于此,本发明的目的在于提供一种提高非易失存储器使用寿命的数据存储方法和系统,可以有效降低对非易失存储器的擦除频率,提高非易失存储器的使用寿命,减少mcu的硬件开销。
为实现上述目的,本发明提出了一种提高非易失存储器使用寿命的数据存储方法,所述方法包括:
计算非易失存储器每页可保存的数据点数pointn,确保同一个点的数据保存在同一页,不跨页保存。
根据每页可保存的数据点数pointn,计算所述非易失存储器保存所有数据所需的页数max_page,开辟max_page+1页的存储空间;之所以特意多留1页,是为了后面整页擦除而不降低总存储点数。
保存数据,包括:
每次保存数据时,按照保存点的顺序计算在非易失存储器中的保存地址;
判断保存首地址是否为非易失存储器的页首地址;如果是非易失存储器的页首地址,则擦除该页,将数据写入非易失存储器;如果不是非易失存储器的页首地址,则读取该地址区数据;
读取该地址区数据后,再判断所述地址区数据是否全部是0xff,如果全部是0xff,说明所在页已经擦除过,可直接将数据写入,否则,重新擦除该页,然后再将数据写入。0xff:非易失存储器flash擦除后,内部空间数据全部是0xff,如果有空间不是0xff,说明没有擦除。
作为优选,所述非易失存储器每页可保存的数据点数pointn可根据下式计算:pointn=int(pagelen/datalen)
其中,pagelen为所述非易失存储器页大小,datalen为每次保存的数据长度,int(pagelen/datalen)为取整运算。
作为优选,所述非易失存储器保存所有数据所需的页数pagen可根据下式计算:max_page=int(max_point/pointn)+(max_point%pointn)
其中,max_point为保存数据的总点数,int(max_point/pointn)为取整运算,(max_point%pointn)
作为优选,所述非易失存储器为flash。
基于上述的提高非易失存储器使用寿命的数据存储方法,本发明提供了一种提高非易失存储器使用寿命的数据存储系统,包括mcu和与mcu电气耦接的非易失存储器,所述mcu通过spi总线,驱动及控制非易失存储器,所述非易失存储器用于存储数据,所述mcu,包括:
计算模块,用于计算所述非易失存储器每页可保存的数据点数pointn和所述非易失存储器保存所有数据所需的页数max_page;
定义模块,根据所述非易失存储器保存所有数据所需的页数max_page,定义存储空间为max_page+1页;
数据处理模块,用于处理每次保存的数据,将数据写入非易失存储器。
作为优选,所述非易失存储器每页可保存的数据点数pointn可根据下式计算:pointn=int(pagelen/datalen)
其中,pagelen为所述flash页大小,datalen为每次保存的数据长度,int(pagelen/datalen)为取整运算。
作为优选,所述非易失存储器保存所有数据所需的页数pagen可根据下式计算:max_page=int(max_point/pointn)+(max_point%pointn)
其中,max_point为保存所有数据所需点数,int(max_point/pointn)为取整运算,(max_point%pointn)
作为优选,所述的数据处理模块包括:
数据计算模块,用于按照保存点的顺序计算每次保存的数据在非易失存储器中的保存地址;
第一判断模块,用于判断保存首地址是否为非易失存储器的页首地址;
读模块,用于保存首地址不是非易失存储器的页首地址时,读地址区数据;
第二判断模块,用于保存首地址不是非易失存储器的页首地址时,判断所述读模块读取的地址区数据是否全部是0xff;
擦写模块,用于保存首地址是非易失存储器的页首地址或读模块读取的地址区数据不全部是0xff时,擦除页,再将数据写入非易失存储器;地址区数据全部是0xff时,直接将数据写入非易失存储器。
作为优选,所述非易失存储器为flash。
与现有技术相比本发明的有益效果在于:
1)由于定义了非易失存储器每页可保存的数据点数pointn和保存所有数据所需的页数max_page,可确保同一个点的数据保存在同一页,没有跨页保存,每一页保存的数据都是完整的数据,不再需要按照常规操作所要求的“读—擦除—修改—写”这样的操作,简化了软件操作流程,减少了出现bug的概率;
2)由于特意多留了1页存储空间,这样就可确保保存到新的一页时,可以整页擦除而不用担心由于擦除了页内其他数据点,而造成保存数据点数量的损失。整页擦除后,陆续按照顺序保存,这样即使1页需要保存许多点,也只擦除1次,最大程度降低了擦除非易失存储器的频率;
3)采用本方案的方法,无需使用随机存取存储器(randomaccessmemory,ram),省略了常规需要的ram的开销,可降低mcu的硬件资源,从而降低整机成本。
为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图;
图1是本发明实施例提供的提高非易失存储器使用寿命的数据存储方法中保存数据的流程图;
图2为本发明实施例提供的提高非易失存储器使用寿命的数据存储系统示意图;
图3为本发明实施例提供的提高非易失存储器使用寿命的数据存储系统中数据处理模块的示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明上述的和另外的技术特征和优点作更详细的说明。
为降低对非易失存储器的flash的擦除频率,提高其使用寿命,减少mcu的硬件开销,本发明提出了一种提高非易失存储器使用寿命的数据存储方法。
首先,计算flash每页可保存的数据点数pointn,确保同一个点的数据保存在同一页,不跨页保存;所述非易失存储器每页可保存的数据点数pointn可根据下式计算:
pointn=int(pagelen/datalen)
其中,pagelen为所述flash页大小,datalen为每次保存的数据长度,int(pagelen/datalen)为取整运算,只取pagelen、datalen相除后的整数部分,舍弃小数。
例如,flash的页空间是4k,假设每个点保存的历史数据是180字节,按照常规4096/180=22.755,按照现有技术的方式的话1页非易失flash可保存完整的22个点的数据和136字节的数据,另有44字节的数据要保存到下一页。本发明则要求在这一页只保存22点数据,本页剩余的flash空间作废不在使用。
然后,根据每页可保存的数据点数pointn,计算所述flash保存所有数据所需的页数max_page,因为整页擦除,如不多预留空间,擦除会造成数据点的丢失,因而要多留1页的空间,因此,开辟max_page+1页的存储空间;所述非易失存储器保存所有数据所需的页数pagen可根据下式计算:
max_page=int(max_point/pointn)+(max_point%pointn)
其中,max_point为保存所有数据所需点数,int(max_point/pointn)为取整运算,(max_point%pointn)
例如,保存所有数据所需点数是10000个点,按上述每页可保存的数据点数是22点,则max_point/pointn=10000/22=454.54,保存所有数据所需的页数max_page为455页,因此,开辟456页的存储空间。
最后,按照上述计算的存储方式来保存数据,同一个点的数据保存在同一页,不跨页保存,存储空间的总页数是max_page+1页,保存数据的流程如图1所示,包括如下步骤:
s1:每次保存数据时,按照保存点的顺序计算在flash中的保存地址;
s2:判断保存首地址是否为flash的页首地址,即每一页的第一个地址;如果保存首地址刚好是flash的页首地址,说明开始了新一页,对该页执行擦除页操作,并将数据写入flash;如果不是非易失存储器的页首地址,则读该保存页的地址区数据;
s3:读该保存页的地址区数据后,判断所述的地址区数据是否全部是0xff,如果全部是0xff,将数据写入flash,否则,重新擦除该页,再将数据写入非易失存储器。0xff:flash擦除后,页内空间数据全部是0xff,如果有空间不是0xff,说明没有擦除,有可能因为停电或其他原因,错过了首地址的擦除操作,因此需重新擦除。
基于上述的提高非易失存储器使用寿命的数据存储方法,本发明提供了一种提高非易失存储器使用寿命的数据存储系统,如图2所示,包括mcu1和与mcu1电气耦接的flash2,所述mcu1通过spi总线,驱动及控制flash2,所述flash2用于存储数据,所述mcu1,包括;计算模块10、定义模块20和数据处理模块30。
计算模块10,用于计算所述flash2每页可保存的数据点数pointn和所述flash保存所有数据所需的页数max_page。
所述flash2每页可保存的数据点数pointn可根据下式计算:
pointn=int(pagelen/datalen)
其中,pagelen为所述flash2页大小,datalen为每次保存的数据长度,int(pagelen/datalen)为取整运算,该运算是用来确保同一个点的数据保存在同一页,不跨页保存。
所述flash2保存所有数据所需的页数pagen可根据下式计算:
max_page=int(max_point/pointn)+(max_point%pointn)
其中,max_point为保存所有数据所需点数,int(max_point/pointn)为取整运算,(max_point%pointn)
定义模块20,根据所述flash2保存所有数据所需的页数max_page,定义存储空间为max_page+1页;因为本方案需要整页擦除,如不多预留空间,擦除会造成数据点的丢失,因而要多留1页的空间,因此,开辟max_page+1页的存储空间。
数据处理模块30,用于处理每次保存的数据,将数据写入flash2。是根据计算模块10和定义模块20计算和定义好的存储方式,来保存数据,所述的数据处理模块30如图3所示,包括:
数据计算模块301,用于按照保存点的顺序计算每次保存的数据在flash2中的保存地址;
第一判断模块302,用于判断保存首地址是否为flash2的页首地址;
读模块303,用于保存首地址不是flash2的页首地址时,读地址区数据;
第二判断模块304,用于保存首地址不是flash2的页首地址时,判断所述读模块303读取的地址区数据是否全部是0xff;0xff:非易失存储器flash擦除后,内部空间数据全部是0xff,如果有空间不是0xff,说明没有擦除;
擦写模块305,用于保存首地址是flash2的页首地址或读模块303读取的地址区数据不全部是0xff时,擦除页,再将数据写入flash2;地址区数据全部是0xff时,直接将数据写入flash2。
按照本发明设计的一款仪器仪表,使用32mb的串行flash2作为历史数据存储器。选用的mcu1只需128k的程序空间及16k的sram空间,即可完成电力线路的电压、电流、功率、电量等数据的采集和计算,要进行历史分钟曲线数据、日冻结数据、月冻结数据及异常事件数据的保存,通过采用本发明的数据存储方法,无需使用ram,降低了ram的资源开销,极大的减少了非易失存储器flash2的擦写次数,从而提高了flash2的使用寿命,进而提高了整机的寿命。
综上所述,与现有技术相比本发明的有益效果在于:
1)由于定义了非易失存储器每页可保存的数据点数pointn和保存所有数据所需的页数max_page,可确保同一个点的数据保存在同一页,没有跨页保存,每一页保存的数据都是完整的数据,不再需要按照常规操作所要求的“读—擦除—修改—写”这样的操作,简化了软件操作流程,减少了出现bug的概率;
2)由于特意多留了1页存储空间,这样就可确保保存到新的一页时,可以整页擦除而不用担心由于擦除了页内其他数据点,而造成保存数据点数量的损失。整页擦除后,陆续按照顺序保存,这样即使保存了许多点,也只擦除1次,极大程度地降低了擦除flash的频率;
3)采用本方案的方法,无需使用ram,省略了常规需要的4kram的开销,可降低mcu的硬件资源,从而可适当降低整机成本。尽管增加及浪费了部分flash的空间,但相比于mcu的ram及目前flash大小和价格比,后者更合算。
以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。