数据存储方法与流程

文档序号:11063309阅读:1325来源:国知局
数据存储方法与制造工艺

本发明涉及一种数据存储方法,具体来说,涉及一种车载终端上通过微处理器将控制数据写入非易失性存储器的一种数据存储方法。



背景技术:

非易失性存储器由于在无电源时数据可正常保存的特性被广泛应用于汽车电子和工业控制设备中,用于存放程序、重要的配置信息等。例如,在专利公开文献CN103023524A中,公开了一种车载终端,其处理器连接一存储模块,用于实现固定信息的存储和行驶轨迹的记录等。

对于非易失性存储器的读写操作,微处理器一般需要利用芯片厂家提供的函数库或驱动程序来实现。在程序运行过程中,存储在非易失性存储器中的数据可以被实时更新,为了提高微处理器对非易失性存储器件读写操作的可靠性,需要考虑在对非易失性存储器进行读写操作的过程中发生各种意外情况下(如读写时序出错,电源突发断电,EEPROM坏片),非易失性存储器中的数据仍能保持在正常值范围内,确保程序正常运行,为此,需要有一种新的读写逻辑方法来实现这一目的。



技术实现要素:

为了达到上述目的,本发明提出了一种新的数据存储方法,在微处理器中引入镜像RAM模块和存储控制模块。镜像RAM模块占据了微处理器片上RAM的部分地址空间,存储内容是非易失性存储模块中存储数据的拷贝。在程序运行过程中,应用子模块会更新镜像RAM中的数据。存储控制模块实现镜像RAM中数据与非易失性存储模块中数据的一致性,程序运行过程中周期性地将镜像RAM中已改变的数据更新到非易失性存储模块中对应的内存区域,应用子模块不会直接对非易失性存储模块中数据造成任何影响,同时算法周期性的对非易 失性存储模块中的数据和镜像RAM中数据进行回读校验,保证了存储数据的可靠性。

根据本发明的一个主要方面,提供一种数据存储方法,用于在包括镜像存储模块、非易失性存储模块、应用子模块以及存储控制模块的系统中存储数据,所述方法包括以下步骤:

(a)初始化镜像存储模块,将所述非易失性存储模块预置的数据写入到所述镜像存储模块中;

(b)应用子模块将需要改写的数据更新到镜像存储模块中;

(c)周期性地将镜像存储模块中的数据更新到非易失性存储模块中;

(d)周期性地对非易失性存储模块中的数据和所述镜像存储模块中的数据进行回读校验。

优选地,在进行所述应用子模块将需要改写的数据更新到镜像存储模块中的步骤时,禁止周期性地将镜像存储模块中的数据更新到非易失性存储模块中。

优选地,在进行周期性地将镜像存储模块中的数据更新到非易失性存储模块中的步骤时,在每次数据更新之后进行回读校验。

优选地,在进行回读校验时,如果回读失败,则尝试再次回读。

优选地,在进行回读校验时,每次回读最多尝试两次。

优选地,所述存储控制模块控制每个周期内的数据更新单元的大小,使之尽可能小。

优选地,所述数据更新单元的大小为一个字节或两个字节。

优选地,续流电容的续流时长设计成大于更新一个数据更新单元所需的时间。

优选地,数据更新的周期和/或回读校验的周期为4-48ms。

优选地,数据更新的周期和/或回读校验的周期的时基为4ms。

根据本发明的另一个主要方面,提供一种数据存储系统,所述系统包括镜像存储模块、非易失性存储模块、存储控制模块以及至少一个应用子模块;

所述非易失性存储模块用于存储数据,并用于预置系统默认的数据;

所述镜像存储模块用于临时性地存储数据,并用于在初始化时将所述非易失性存储模块预置的数据全部读入,以使系统根据在所述镜像存储模块中配置的数据开始运行;

所述至少一个应用子模块用于将需要改写的数据更新到镜像存储模块中;

所述存储控制模块用于周期性地将镜像存储模块中的数据更新到非易失性存储模块中;

其中,所述至少一个应用子模块不直接对所述非易失性存储模块中数据进行存取;所述存储控制模块周期性的对非易失性存储模块中的数据和所述镜像存储模块中的数据进行回读校验。

优选地,在所述镜像存储模块中设置有状态标志,用于禁止或允许周期性地将镜像存储模块中的数据更新到非易失性存储模块中。

优选地,所述存储控制模块用于在每次数据更新之后进行回读校验。

优选地,在进行回读校验时,如果回读失败,则尝试再次回读。

优选地,在进行回读校验时,每次回读最多尝试两次。

优选地,所述存储控制模块控制每个周期内的数据更新单元的大小,使之尽可能小。

优选地,所述数据更新单元的大小为一个字节或两个字节。

优选地,所述存储控制模块的硬件设计成,续流电容的续流时长设计成大于更新一个数据更新单元所需的时间。

优选地,数据更新的周期和/或回读校验的周期为4-48ms。

优选地,数据更新的周期和/或回读校验的周期的时基为4ms。

根据本发明的又一个主要方面,提供一种数据存储方法,用于在包括镜像存储模块、非易失性存储模块、应用子模块以及存储控制模块的系统中存储数据,所述方法包括以下步骤:

(a)应用子模块将需要改写的数据更新到镜像存储模块中;

(b)周期性地将镜像存储模块中的数据更新到非易失性存储模块中;

(c)周期性的对非易失性存储模块中的数据和所述镜像存储模块中的数据进行回读校验。

优选地,在进行所述应用子模块将需要改写的数据更新到镜像存储模块中的步骤时,禁止周期性地将镜像存储模块中的数据更新到非易失性存储模块中。

优选地,在进行周期性地将镜像存储模块中的数据更新到非易失性存储模块中的步骤时,在每次数据更新之后进行回读校验。

优选地,在进行回读校验时,如果回读失败,则尝试再次回读。

优选地,在进行回读校验时,每次回读最多尝试两次。

优选地,所述存储控制模块控制每个周期内的数据更新单元的大小,使之尽可能小。

优选地,所述数据更新单元的大小为一个字节或两个字节。

优选地,续流电容的续流时长设计成大于更新一个数据更新单元所需的时间。

优选地,数据更新的周期和/或回读校验的周期为4-48ms。

优选地,数据更新的周期和/或回读校验的周期的时基为4ms。

根据本发明的一个主要方面,提供一种数据存储方法,用于在包括镜像存储模块、非易失性存储模块、应用子模块以及存储控制模块的系统中存储数据,所述方法包括以下步骤:

(a)初始化镜像存储模块,将所述非易失性存储模块预置的数据写入到所述镜像存储模块中;

(b)应用子模块将需要改写的数据更新到镜像存储模块中;

(c)周期性地将镜像存储模块中的数据更新到非易失性存储模块中。

优选地,在没有数据更新时,周期性地对非易失性存储模块中的数据和所述镜像存储模块中的数据进行回读校验。

优选地,在进行所述应用子模块将需要改写的数据更新到镜像存储模块中 的步骤时,禁止周期性地将镜像存储模块中的数据更新到非易失性存储模块中。

优选地,在进行周期性地将镜像存储模块中的数据更新到非易失性存储模块中的步骤时,在每次数据更新之后进行回读校验。

优选地,在进行回读校验时,如果回读失败,则尝试再次回读。

优选地,在进行回读校验时,每次回读最多尝试两次。

优选地,所述存储控制模块控制每个周期内的数据更新单元的大小,使之尽可能小。

优选地,所述数据更新单元的大小为一个字节或两个字节。

优选地,续流电容的续流时长设计成大于更新一个数据更新单元所需的时间。

优选地,数据更新的周期和/或回读校验的周期为4-48ms。

优选地,数据更新的周期和/或回读校验的周期的时基为4ms。

利用本发明的技术方案,在程序运行时更新数据到镜像RAM模块,避免了对非易失性存储模块的直接操作,避免意外情况下对存储器中数据造成破坏,提高了数据存储的可靠性;同时,周期性地将镜像RAM模块中的数据更新到非易失性存储模块、回读校验,整个过程采用任务调度的方式,提高了微处理器的运行效率;而对非易失性存储模块中的数据进行回读校验,又确保了数据的长期准确性。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据本发明实施例的内容和这些附图获得其他的附图。

图1和图2描述了本发明系统的功能框图。

图3显示了本发明中程序的任务设置的示意图。

图4显示了各应用子模块更新镜像RAM的单个任务的处理流程。

图5显示了周期性数据更新任务的状态转换图。

图6显示了周期性数据更新任务的具体流程图。

图7显示了在没有数据更新请求的情况下对非易失性存储模块的数据校验流程。

图8显示了在数据更新请求队列非空情况下的数据更新流程。

具体实施方式

为使本发明解决的技术问题、采用的技术方案和达到的技术效果更加清楚,下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

系统的功能框图参见图1和图2。系统包括镜像RAM模块、存储控制模块和多个应用子模块,还包括非易失性存储模块。镜像RAM模块、存储控制模块和各应用子模块都内置在微处理器芯片中;而非易失性存储模块既可以是微处理器芯片内置的存储模块,如内置的EEPROM(图1),也可以是外置的一块单独芯片,如外置的EEPROM,NorFlash等(图2)。

非易失性存储模块中预置了一组系统默认的数据。在系统初始化时,存储控制模块从非易失性存储模块中将预置的数据全部读入到镜像RAM中,程序使用其中的配置数据开始运行。

在程序运行过程中,各应用子模块将需要改写的数据更新到镜像RAM模块。

存储控制模块提供更新数据的接口函数,并负责周期性地发起数据更新任务,检查镜像RAM模块中的数据是否被更新,如果有更新,则将最新数据写入到非易失性存储模块中,然后对已写入非易失性存储模块的数据进行回读校验。

存储控制模块控制每个周期内更新数据的单元尽可能小,例如每次更新一个字节或两个字节,这样可以避免终端发生突然掉电时非易失性存储模块的数据没有更新完整,从而导致不可预知的错误。同时,在存储控制模块的硬件设计中,续流电容的续流时长设计成大于进行一次更新所需的时间,以此确保掉电后,存储控制模块能完整更新一个单元的数据至非易失性存储模块中。

在本发明的实施例中,存储控制模块数据更新任务周期可自由配置,例如可以是4~48ms,其中以4ms为时基;通常情况下配置成每个周期更新一个字节的数据。数据校验任务周期同样可以自由配置。

下面结合附图来说明本发明中程序的具体处理流程。

图3显示了本发明中程序的任务设置的示意图。首先初始化镜像RAM,然后一个或多个应用子模块将需要改写的数据更新到镜像RAM模块,而镜像RAM模块中的数据也周期性地更新到非易失性存储模块中。各应用子模块更新镜像RAM以及镜像RAM周期性更新非易失性存储模块都是并行运行的任务。

图4显示了各应用子模块更新镜像RAM的单个任务的处理流程。各应用子模块在数据发生更改后调用同样的接口去改写镜像RAM,并把更改信息保存在请求队列中供存储控制模块使用,具体流程如下:

步骤4.1.检查该应用子模块需更改数据的长度和需更改数据在镜像RAM中的保存地址是否合法,合法则继续,不合法则退出;

步骤4.2.检查当前请求队列的数目是否超出了允许队列最大个数,超出则退出,未超出则继续;

步骤4.3.设置状态标志,禁止周期性数据更新任务进行数据更新;该状态标志一般设在例如存储控制模块内部;

步骤4.4.将需要更改的数据长度和数据在镜像RAM中的首地址保存到请求队列中;

步骤4.5.将更改后的数据和镜像RAM中原有数据进行比较,不一致的数据位记录至数据请求队列中更新标志的对应位;

步骤4.6.将程序子模块更改后的数据保存至镜像RAM;

步骤4.7.更新请求队列指针;

步骤4.8.将周期性数据更新任务状态设置为IDLE,表示有数据需要更新,具体见数据更新流程;

步骤4.9.清除状态标志,允许周期性数据更新任务进行数据更新。

图5和图6显示了镜像RAM周期性更新数据到非易失性存储模块的任务的流程。其中图5显示了周期性数据更新任务的状态转换图;而图6显示了周期性数据更新任务的具体流程图。

参见图5,周期性数据更新任务的共有4种任务状态,具体描述如下:

(A)NO_REQUEST_ACTIVITY:没有数据更新请求,在周期性任务中对EEPROM中的数据进行回读校验,每次回读校验例如10个字节。在一些实施例中,如果第一次回读失败会再次尝试回读一次,并且只会再尝试一次,两次都失败则记录微处理器和EEPROM通信丢失。校验失败则上报错误码及错误报告。

(B)IDLE:存在数据更新请求,从请求队列中当前指针开始搜索到第一个需要更新的字节,将其更新至EEPROM对应地址。更新结束后将状态设置为END_WRITE,下一周期转入END_WRITE处理。

(C)END_WRITE:对前一个周期更新的字节数据进行回读校验,回读也会尝试例如两次。如果校验通过,将状态设置为IDLE,在本周期内立刻启动下一个字节的数据更新。如果回读校验不通过,则将状态设置为END_REWRITE,下一周期转入END_REWRITE处理。

(D)END_REWRITE:对当前字节数据再次进行回读校验,回读也会尝试例如两次,如果回读成功,将状态设置为IDLE,在本周期内立刻启动下一个字节的数据更新。如果回读不成功,记录微处理器和EEPROM通信丢失,上报写错误码及错误报告,结束本次任务。

参见图6,周期性任务的具体步骤如下:

步骤6.1.进入周期性任务入口;

步骤6.2.判断微处理器与非易失性存储模块是否通信正常,如果通信不正常则重新读取非易失性存储模块,尝试恢复通信;

步骤6.3.再次判断微处理器与非易失性存储模块是否通信正常,如果通信正常则继续,如果通信不正常则结束任务;

步骤6.4.读取当前任务状态,判断是否有数据更新请求,如果有更新请求进入步骤6.5,如果没有则对非易失性存储模块中的数据与镜像RAM中的数据进行校验,具体校验流程见图7;

步骤6.5.判断数据更新请求队列是否为非空,如果为空则结束任务,如果非空则进行数据更新处理,具体处理流程见图8;

步骤6.6.退出周期性任务。

图7显示了在没有数据更新请求的情况下对非易失性存储模块的数据校验流程,具体步骤如下:

步骤7.1.根据当前校验地址和校验长度计算下一次校验地址;

步骤7.2.如果计算后的下一次校验地址大于EEPROM的结束地址,则将校验长度修正为当前校验地址至EEPROM结束地址的长度,将下一次校验地址修正为EEPROM的起始地址;

步骤7.3.其他情况下将校验长度设为程序预置的校验长度;

步骤7.4.从当前校验地址读入校验长度的数据,如果读取不成功则再尝试读取例如一次,如果两次读取都不成功则记录微处理器与EEPROM通信状态为丢失状态;

步骤7.5.如果数据读取成功则将数据与镜像RAM中对应地址的数据进行校验,如果校验成功,则将下一次校验地址更新为前面计算并经过修正的地址;

步骤7.6.如果数据校验失败,则上报错误码和错误报告,如微处理器与EEPROM通信状态丢失,则程序退出。

图8显示了在数据更新请求队列非空情况下的数据更新流程,其具体步骤如下:

步骤8.1.判断是否首次处理数据更新请求队列,如果是则保存该队列信息,包括队列地址、队列索引、队列长度、队列中数据更新标志等;

步骤8.2.根据队列当前指针计算EEPROM中的对应地址,即数据更新的目的地址;

步骤8.3.判断当前任务状态是否END_WRITE或END_REWRITE,如是则对EEPROM的当前字节进行回读校验,如果校验成功,则将当前队列的指针和目的地址都更新至下一个字节,任务状态更新为IDLE,在本周期任务后续程序中进行下一字节数据的更新;

步骤8.4.如果当前任务状态为END_WRITE且当前字节数据回读失败,则将当前队列中的字节数据更新至EEPROM,同时将任务状态更新为END_REWRITE,使下一周期任务重新进行回读校验;

步骤8.5.判断最新的当前任务状态如果是IDLE,从队列当前指针开始检测到的第一个需要更新的字节数据,将其更新至EEPROM;

步骤8.6.判断微处理器与EEPROM是否通信正常,如果通信丢失则将下一周期任务状态设置为IDLE,结束本次任务;

步骤8.7.如果微处理器与EEPROM通信正常,判断当前队列是否已经更新完成,如果未完成则结束本次任务;如果当前队列已经更新完成,则获取下一个请求队列,如果无剩余请求队列,则将任务状态设置为NO_REQUEST_ACTIVITY,结束本次任务;如果还有剩余请求队列,则将下一周期的任务状态设置为IDLE,任务周期间隔设置为0,退出本次任务;

步骤8.8.结束本次任务。

以上通过优选的实施方式对本发明进行了描述,但并不意图以这些实施方式对本发明的保护范围进行限制。本发明的保护范围应当以本发明的权利要求为基础,参照本说明书的文字和附图来解释。应当理解,本领域普通技术人员在参考本发明的基础上,在不付出创造性劳动的情况下,对本发明所作出的任何修改、变动和改型,都落入在本发明的保护范围中。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1