CN110795247B - 一种应用于mcu的高效动态内存管理方法 - Google Patents
一种应用于mcu的高效动态内存管理方法 Download PDFInfo
- Publication number
- CN110795247B CN110795247B CN201911031100.XA CN201911031100A CN110795247B CN 110795247 B CN110795247 B CN 110795247B CN 201911031100 A CN201911031100 A CN 201911031100A CN 110795247 B CN110795247 B CN 110795247B
- Authority
- CN
- China
- Prior art keywords
- memory
- block
- blocks
- heap
- application
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
- Memory System (AREA)
Abstract
本发明属于计算机软件设计领域,公开了一种应用于小型MCU的高效动态内存申请方法,主要解决在小型MCU没有堆空间而动态管理内存的问题,本发明采用对大块内存块进行管理,保证内存在申请的释放的过程中碎片率低,使用MAT表标记内存块使用情况,并且在内存块查找过程中采用MAT表匹配优化查找速度。本发明提供了在全局区对要管理的全局内存初始化功能,内存动态申请功能,内存释放功能。该种方法占用系统资源少,执行效率高,内存碎片化率低,特别适用于内存资源紧张的小型MCU中。
Description
技术领域
本发明属于计算机软件设计领域,涉及一种应用于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中可以进行高效的内存管理。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (1)
1.一种应用于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遍历寻找没有被占用的块;如果寻找到足够数量的连续块则执行步骤S35,否则直接返回空指针;
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表中占用标志清除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911031100.XA CN110795247B (zh) | 2019-10-28 | 2019-10-28 | 一种应用于mcu的高效动态内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911031100.XA CN110795247B (zh) | 2019-10-28 | 2019-10-28 | 一种应用于mcu的高效动态内存管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110795247A CN110795247A (zh) | 2020-02-14 |
CN110795247B true CN110795247B (zh) | 2023-06-30 |
Family
ID=69441675
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911031100.XA Active CN110795247B (zh) | 2019-10-28 | 2019-10-28 | 一种应用于mcu的高效动态内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110795247B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113032291B (zh) * | 2021-03-31 | 2023-05-26 | 四川长虹空调有限公司 | 查找数据与改写数据的方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101950272A (zh) * | 2010-09-10 | 2011-01-19 | 北京捷通华声语音技术有限公司 | 一种嵌入式系统中内存管理的方法和装置 |
CN103077126A (zh) * | 2012-12-24 | 2013-05-01 | 中兴通讯股份有限公司 | 一种内存管理方法和装置 |
CN104850505A (zh) * | 2015-05-26 | 2015-08-19 | 左应鹏 | 基于链式堆叠的内存管理方法与系统 |
WO2016173172A1 (zh) * | 2015-04-29 | 2016-11-03 | 中兴通讯股份有限公司 | 堆内存操作的检测方法及装置 |
CN106326004A (zh) * | 2016-08-17 | 2017-01-11 | 中国航空工业集团公司西安飞行自动控制研究所 | 一种嵌入式数据库的动态内存分配方法 |
-
2019
- 2019-10-28 CN CN201911031100.XA patent/CN110795247B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101950272A (zh) * | 2010-09-10 | 2011-01-19 | 北京捷通华声语音技术有限公司 | 一种嵌入式系统中内存管理的方法和装置 |
CN103077126A (zh) * | 2012-12-24 | 2013-05-01 | 中兴通讯股份有限公司 | 一种内存管理方法和装置 |
WO2016173172A1 (zh) * | 2015-04-29 | 2016-11-03 | 中兴通讯股份有限公司 | 堆内存操作的检测方法及装置 |
CN104850505A (zh) * | 2015-05-26 | 2015-08-19 | 左应鹏 | 基于链式堆叠的内存管理方法与系统 |
CN106326004A (zh) * | 2016-08-17 | 2017-01-11 | 中国航空工业集团公司西安飞行自动控制研究所 | 一种嵌入式数据库的动态内存分配方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110795247A (zh) | 2020-02-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6105040A (en) | Method and apparatus for managing stored objects | |
WO2016041401A1 (zh) | 向缓存中写入数据的方法及装置 | |
US8527559B2 (en) | Garbage collector with concurrent flipping without read barrier and without verifying copying | |
WO2008148704A1 (en) | Arrangements for memory allocation | |
US20240338135A1 (en) | Storage space allocation method, terminal device and storage medium | |
EP2558940A1 (en) | Thread-local hash table based write barrier buffers | |
US11385900B2 (en) | Accessing queue data | |
CN115237599B (zh) | 一种渲染任务处理方法和装置 | |
CN110795247B (zh) | 一种应用于mcu的高效动态内存管理方法 | |
CN103425729A (zh) | 管理计算机系统中的内存 | |
CN105205178A (zh) | 一种多进程访问内存数据库系统 | |
CN107590077B (zh) | 一种Spark负载访存行为追踪方法及装置 | |
CN112380004B (zh) | 内存管理方法、装置、计算机可读存储介质及电子设备 | |
CN112069088B (zh) | 一种地址映射管理方法及相关装置、设备 | |
Chen et al. | A unified framework for designing high performance in-memory and hybrid memory file systems | |
CN109445693A (zh) | 一种数据压缩方法和装置 | |
CN111126619B (zh) | 一种机器学习方法与装置 | |
CN102270179B (zh) | 用于cad系统的基于片元的数据存储和处理方法及其系统 | |
US8577936B2 (en) | Fixup cache tool for object memory compaction in an information handling system | |
CN109871355B (zh) | 一种快照元数据存储方法、装置及设备、介质 | |
CN110377601B (zh) | 一种基于B树数据结构的MapReduce计算过程优化方法 | |
CN105512049A (zh) | 一种存储器数据回收方法、装置及系统 | |
CN112783896B (zh) | 一种用于加载文件减少内存使用率的方法 | |
CN112988074B (zh) | 一种存储系统管理软件适配方法及装置 | |
CN103077029B (zh) | 一种导入表的修复方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |