CN103678152A - 一种小内存微型控制器零碎片的动态内存分配方法 - Google Patents
一种小内存微型控制器零碎片的动态内存分配方法 Download PDFInfo
- Publication number
- CN103678152A CN103678152A CN201410008273.0A CN201410008273A CN103678152A CN 103678152 A CN103678152 A CN 103678152A CN 201410008273 A CN201410008273 A CN 201410008273A CN 103678152 A CN103678152 A CN 103678152A
- Authority
- CN
- China
- Prior art keywords
- memory
- internal memory
- internal
- address
- pointer
- 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.)
- Pending
Links
Images
Landscapes
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本发明公开了一种小内存微型控制器零碎片的动态内存分配方法,通过内存初始化、内存分配、内存释放三个步骤,有效地利用了微控制器非常有限的内存资源,更大地发挥了内存的利用率,不再产生内存碎片,从而更好地保证了嵌入式系统的高稳定可靠性,同时,本发明方法也解决了使用堆栈方式造成溢出错误导致了系统崩溃的风险。
Description
技术领域
本发明涉及小内存微型控制器内存分配的技术领域,尤其是指一种小内存微型控制器零碎片的动态内存分配方法。
背景技术
业内习知,MCU(微控制器)的RAM(内存)资源非常有限,例如MSC51(微控制器的一个种类)系列只有128字节(内存容量单位),AVR(微控制器的一个种类)系列最大可到4096字节,为了嵌入式系统能更有效的使用有限的内存空间,提高小内存的分配及回收率,防止内存碎片导致了系统任务因无法分配内存而使系统崩溃,系统崩溃可能会造成人身安全、重大经济损失。目前单片机的内存分配主要有以下两种:
1、静态分配法:
将内存固定分配给需要使用的任务。静态分配内存会受到任务多少的影响,任务少不能充分发挥MCU的性能,任务多了内存不够使用,这种方法的优点是不产生内存碎片,缺点是严重影响了MCU性能的发挥,能运行的任务相对较少,典型的吃得多,做的少。
2、数组分配法:
数组分配法是使用静态分配的方法,分配一个较大的全局数组变量,当某个任务需要分配内存时,从这个数组内取出相应的内存段,并标记本内存已经被分配,当本内存段未被释放之前,不能再次被分配,当任务使用完成内存需要,执行释放内存,本段内存清除标志状态,以供下一任务分配使用。数组分配法的优点是结构简单,容易实现;缺点是非常容易产生内存碎片,当每次分配及释放的内存长度不一致时,现象更加严重,这样的系统运行的时间越长,内存碎片会越多,出现系统崩溃的可能越大,也可能造成极少的内存分配也会失败。
在实际应用中,上述两种方法都会遇到诸多限制。故此,现有技术中的内存分配方法有待于进一步改善。
发明内容
本发明的目的在于克服现有技术的不足,提供一种高效合理的小内存微型控制器零碎片的动态内存分配方法,能有效地防止产生内存碎片,提高嵌入式系统在工业控制的稳定可靠性。
为实现上述目的,本发明所提供的技术方案为:一种小内存微型控制器零碎片的动态内存分配方法,包括以下步骤:
1)内存初始化
在内存初始化的过程中,指定内存的起始地址和内存最大分配长度,记录内存的起始地址、结束地址和内存长度,并将内存指针pt指向内存起始地址,同时将内存指针pt的值等于NULL,完成初始化;
2)内存分配
从内存起始地址开始,查找内存指针pt等于NULL的地方,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则将内存指针pt地址的数据内容指向下一个可以动态分配内存的内存指针ptn,n=1,2,3…,n的地址,设当前分配成功的内存单元为memn,n=1,2,3…,n,内存指针pt地址的数据内容则需要指向相应内存指针ptn的地址,而内存指针ptn地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;往后,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败;
3)内存释放
判断释放的内存是否是最后一次分配的内存,若是,在释放该内存时,则需要直接找到该内存的起始地址,通过内存指针pt找到相应的内存指针ptn,n=1,2,3…,n;由于内存指针ptn等于NULL,则将内存指针ptn的前一个内存指针ptn-1等于NULL,以便下次分配内存从此开始;若不是,则需要将该内存移动,以实现零碎片。
在步骤2)中:
当第一次需要分配内存单元mem1,即n=1时,找到内存指针pt,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,内存指针pt地址的数据内容则需要指向相应内存指针pt1的地址,pt1地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;
当第二次需要分配内存单元mem2,即n=2时,找到内存指针pt,发现pt的数据等于pt1,则再查找pt1,发现pt1的数据内容等于NULL,计算内存单元mem2所需要的内存是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则从pt1作为起始地址,分配内存单元mem2的空间,此时,pt1地址的数据内容等于pt2的地址,pt2地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;
当第三次需要分配内存单元mem3,即n=3时,找到内存指针pt,根据pt的内容找到pt1,再根据pt1的内容找到pt2,由于pt2等于NULL,则内存单元mem3从是pt2开始分配,如果内存单元mem3所需的内存小于或等于空闲剩余内存,则从pt2作为起始地址,分配内存单元mem3的空间,pt2地址的数据内容等于pt3的地址,pt3地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;
以此类推,按照上述方法,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败。
在步骤3)中,当需要将内存移动时,如下:
将需释放的内存单元memn,n=1,2,3…,n的起始地址开始存放最后一次分配的内存单元memn+n,n=1,2,3…,n的地址内容,直到最后一次分配的内存单元存放完毕为止,之后新的空闲内存指针则为ptn+1,将第一次分配的内存单元的内存指针pt1指向ptn+1,ptn+1等于NULL,下次分配则从ptn+1开始分配,到达了空闲内存最大化的目的,进而实现了零内存碎片的释放。
本发明与现有技术相比,具有如下优点与有益效果:
1、本发明通过内存的分配与释放的算法,实现零碎片的使用方法,提高了微型单片机内存的使用率,可以提高微型单片机系统的稳定性;
2、本发明补偿了内存碎片的缺陷,也解决了使用堆栈方式造成溢出错误导致了系统崩溃的风险。
附图说明
图1为本发明内存分配示意图。
图2为本发明第一次需要分配内存单元mem1时的示意图。
图3为本发明第二次需要分配内存单元mem2时的示意图。
图4为本发明第三次需要分配内存单元mem3时的示意图。
图5为本发明释放的内存是最后一次分配的内存时的示意图。
图6为本发明将内存移动的流程图。
具体实施方式
下面结合具体实施例对本发明作进一步说明。
本实施例所述的小内存微型控制器零碎片的动态内存分配方法,其具体情况如下:
1)内存初始化mem_init
在内存初始化的过程中,指定内存的起始地址和内存最大分配长度,如图1所示,记录内存的起始地址、结束地址和内存长度,并将pt(内存指针)指向内存起始地址,同时将pt的值等于NULL(空闲),完成初始化。
2)内存分配mem_melloc
从内存起始地址开始,查找内存指针pt等于NULL的地方,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则将内存指针pt地址的数据内容指向下一个可以动态分配内存的内存指针ptn,n=1,2,3…,n的地址,设当前分配成功的内存单元为memn,n=1,2,3…,n,内存指针pt地址的数据内容则需要指向相应内存指针ptn的地址,而内存指针ptn地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功。
当第一次需要分配内存单元mem1,即n=1时,如图2所示,找到内存指针pt,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,内存指针pt地址的数据内容则需要指向相应内存指针pt1的地址,pt1地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功。
当第二次需要分配内存单元mem2,即n=2时,如图3所示,找到内存指针pt,发现pt的数据等于pt1,则再查找pt1,发现pt1的数据内容等于NULL,计算内存单元mem2所需要的内存是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则从pt1作为起始地址,分配内存单元mem2的空间,此时,pt1地址的数据内容等于pt2的地址,pt2地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功。
当第三次需要分配内存单元mem3,即n=3时,如图4所示,找到内存指针pt,根据pt的内容找到pt1,再根据pt1的内容找到pt2,由于pt2等于NULL,则内存单元mem3从是pt2开始分配,如果内存单元mem3所需的内存小于或等于空闲剩余内存,则从pt2作为起始地址,分配内存单元mem3的空间,pt2地址的数据内容等于pt3的地址,pt3地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功。
以此类推,按照上述方法,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败。
3)内存释放mem_free
如果释放的内存是最后一次分配的内存,如图4所示内存分布情况中,此时需要释放内存单元mem3时,则直接找到内存单元mem3的起始地址,通过pt找到pt1,pt1找到pt2,pt2找到pt3,由于pt3等于NULL,则将pt2等于NULL,以便下次分配内存从此开始,如图5所示。
如果当前需要释放的内存不是最后一次分配的内存,此时则需要将内存移动,实现零碎片。例如释放内存单元mem2,由于内存单元mem2在mem1和mem3之间,如果直接释放,势必会产生mem2这段内存碎片,但我们可以通过如图6所示的流程方法来实现释放内存则不产生内存碎片,将内存单元mem2的内存起始地址开始存放内存单元mem3的地址内容,直到内存单元mem3存放完毕为止,之后新的空闲内存指针则为pt4,则将第一次分配的内存单元的pt1指向pt4,pt4等于NULL,下次分配则从pt4开始分配,到达了空闲内存最大化的目的,实现了零内存碎片的释放。
由此可见,本发明方法在内存的分配和释放过程,未产生一个单元的内存碎片,这相比现有技术,本发明方法有效地利用了微控制器非常有限的内存资源,更大地发挥了内存的利用率,不再产生内存碎片,从而更好地保证了嵌入式系统的高稳定可靠性,同时,本发明方法也解决了使用堆栈方式造成溢出错误导致了系统崩溃的风险,具有内存使用率高、实用性强等优点,值得推广。
以上所述之实施例子只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。
Claims (3)
1.一种小内存微型控制器零碎片的动态内存分配方法,其特征在于,包括以下步骤:
1)内存初始化
在内存初始化的过程中,指定内存的起始地址和内存最大分配长度,记录内存的起始地址、结束地址和内存长度,并将内存指针pt指向内存起始地址,同时将内存指针pt的值等于NULL,完成初始化;
2)内存分配
从内存起始地址开始,查找内存指针pt等于NULL的地方,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则将内存指针pt地址的数据内容指向下一个可以动态分配内存的内存指针ptn,n=1,2,3…,n的地址,设当前分配成功的内存单元为memn,n=1,2,3…,n,内存指针pt地址的数据内容则需要指向相应内存指针ptn的地址,而内存指针ptn地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;往后,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败;
3)内存释放
判断释放的内存是否是最后一次分配的内存,若是,在释放该内存时,则需要直接找到该内存的起始地址,通过内存指针pt找到相应的内存指针ptn,n=1,2,3…,n;由于内存指针ptn等于NULL,则将内存指针ptn的前一个内存指针ptn-1等于NULL,以便下次分配内存从此开始;若不是,则需要将该内存移动,以实现零碎片。
2.根据权利要求1所述的一种小内存微型控制器零碎片的动态内存分配方法,其特征在于,在步骤2)中:
当第一次需要分配内存单元mem1,即n=1时,找到内存指针pt,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,内存指针pt地址的数据内容则需要指向相应内存指针pt1的地址,pt1地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;
当第二次需要分配内存单元mem2,即n=2时,找到内存指针pt,发现pt的数据等于pt1,则再查找pt1,发现pt1的数据内容等于NULL,计算内存单元mem2所需要的内存是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则从pt1作为起始地址,分配内存单元mem2的空间,此时,pt1地址的数据内容等于pt2的地址,pt2地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;
当第三次需要分配内存单元mem3,即n=3时,找到内存指针pt,根据pt的内容找到pt1,再根据pt1的内容找到pt2,由于pt2等于NULL,则内存单元mem3从是pt2开始分配,如果内存单元mem3所需的内存小于或等于空闲剩余内存,则从pt2作为起始地址,分配内存单元mem3的空间,pt2地址的数据内容等于pt3的地址,pt3地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;
以此类推,按照上述方法,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败。
3.根据权利要求1所述的一种小内存微型控制器零碎片的动态内存分配方法,其特征在于,在步骤3)中,当需要将内存移动时,如下:
将需释放的内存单元memn,n=1,2,3…,n的起始地址开始存放最后一次分配的内存单元memn+n,n=1,2,3…,n的地址内容,直到最后一次分配的内存单元存放完毕为止,之后新的空闲内存指针则为ptn+1,将第一次分配的内存单元的内存指针pt1指向ptn+1,ptn+1等于NULL,下次分配则从ptn+1开始分配,到达了空闲内存最大化的目的,进而实现了零内存碎片的释放。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410008273.0A CN103678152A (zh) | 2014-01-08 | 2014-01-08 | 一种小内存微型控制器零碎片的动态内存分配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410008273.0A CN103678152A (zh) | 2014-01-08 | 2014-01-08 | 一种小内存微型控制器零碎片的动态内存分配方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103678152A true CN103678152A (zh) | 2014-03-26 |
Family
ID=50315783
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410008273.0A Pending CN103678152A (zh) | 2014-01-08 | 2014-01-08 | 一种小内存微型控制器零碎片的动态内存分配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103678152A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104090848A (zh) * | 2014-07-16 | 2014-10-08 | 云南大学 | 一种周期性大数据处理的内存管理方法及装置 |
CN113032291A (zh) * | 2021-03-31 | 2021-06-25 | 四川长虹空调有限公司 | 优化数据内存分配的方法、及查找数据与改写数据的方法 |
CN113419858A (zh) * | 2021-06-30 | 2021-09-21 | 明见(厦门)技术有限公司 | 一种动态内存分配方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101266575A (zh) * | 2007-03-13 | 2008-09-17 | 中兴通讯股份有限公司 | 一种提高内存池利用率的方法 |
CN102968378A (zh) * | 2012-10-23 | 2013-03-13 | 深圳市融创天下科技股份有限公司 | 一种内存分配和释放的方法、装置及系统 |
US20130198480A1 (en) * | 2012-01-30 | 2013-08-01 | Stephen Jones | Parallel Dynamic Memory Allocation Using A Lock-Free FIFO |
-
2014
- 2014-01-08 CN CN201410008273.0A patent/CN103678152A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101266575A (zh) * | 2007-03-13 | 2008-09-17 | 中兴通讯股份有限公司 | 一种提高内存池利用率的方法 |
US20130198480A1 (en) * | 2012-01-30 | 2013-08-01 | Stephen Jones | Parallel Dynamic Memory Allocation Using A Lock-Free FIFO |
CN102968378A (zh) * | 2012-10-23 | 2013-03-13 | 深圳市融创天下科技股份有限公司 | 一种内存分配和释放的方法、装置及系统 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104090848A (zh) * | 2014-07-16 | 2014-10-08 | 云南大学 | 一种周期性大数据处理的内存管理方法及装置 |
CN113032291A (zh) * | 2021-03-31 | 2021-06-25 | 四川长虹空调有限公司 | 优化数据内存分配的方法、及查找数据与改写数据的方法 |
CN113419858A (zh) * | 2021-06-30 | 2021-09-21 | 明见(厦门)技术有限公司 | 一种动态内存分配方法 |
CN113419858B (zh) * | 2021-06-30 | 2024-02-13 | 明见(厦门)技术有限公司 | 一种动态内存分配方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10082982B2 (en) | Data backup method and apparatus, data restoration method and apparatus, and server | |
WO2016011811A1 (zh) | 一种内存管理方法、装置及存储介质 | |
CN103150257A (zh) | 一种内存管理方法和装置 | |
US20130326121A1 (en) | Data-storage device and flash memory control method | |
US20120304019A1 (en) | Method and apparatus for memory dump processing and a memory dump system | |
US20130060992A1 (en) | Data compression method | |
CN104731799A (zh) | 内存数据库管理装置 | |
KR20150095781A (ko) | 메모리 리클레임 방법 및 장치 | |
WO2016112713A1 (zh) | 一种对内存中内存页的处理方法及装置 | |
CN103678152A (zh) | 一种小内存微型控制器零碎片的动态内存分配方法 | |
CN101599046A (zh) | 一种内存检测方法及装置 | |
CN105280215A (zh) | 动态随机存取存储器dram的刷新方法、设备以及系统 | |
CN103186469A (zh) | 内存分配方法及装置、内存的回收方法 | |
CN104731794A (zh) | 一种冷热数据分片挖掘存储方法 | |
CN103295632A (zh) | 防止意外掉电引起线性累计数据突变的方法 | |
CN105260128A (zh) | 一种将数据写入存储设备的方法及存储设备 | |
CN103425605A (zh) | 一种固态硬盘掉电保护及快速启动方法、系统 | |
CN103064804A (zh) | 磁盘数据的访问控制方法及装置 | |
CN105786725A (zh) | 基于异构混合内存的内存管理方法和系统 | |
WO2015156830A1 (en) | Relocating a virtual address in a persistent memory | |
CN106326004A (zh) | 一种嵌入式数据库的动态内存分配方法 | |
CN103617123A (zh) | 一种通过内存块实现内存管理的方法及系统 | |
CN103488577A (zh) | 一种基于用途编号的用户程序内存分配及批量回收的方法及装置 | |
CN103778120A (zh) | 全局文件标识生成方法、生成装置及相应的分布式文件系统 | |
CN102214147A (zh) | 一种检测内存访问越界的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20140326 |
|
WD01 | Invention patent application deemed withdrawn after publication |