一种应用于MCU的高效动态内存管理方法

阅读: 评论:0

著录项
  • CN201911031100.X
  • 20191028
  • CN110795247A
  • 20200214
  • 天津津航计算技术研究所
  • 王雨龙
  • G06F9/50
  • G06F9/50

  • 天津市东丽区空港经济区保税路357号
  • 天津(12)
  • 中国兵器工业集团公司专利中心
  • 刘二格
摘要
本发明属于计算机软件设计领域,公开了一种应用于小型MCU的高效动态内存申请方法,主要解决在小型MCU没有堆空间而动态管理内存的问题,本发明采用对大块内存块进行管理,保证内存在申请的释放的过程中碎片率低,使用MAT表标记内存块使用情况,并且在内存块查过程中采用MAT表匹配优化查速度。本发明提供了在全局区对要管理的全局内存初始化功能,内存动态申请功能,内存释放功能。该种方法占用系统资源少,执行效率高,内存碎片化率低,特别适用于内存资源紧张的小型MCU中。
权利要求

1.一种应用于MCU的高效动态内存管理方法,其特征在于,包括以下步骤:

步骤S1:采用多个字节内存块的形式对内存进行管理;

步骤S2:内存堆初始化;

步骤S3:内存堆申请;

步骤S4:内存堆释放。

2.如权利要求1所述的应用于MCU的高效动态内存管理方法,其特征在于,所述步骤S1中,每一个内存块单位为8字节,设计一个消息管理结构体HEAD_STRU,结构体含有两个成员变量,一个是偏移位置变量Offset,类型为unsigned short型,另一个成员为内存块的数量变量size,类型为unsigned short类型;定义一个数组作为被管理的内存堆:

Heap[BLOCK_NUM/8+BLOCK_NUM*BLOCK_SIZE]

BLOCK_NUM为块数量,BLOCK_SIZE为块大小,数组的类型为unsigned char型,内存堆的管理需要两个指针变量,定义MAT表首地址变量pMAT,变量类型为unsigned char*,定义MEM表首地址变量pMEM,变量类型也为unsigned char*。

3.如权利要求2所述的应用于MCU的高效动态内存管理方法,其特征在于,所述步骤S2中,内存堆初始化时,首先对所有需要管理的内存堆Heap数组进行清零操作,分别计算MAT表的首地址和MEM表的首地址,MAT表首地址为Heap数组的地址,MEM的首地址为Heap+BLOCK_NUM/8。

4.如权利要求3所述的应用于MCU的高效动态内存管理方法,其特征在于,所述步骤S3中,内存堆申请时,先计算申请空间所需要的块数,遍历寻一个连续的块符合申请块数,如果到连续的块数符合申请的块数,则将连续块的首地址返回,并将这几个块对应的MAT表位置标记为已使用,保存偏移值和块数信息到本次内存申请的头指针所指的位置。

5.如权利要求4所述的应用于MCU的高效动态内存管理方法,其特征在于,所述步骤S3中,内存堆申请操作流程包括以下步骤:

S31:判断申请的内存空间大小不能为0,且不能大于BLOCK_SIZE*8,否则返回空指针NULL;

S32:通过pMAT和pMEM是否为空指针来判断内存是否被初始化,如果未完成初始化则直接返回空指针NULL;

S33:计算申请空间需要的块数:

Num=(size+sizeof(HEAD_STRU)+BLOCK_SIZE-1)/8

S34:遍历连续的内存符合申请的块数,从0到BLOCK_NUM-1遍历寻没有被占用的块;如果寻到足够数量的连续块则执行STEP5,否则直接返回空指针;

S35:到足够数量的内存块,第一个内存块的偏移位置记为i,计算本次申请内存块头指针的值:ptr=pMEM+i*BLOCK_SIZE。将从i开始的当前块到i+Num这些空间都标志为已使用;

S36:将offset偏移地址和Num块大小记录到本次申请的内存头中,并将指针返回。

6.如权利要求5所述的应用于MCU的高效动态内存管理方法,其特征在于,所述步骤S4中,内存堆释放时,根据释放的指针到此次动态申请内存的管理头指针,获取偏移量及占用块的多少,清除占用空间,将对应的MAT表位置标记为未使用。

7.如权利要求6所述的应用于MCU的高效动态内存管理方法,其特征在于,所述步骤S4中,内存堆释放操作流程包括以下步骤:

S41:根据要释放的内存地址pFreeMem,向前偏移4个地址,到此次申请内存头信息的位置HeadPtr=(unsignedint*)pFreeMem;

S42:在内存的头信息中取出偏移值offset值和size值,将从offset开始到offset+sizeMAT表中占用标志清除。

说明书
技术领域

本发明属于计算机软件设计领域,涉及一种应用于MCU的高效动态内存管理方法。

由于嵌入式环境中,特别是小型MCU中拥有的系统资源通常比较小,尤其是珍贵的内存资源,因此内存的使用将成为嵌入式系统性能的关键,在一些传统的大型系统平台上软件设计中,经常会使用到C标准库的函数malloc来动态申请内存,这种方法申请的内存都是在堆中申请的内存,在一些小型MCU系统启动管理中没有对内存中进行堆栈的划分,因此不能使用malloc函数对内存进行管理,而且C标准库的动态内存申请方法实时性较差,使用后内存碎片率比较高。传统上小型MCU设计中偏向于使用静态内存,静态内存分配要求编译时将程序运行所需要的内存确定好,在整个程序运行过程中不再进行分配和释放。而动态内存分配可以根据程序执行过程中所需的内存大小在运行时进行分配。因此相比于静态分配,动态分配更加灵活,内存的利用率更高。在小型MCU中动态内存的使用对优秀的嵌入式设计意义重大。

为解决小型MCU中传统方法的实时性差、内存碎片率比较高和执行率低等问题,提出一种内动态内存管理的方法,使内存管理方法占用系统资源少,执行效率高,内存碎片化率低。

(二)技术方案

为了解决上述技术问题,本发明提供一种应用于MCU的高效动态内存管理方法,其包括以下步骤:

步骤S1:采用多个字节内存块的形式对内存进行管理;

步骤S2:内存堆初始化;

步骤S3:内存堆申请;

步骤S4:内存堆释放。

其中,所述步骤S1中,每一个内存块单位为8字节,设计一个消息管理结构体HEAD_STRU,结构体含有两个成员变量,一个是偏移位置变量Offset,类型为unsigned short型,另一个成员为内存块的数量变量size,类型为unsigned short类型;定义一个数组作为被管理的内存堆:

Heap[BLOCK_NUM/8+BLOCK_NUM*BLOCK_SIZE]

BLOCK_NUM为块数量,BLOCK_SIZE为块大小,数组的类型为unsigned char型,内存堆的管理需要两个指针变量,定义MAT表首地址变量pMAT,变量类型为unsigned char*,定义MEM表首地址变量pMEM,变量类型也为unsigned char*。

其中,所述步骤S2中,内存堆初始化时,首先对所有需要管理的内存堆Heap数组进行清零操作,分别计算MAT表的首地址和MEM表的首地址,MAT表首地址为Heap数组的地址,MEM的首地址为Heap+BLOCK_NUM/8。

其中,所述步骤S3中,内存堆申请时,先计算申请空间所需要的块数,遍历寻一个连续的块符合申请块数,如果到连续的块数符合申请的块数,则将连续块的首地址返回,并将这几个块对应的MAT表位置标记为已使用,保存偏移值和块数信息到本次内存申请的头指针所指的位置。

其中,所述步骤S3中,内存堆申请操作流程包括以下步骤:

S31:判断申请的内存空间大小不能为0,且不能大于BLOCK_SIZE*8,否则返回空指针NULL;

S32:通过pMAT和pMEM是否为空指针来判断内存是否被初始化,如果未完成初始化则直接返回空指针NULL;

S33:计算申请空间需要的块数:

Num=(size+sizeof(HEAD_STRU)+BLOCK_SIZE-1)/8

S34:遍历连续的内存符合申请的块数,从0到BLOCK_NUM-1遍历寻没有被占用的块;如果寻到足够数量的连续块则执行STEP5,否则直接返回空指针;

S35:到足够数量的内存块,第一个内存块的偏移位置记为i,计算本次申请内存块头指针的值:ptr=pMEM+i*BLOCK_SIZE。将从i开始的当前块到i+Num这些空间都标志为已使用;

S36:将offset偏移地址和Num块大小记录到本次申请的内存头中,并将指针返回。

其中,所述步骤S4中,内存堆释放时,根据释放的指针到此次动态申请内存的管理头指针,获取偏移量及占用块的多少,清除占用空间,将对应的MAT表位置标记为未使用。

其中,所述步骤S4中,内存堆释放操作流程包括以下步骤:

S41:根据要释放的内存地址pFreeMem,向前偏移4个地址,到此次申请内存头信息的位置HeadPtr=(unsigned int*)pFreeMem;

S42:在内存的头信息中取出偏移值offset值和size值,将从offset开始到offset+sizeMAT表中占用标志清除。

(三)有益效果

上述技术方案所提供的应用于MCU的高效动态内存管理方法,占用系统资源少,执行效率高,内存碎片化率低,特别适用于内存资源紧张的小型MCU中。

图1为本发明动态内存申请初始化方法流程图。

图2为本发明动态内存申请内存获取方法流程图。

图3为本发明动态内存申请内存释放方法流程图。

为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

结合图1,为了解决小型MCU系统中堆内存的实时性差、内存碎片率比较高和执行率低等问题,本发明提供一种高效的动态内存管理方法,此方法占用系统资源少,执行效率高,内存碎片化率低。

本发明方法的具体过程为:

步骤S1:采用多个字节内存块的形式对内存进行管理

每一个内存块单位为8字节,内存块的方法有效提高内存申请释放的效率,内存申请释放时,设计一个消息管理结构体HEAD_STRU,结构体含有两个成员变量,一个是偏移位置变量Offset,类型为unsigned short型,另一个成员为内存块的数量变量size,类型为unsigned short类型。

在小型MCU系统中使用时需要定义一个数组作为被管理的内存堆:

Heap[BLOCK_NUM/8+BLOCK_NUM*BLOCK_SIZE]

BLOCK_NUM为块数量,BLOCK_SIZE为块大小,数组的类型为unsigned char型,内存堆的管理需要两个指针变量,定义MAT表首地址变量pMAT,变量类型为unsigned char*,定义MEM表首地址变量pMEM,变量类型也为unsigned char*。

步骤S2:内存堆初始化

首先建立一个内存全局数组,数组的大小为要维护的内存堆的大小。堆内存管理采用内存块的方法,最小的的内存单位是一个内存块。

初始化首先对所有需要管理的内存堆Heap数组进行清零操作,分别计算MAT表的首地址和MEM表的首地址,MAT表首地址为Heap数组的地址,MEM的首地址为Heap+BLOCK_NUM/8。

步骤S3:内存堆申请

内存堆初始化后,先计算申请空间所需要的块数,遍历寻一个连续的块符合申请块数,如果到连续的块数符合申请的块数,则将连续块的首地址返回,并将这几个块对应的MAT表位置标记为已使用,保存偏移值和块数信息到本次内存申请的头指针所指的位置。

对于内存申请操作,和C标准库实现的malloc函数类似,参数为申请的内存大小size,以字节为单位具体实施流程如下:

S31:判断申请的内存空间大小不能为0,且不能大于BLOCK_SIZE*8,否则返回空指针NULL。

S32:通过PMAT和pMEM是否为空指针来判断内存是否被初始化,如果未完成初始化则直接返回空指针NULL。

S33:计算申请空间需要的块数:

Num=(size+sizeof(HEAD_STRU)+BLOCK_SIZE-1)/8

S34:遍历连续的内存符合申请的块数,从0到BLOCK_NUM-1遍历寻没有被占用的块;如果寻到足够数量的连续块则执行STEP5,否则直接返回空指针。

S35:到足够数量的内存块,第一个内存块的偏移位置记为i,计算本次申请内存块头指针的值:ptr=pMEM+i*BLOCK_SIZE。将从i开始的当前块到i+Num这些空间都标志为已使用。

S36:将offset偏移地址和Num块大小记录到本次申请的内存头中,并将指针返回。

步骤S4:内存堆释放

根据释放的指针到此次动态申请内存的管理头指针,获取偏移量及占用块的多少;清除占用空间,将对应的MAT表位置标记为未使用。具体过程如下:

S41:根据要释放的内存地址pFreeMem,向前偏移4个地址,到此次申请内存头信息的位置HeadPtr=(unsigned int*)pFreeMem--

S42:在内存的头信息中取出偏移值offset值和size值,将从offset开始到offset+sizeMAT表中占用标志清除。

利用上述技术方案,本发明可以实现应用于小型MCU的高效动态内存管理,该方法已经经过了理论论证,并进行了实验测试。结果表明,该方案占用系统资源少,执行效率高,内存碎片化率低,在内存资源紧张的小型MCU中可以进行高效的内存管理。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

本文发布于:2023-04-15 04:34:35,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/86946.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图