一种嵌入式设备的内存扩展方法
技术领域
本发明涉及嵌入式应用开发内存管理领域,尤其涉及一种嵌入式设备的内存扩展方法。
背景技术
目前嵌入式设备逐年增多,尤其是中低端嵌入式设备例如单片机设备的出货量巨大。嵌入式设备在进行单片机选型时会着重考虑成本问题,所以会选择存储资源少一些的单片机作为主控芯片,因此大部分开发人员会面临缺内存的问题。而当内存不足时,目前采用的方法大多是通过更换存储资源更多的单片机或是外挂RAM存储器来解决,但与之带来的就是成本的提升。
因此,如何提供一种嵌入式设备的内存扩展方法,以克服现有技术中存在的上述缺陷,日益成为本领域技术人员亟待解决的技术问题之一。
发明内容
本发明的目的在于提供一种嵌入式设备的内存扩展方法,以解决现有技术存在的嵌入式设备内存不足,以及通过外挂RAM存储器导致成本增加的问题。
为了达到上述目的,本发明提供了一种嵌入式设备的内存扩展方法,所述嵌入式设备设置有第一存储器和第二存储器,所述内存扩展方法,包括:
在所述第一存储器内获取第一内存块,并将当前数据的头部数据存入所述第一内存块,所述头部数据用于记录所述当前数据的存储信息;
获取所述当前数据的数据长度;
判断所述第一存储器内是否存在满足所述当前数据的数据长度的第二内存块;
若存在,向所述第一存储器申请所述第二内存块,并将所述当前数据存入所述第二内存块;
若不存在,向所述第二存储器申请一满足所述当前数据的数据长度的存储空间,并将所述当前数据存入所述存储空间;
根据所述当前数据的存储状态更新所述头部数据。
可选的,所述头部数据在所述第一存储器内的存储信息包括:所述头部数据的起始地址、所述第二内存块的引用次数、所述第二内存块的存在时间、所述第二内存块的存储长度、所述当前数据的映射状态和所述当前数据的存储位置;
所述头部数据在所述第二存储器内的存储信息包括:所述当前数据的存储位置、所述存储空间是否使用状态、所述存储空间的存储长度、所述存储空间是否全存储、所述头部数据的起始地址、所述存储空间的引用次数和所述存储空间的存在时间。
可选的,所述当前数据的映射状态包括:映射状态0、映射状态1和映射状态2;
其中,所述映射状态0为所述头部数据和所述当前数据均存放在所述第一存储器内;
所述映射状态1为所述头部数据存放在所述第一存储器内,所述当前数据存放在所述第二存储器内;
所述映射状态2为所述头部数据和所述当前数据均存放在所述第二存储器内;
当对所述嵌入式设备进行读写操作时,根据所述当前数据的映射状态进行读写操作:
当所述当前数据处于映射状态0时,调用第一存储器读写接口进行第一存储器内所述当前数据的读写;
当所述当前数据处于映射状态1或映射状态2时,调用第二存储器读写接口进行所述第二存储器内所述当前数据的读写。
可选的,还包括:建立第一内存管理链表和第二内存管理链表;
其中,向所述第一存储器每申请一内存块,将该内存块添加至所述第一内存管理链表;
向所述第二存储器每申请一存储空间,将该存储空间添加至所述第二内存管理链表。
可选的,还包括以下方式进行内存管理:
根据所述第一存储器内的所述头部数据获取所述当前数据的映射状态以及计算所述当前数据的使用频率;
当所述当前数据的使用频率高于第一预设值,按照第一管理规则,根据所述当前数据的映射状态,将所述当前数据和所述头部数据转存至所述第一存储器,或保留所述当前数据和所述头部数据在所述第一存储器内的原始存储位置;
当所述当前数据的使用频率低于所述第一预设值且高于第二预设值时,按照第二管理规则,根据所述当前数据的映射状态,将所述当前数据转存至所述第二存储器和将所述头部数据转存至所述第一存储器,或保留所述当前数据在所述第二存储器内的原始存储位置和所述头部数据在所述第一存储器内的原始存储位置;
当所述当前数据的使用频率低于所述第二预设值时,按照第三管理规则,根据所述当前数据的映射状态,将所述当前数据和所述头部数据转存至所述第二存储器,或保留所述当前数据和所述头部数据在所述第二存储器内的原始存储位置。
可选的,所述根据所述头部数据计算所述当前数据的使用频率,包括:
实时遍历第一内存管理链表和第二内存管理链表,获取所述当前数据的头部数据;
根据下式计算得到所述当前数据的使用频率:
k=n/t
式中,k为所述当前数据的使用频率,n为所述当前数据在所述第一存储器内和在所述第二存储器内的引用次数的和,t为所述当前数据在所述第一存储器内和在所述第二存储器内的存在时间的和。
可选的,所述第一管理规则包括:获取所述当前数据的映射状态,当所述当前数据处于所述映射状态1时,将所述当前数据由所述第二存储器转存至所述第一存储器内,所述头部数据的原始存储位置不改变,并更新所述当前数据为所述映射状态0;当所述当前数据处于所述映射状态2时,将所述当前数据和所述头部数据均由所述第二存储器转存至所述第一存储器内,并更新所述当前数据为所述映射状态0;
所述第二管理规则包括:获取所述当前数据的映射状态,当所述当前数据处于所述映射状态0时,将所述当前数据由所述第一存储器转存至所述第二存储器,所述头部数据的原始存储位置不改变,并更新所述当前数据为所述映射状态1;当所述当前数据处于所述映射状态2时,将所述头部数据由所述第二存储器转存至所述第一存储器,所述当前数据的原始存储位置不改变,并更新所述当前数据为所述映射状态1;
所述第三管理规则包括:获取所述当前数据的映射状态,当所述当前数据处于所述映射状态0时,将所述当前数据和所述头部数据由所述第一存储器转存至所述第二存储器,并更新所述当前数据为所述映射状态2;当所述当前数据处于所述映射状态1时,将所述头部数据由所述第一存储器转存至所述第二存储器,所述当前数据的原始存储位置不改变,并更新所述当前数据为所述映射状态2。
可选的,当所述当前数据和/或所述头部数据的存储位置改变后,将同步更新第一内存管理链表和第二内存管理链表。
可选的,当将所述当前数据转存至所述第一存储器内时,所述第一存储器内需具有满足所述当前数据的数据长度的内存块,否则,所述当前数据保留在所述第二存储器内的原始存储位置;
当将所述当前数据转存至所述第二存储器内时,所述第二存储器内需具有满足所述当前数据的数据长度的存储空间,否则,所述当前数据保留在所述第一存储器内的原始存储位置。
可选的,还包括采用以下方式释放内存块:
根据所述头部数据获取所述当前数据的映射状态;
当所述当前数据处于所述映射状态0时,先释放存储所述当前数据的内存块,再释放存储所述头部数据的内存块,并更新第一内存管理链表;
当所述当前数据处于所述映射状态1时,先将第二内存管理链表中所述当前数据的使用状态更新为未使用状态,再释放存储所述头部数据的内存块,并同步更新第一内存管理链表;
当所述当前数据处于所述映射状态2时,将第二内存管理链表中所述头部数据的使用状态更新为未使用状态。
与现有技术相比,本发明提供的一种嵌入式设备的内存扩展方法具有以下有益效果:
本发明提供的一种嵌入式设备的内存扩展方法,所述嵌入式设备设置有第一存储器和第二存储器,所述内存扩展方法,包括:首先在所述第一存储器内获取第一内存块,并将当前数据的头部数据存入所述第一内存块,所述头部数据用于记录所述当前数据的存储信息;其次获取所述当前数据的数据长度;随后判断所述第一存储器内是否存在满足所述当前数据的数据长度的第二内存块;若存在,向所述第一存储器申请所述第二内存块,并将所述当前数据存入所述第二内存块;若不存在,向所述第二存储器申请一满足所述当前数据的数据长度的存储空间,并将所述当前数据存入所述存储空间;最后根据所述当前数据的存储状态更新所述头部数据。本发明提供的嵌入式设备的内存扩展方法,通过将所述头部数据存入所述第一存储器内,由于所述第一存储器(例如RAM存储器)具有更快的读写能力,因此,当将所述头部数据存入所述第一存储器后,能够快速从所述头部数据内获取所述当前数据的数据长度,以便对所述当前数据进行存储。同时,当所述第一存储器内空间不足时,能够将所述当前数据存储在所述第二存储器内,由于所述第二存储器(例如Flash存储器)具有更大的存储空间,因此本发明提供的内存扩展方法,使得所述嵌入式设备不仅内存容量大,而且读写能力强以及使用成本低。
附图说明
图1为本发明一实施方式提供的嵌入式设备的内存扩展方法的流程图;
图2为本发明一实施方式提供的RAM内存管理链表释放前示意图;
图3为本发明一实施方式提供的RAM内存管理链表释放后示意图;
图4为本发明一实施方式提供的Flash内存管理链表释放前示意图;
图5为本发明一实施方式提供的Flash内存管理链表释放后示意图。
具体实施方式
下面将结合示意图对本发明的具体实施方式进行更详细的描述。根据下列描述,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。应当了解,说明书附图并不一定按比例的显示本发明的具体结构,并且在说明书附图中用于说明本发明某些原理的图示性特征也会采取略微简化的画法。本文所公开的本发明的具体设计特征包括例如具体尺寸、方向、位置和外形将部分地由具体所要应用和使用的环境来确定。以及,在以下说明的实施方式中,有时在不同的附图之间共同使用同一附图标记来表示相同部分或具有相同功能的部分,而省略其重复说明。在本说明书中,使用相似的标号和字母表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。
本实施例提供了一种嵌入式设备的内存扩展方法,具体地,请参见附图1,其示意性地给出了本实施例提供的嵌入式设备的内存扩展方法的流程图,从图1可以看出,所述嵌入式设备设置有第一存储器和第二存储器,所述内存扩展方法,包括:
在所述第一存储器内获取第一内存块,并将当前数据的头部数据存入所述第一内存块,所述头部数据用于记录所述当前数据的存储信息;
获取所述当前数据的数据长度;
判断所述第一存储器内是否存在满足所述当前数据的数据长度的第二内存块;
若存在,向所述第一存储器申请所述第二内存块,并将所述当前数据存入所述第二内存块;
若不存在,向所述第二存储器申请一满足所述当前数据的数据长度的存储空间,并将所述当前数据存入所述存储空间;
根据所述当前数据的存储状态更新所述头部数据。
如此设置,本发明提供的嵌入式设备的内存扩展方法,通过将所述头部数据存入所述第一存储器内,由于所述第一存储器(例如RAM存储器)具有更快的读写能力,因此,当将所述头部数据存入所述第一存储器后,能够快速从所述头部数据内获取所述当前数据的数据长度,以便对所述当前数据进行存储。同时,当所述第一存储器内空间不足时,能够将所述当前数据存储在所述第二存储器内,由于所述第二存储器(例如Flash存储器)具有更大的存储空间,因此本发明提供的内存扩展方法,使得所述嵌入式设备不仅内存容量大,而且读写能力强以及使用成本低。
需要特别说明的是,如本领域技术人员可以理解地,上述示例虽然第一存储器以RAM为例,第二存储器以FLASH为例,但本发明并不限制所述第一存储器和所述第二存储器的具体类型。所述第一存储器也可以为除RAM存储器之外的其他存储器;所述第二存储器也可以为除FLASH存储器之外的其他存储器。
优选的,所述头部数据在所述第一存储器内的存储信息包括:所述头部数据的起始地址、所述第二内存块的引用次数、所述第二内存块的存在时间、所述第二内存块的存储长度、所述当前数据的映射状态和所述当前数据的存储位置;
所述头部数据在所述第二存储器内的存储信息包括:所述当前数据的存储位置、所述存储空间是否使用状态、所述存储空间的存储长度、所述存储空间是否全存储、所述头部数据的起始地址、所述存储空间的引用次数和所述存储空间的存在时间。由此,通过所述头部数据所包括的存储信息,能够快速获取所述当前数据的位置和存储状态等信息,从而对所述当前数据进行读写。
优选的,所述当前数据的映射状态包括:映射状态0、映射状态1和映射状态2;其中,所述映射状态0为所述头部数据和所述当前数据均存放在所述第一存储器内;所述映射状态1为所述头部数据存放在所述第一存储器内,所述当前数据存放在所述第二存储器内;所述映射状态2为所述头部数据和所述当前数据均存放在所述第二存储器内;当对所述嵌入式设备进行读写操作时,根据所述当前数据的映射状态进行读写操作:当所述当前数据处于映射状态0时,调用第一存储器读写接口进行第一存储器内所述当前数据的读写;当所述当前数据处于映射状态1或映射状态2时,调用第一存储器读写接口进行所述第二存储器内所述当前数据的读写。由此,根据所述映射状态,能够获取所述当前数据的存储位置,从而在其对应位置通过对应数据接口进行所述当前数据的快速读写。
优选的,所述内存扩展方法还包括:建立第一内存管理链表和第二内存管理链表;其中,向所述第一存储器每申请一内存块,将该内存块添加至所述第一内存管理链表;向所述第二存储器每申请一存储空间,将该存储空间添加至所述第二内存管理链表。如此设置,便于在对所述当前数据进行读出时,通过遍历所述第一内存管理链表和所述第二内存管理链表快速找到所述当前数据的头部数据,从而找到所述当前数据以读出。
优选的,还包括以下方式进行内存管理:
根据所述第一存储器内的所述头部数据获取所述当前数据的映射状态以及计算所述当前数据的使用频率;
当所述当前数据的使用频率高于第一预设值,按照第一管理规则,根据所述当前数据的映射状态,将所述当前数据和所述头部数据转存至所述第一存储器,或保留所述当前数据和所述头部数据在所述第一存储器内的原始存储位置;
当所述当前数据的使用频率低于所述第一预设值且高于第二预设值时,按照第二管理规则,根据所述当前数据的映射状态,将所述当前数据转存至所述第二存储器和将所述头部数据转存至所述第一存储器,或保留所述当前数据在所述第二存储器内的原始存储位置和所述头部数据在所述第一存储器内的原始存储位置;
当所述当前数据的使用频率低于所述第二预设值时,按照第三管理规则,根据所述当前数据的映射状态,将所述当前数据和所述头部数据转存至所述第二存储器,或保留所述当前数据和所述头部数据在所述第二存储器内的原始存储位置。
如此设置,本发明提供的嵌入式设备的内存扩展方法,通过将所述当前数据的使用频率与所述第一预设值和所述第二预设值进行对比,利用对比结果和所述当前数据的映射状态,将使用频率高于所述第一预设值的所述当前数据和所述头部数据都存储在读写能力快的所述第一存储器(例如RAM存储器)内,由此保障了使用频率高的所述当前数据能够被快速读写。同时,由于所述第二存储器(例如Flash存储器)具有更大的存储空间,因此通过将使用频率低的所述当前数据存储至所述第二存储器内,使得所述嵌入式设备既能够进行大量的数据存储,且不影响使用频率高的所述当前数据的存储。由此,本发明提供的内存扩展方法,使得所述嵌入式设备不仅内存容量大,同时读写能力强以及使用成本低。
优选的,所述根据所述头部数据计算所述当前数据的使用频率,包括:
建立一动态处理任务,所述动态处理任务实时遍历第一内存管理链表和第二内存管理链表,获取所述当前数据的头部数据;
根据下式计算得到所述当前数据的使用频率:
k=n/t
式中,k为所述当前数据的使用频率,n为所述当前数据在所述第一存储器内和在所述第二存储器内的引用次数的和,t为所述当前数据在所述第一存储器内和在所述第二存储器内的存在时间的和。
由此,通过所述动态处理任务实时遍历所述第一内存管理链表和所述第二内存管理链表以找出所述头部数据,并根据所述头部数据获取所述当前数据在所述嵌入式设备内引用次数和存在时间,从而通过计算获取所述当前数据的使用频率。
优选的,所述预设存储规则,包括:
所述第一管理规则包括:获取所述当前数据的映射状态,当所述当前数据处于所述映射状态1时,将所述当前数据由所述第二存储器转存至所述第一存储器内,所述头部数据的原始存储位置不改变,并更新所述当前数据为所述映射状态0;当所述当前数据处于所述映射状态2时,将所述当前数据和所述头部数据均由所述第二存储器转存至所述第一存储器内,并更新所述当前数据为所述映射状态0;
所述第二管理规则包括:获取所述当前数据的映射状态,当所述当前数据处于所述映射状态0时,将所述当前数据由所述第一存储器转存至所述第二存储器,所述头部数据的原始存储位置不改变,并更新所述当前数据为所述映射状态1;当所述当前数据处于所述映射状态2时,将所述头部数据由所述第二存储器转存至所述第一存储器,所述当前数据的原始存储位置不改变,并更新所述当前数据为所述映射状态1;
所述第三管理规则包括:获取所述当前数据的映射状态,当所述当前数据处于所述映射状态0时,将所述当前数据和所述头部数据由所述第一存储器转存至所述第二存储器,并更新所述当前数据为所述映射状态2;当所述当前数据处于所述映射状态1时,将所述头部数据由所述第一存储器转存至所述第二存储器,所述当前数据的原始存储位置不改变,并更新所述当前数据为所述映射状态2。
如此设置,本发明提供的内存扩展方法,通过将所述当前数据的使用频率和所述第一预设值和所述第二预设值进行对比,并利用所述头部数据获取所述当前数据的映射状态,从而将使用频率高于所述第一预设值的所述当前数据和所述头部数据都存储在读写能力快的所述第一存储器内,由此保障了使用频率高的所述当前数据能够被快速读写。同时,由于所述第二存储器具有更大的存储空间,因此通过将使用频率低的所述当前数据存储至所述第二存储器内,使得所述嵌入式设备能够进行大量的数据存储,且不影响使用频率高的所述当前数据的存储。
优选的,当所述当前数据和/或所述头部数据的存储位置改变后,将同步更新第一内存管理链表和第二内存管理链表。由此,保障了后续对所述当前数据进行再次读写时,能够快速找到所述头部数据和所述当前数据。
优选的,当将所述当前数据转存至所述第一存储器内时,所述第一存储器内需具有满足所述当前数据的数据长度的内存块,否则,所述当前数据保留在所述第二存储器内的原始存储位置;当将所述当前数据转存至所述第二存储器内时,所述第二存储器内需具有满足所述当前数据的数据长度的存储空间,否则,所述当前数据保留在所述第一存储器内的原始存储位置。由此,避免将所述当前数据转存至第一存储器或第二存储器时,因无法获得相应存储器内满足所述当前数据的数据长度的内存块,而导致转存失败的问题。
优选的,还包括采用以下方式释放内存块:
根据所述头部数据获取所述当前数据的映射状态;
当所述当前数据处于所述映射状态0时,先释放存储所述当前数据的内存块,再释放存储所述头部数据的内存块,并更新第一内存管理链表;
当所述当前数据处于所述映射状态1时,先将第二内存管理链表中所述当前数据的使用状态更新为未使用状态,再释放存储所述头部数据的内存块,并同步更新第一内存管理链表;
当所述当前数据处于所述映射状态2时,将第二内存管理链表中所述头部数据的使用状态更新为未使用状态。
由此,通过将所述内存块进行释放,使得当进行新的当前数据的存储时,所述嵌入式设备内能够有足够的存储空间进行存储。
为了更便于理解本发明提供的嵌入式设备的内存扩展方法,内存管理时释放内存块的过程,以下以应用本发明提供的数据存储方法和内存扩展方法后的嵌入式设备的一场景示例说明。请参见附图2-附图5,其中,图2-图5示意性地给出了第一存储器和第二存储器释放前和释放后的示意图,结合图2-图5可以看出,在该应用场景中,当所述第一存储器为RAM存储器,所述第二存储器为Flash存储器,需要对RAM内存块2进行释放时,先去判断内存块2是否处于映射1状态。如图4所示,通过判断,此时所述RAM内存块2处于映射状态1,并映射到了存储空间2,此时,内存管理会将存储空间2的是否使用状态更新为未使用状态,以供后面其它当前数据进行存储使用,需要说明的是,如果有相邻的若干内存都被释放,由于内存块与内存块之间的地址是连续的,因此所有被释放的内存块将合并成一个新的内存块,此时Flash内存管理链表如图5所示,同时RAM内存块2也将被释放,释放后的RAM内存管理链表如图3所示。
另外,应当注意的是,在本文的实施方式中所揭露的系统和方法,也可以通过其他的方式实现。以上所描述的装置实施方式仅仅是示意性的,例如,附图中的流程图和框图显示了根据本文的多个实施方式的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用于执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。
综上,本发明提供的嵌入式设备的内存扩展方法,通过将所述头部数据存入所述第一存储器内,由于所述第一存储器(例如RAM存储器)具有更快的读写能力,因此,当将所述头部数据存入所述第一存储器后,能够快速从所述头部数据内获取所述当前数据的数据长度,以便对所述当前数据进行存储。同时,当所述第一存储器内空间不足时,能够将所述当前数据存储在所述第二存储器内,由于所述第二存储器(例如Flash存储器)具有更大的存储空间,因此本发明提供的内存扩展方法,使得所述嵌入式设备不仅内存容量大,而且读写能力强以及使用成本低。
上述仅为本发明的优选实施例而已,并不对本发明起到任何限制作用。任何所属技术领域的技术人员,在不脱离本发明的技术方案的范围内,对本发明揭露的技术方案和技术内容做任何形式的等同替换或修改等变动,均属未脱离本发明的技术方案的内容,仍属于本发明的保护范围之内。