一种小内存微型控制器零碎片的动态内存分配方法

文档序号:6535247阅读:152来源:国知局
一种小内存微型控制器零碎片的动态内存分配方法
【专利摘要】本发明公开了一种小内存微型控制器零碎片的动态内存分配方法,通过内存初始化、内存分配、内存释放三个步骤,有效地利用了微控制器非常有限的内存资源,更大地发挥了内存的利用率,不再产生内存碎片,从而更好地保证了嵌入式系统的高稳定可靠性,同时,本发明方法也解决了使用堆栈方式造成溢出错误导致了系统崩溃的风险。
【专利说明】一种小内存微型控制器零碎片的动态内存分配方法
【技术领域】
[0001]本发明涉及小内存微型控制器内存分配的【技术领域】,尤其是指一种小内存微型控制器零碎片的动态内存分配方法。
【背景技术】
[0002]业内习知,MCU (微控制器)的RAM (内存)资源非常有限,例如MSC51 (微控制器的一个种类)系列只有128字节(内存容量单位),AVR (微控制器的一个种类)系列最大可到4096字节,为了嵌入式系统能更有效的使用有限的内存空间,提高小内存的分配及回收率,防止内存碎片导致了系统任务因无法分配内存而使系统崩溃,系统崩溃可能会造成人身安全、重大经济损失。目前单片机的内存分配主要有以下两种:
[0003]1、静态分配法:
[0004]将内存固定分配给需要使用的任务。静态分配内存会受到任务多少的影响,任务少不能充分发挥MCU的性能,任务多了内存不够使用,这种方法的优点是不产生内存碎片,缺点是严重影响了 MCU性能的发挥,能运行的任务相对较少,典型的吃得多,做的少。
[0005]2、数组分配法:
[0006]数组分配法是使用静态分配的方法,分配一个较大的全局数组变量,当某个任务需要分配内存时,从这个数组内取出相应的内存段,并标记本内存已经被分配,当本内存段未被释放之前,不能再次被分配,当任务使用完成内存需要,执行释放内存,本段内存清除标志状态,以供下一任务分配使用。数组分配法的优点是结构简单,容易实现;缺点是非常容易产生内存碎片,当每次分配及释放的内存长度不一致时,现象更加严重,这样的系统运行的时间越长,内存碎片会越多,出现系统崩溃的可能越大,也可能造成极少的内存分配也会失败。
[0007]在实际应用中,上述两种方法都会遇到诸多限制。故此,现有技术中的内存分配方法有待于进一步改善。

【发明内容】

[0008]本发明的目的在于克服现有技术的不足,提供一种高效合理的小内存微型控制器零碎片的动态内存分配方法,能有效地防止产生内存碎片,提高嵌入式系统在工业控制的
稳定可靠性。
[0009]为实现上述目的,本发明所提供的技术方案为:一种小内存微型控制器零碎片的动态内存分配方法,包括以下步骤:
[0010]1)内存初始化
[0011]在内存初始化的过程中,指定内存的起始地址和内存最大分配长度,记录内存的起始地址、结束地址和内存长度,并将内存指针pt指向内存起始地址,同时将内存指针pt的值等于NULL,完成初始化;
[0012]2)内存分配[0013]从内存起始地址开始,查找内存指针pt等于NULL的地方,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则将内存指针pt地址的数据内容指向下一个可以动态分配内存的内存指针ptn, n=l, 2,3...,η的地址,设当前分配成功的内存单元为memn,n=l, 2,3...,η,内存指针pt地址的数据内容则需要指向相应内存指针ptn的地址,而内存指针ptn地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;往后,每次内存分配都会从内存指针Pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败;
[0014]3)内存释放
[0015]判断释放的内存是否是最后一次分配的内存,若是,在释放该内存时,则需要直接找到该内存的起始地址,通过内存指针pt找到相应的内存指针ptn, n=l, 2,3...,η ;由于内存指针ptn等于NULL,则将内存指针ptn的前一个内存指针ptn_l等于NULL,以便下次分配内存从此开始;若不是,则需要将该内存移动,以实现零碎片。
[0016]在步骤2)中:
[0017]当第一次需要分配内存单元meml,即n=l时,找到内存指针pt,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,内存指针pt地址的数据内容则需要指向相应内存指针ptl的地址,ptl地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;
[0018]当第二次需要分配内存单元mem2,即n=2时,找到内存指针pt,发现pt的数据等于ptl,则再查找ptl,发现ptl的数据内容等于NULL,计算内存单元mem2所需要的内存是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则从ptl作为起始地址,分配内存单元mem2的空间,此时,ptl地址的数据内容等于pt2的地址,pt2地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;
[0019]当第三次需要分配内存单元mem3,即n=3时,找到内存指针pt,根据pt的内容找到ptl,再根据ptl的内容找到pt2,由于pt2等于NULL,贝U内存单元mem3从是pt2开始分配,如果内存单元mem3所需的内存小于或等于空闲剩余内存,则从pt2作为起始地址,分配内存单元mem3的空间,pt2地址的数据内容等于pt3的地址,pt3地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;
[0020]以此类推,按照上述方法,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败。
[0021]在步骤3)中,当需要将内存移动时,如下:
[0022]将需释放的内存单元memn, n=l, 2,3…,η的起始地址开始存放最后一次分配的内存单元memn+n,n=l, 2,3...,η的地址内容,直到最后一次分配的内存单元存放完毕为止,之后新的空闲内存指针则为ptn+Ι,将第一次分配的内存单元的内存指针ptl指向ptn+1, ptn+1等于NULL,下次分配则从ptn+Ι开始分配,到达了空闲内存最大化的目的,进而实现了零内存碎片的释放。
[0023]本发明与现有技术相比,具有如下优点与有益效果:·[0024]1、本发明通过内存的分配与释放的算法,实现零碎片的使用方法,提高了微型单片机内存的使用率,可以提高微型单片机系统的稳定性;[0025]2、本发明补偿了内存碎片的缺陷,也解决了使用堆栈方式造成溢出错误导致了系统崩溃的风险。
【专利附图】

【附图说明】
[0026]图1为本发明内存分配示意图。
[0027]图2为本发明第一次需要分配内存单元meml时的示意图。
[0028]图3为本发明第二次需要分配内存单元mem2时的示意图。
[0029]图4为本发明第三次需要分配内存单元mem3时的示意图。
[0030]图5为本发明释放的内存是最后一次分配的内存时的示意图。
[0031 ]图6为本发明将内存移动的流程图。
【具体实施方式】
[0032]下面结合具体实施例对本发明作进一步说明。
[0033]本实施例所述的小内存微型控制器零碎片的动态内存分配方法,其具体情况如下:
[0034]1)内存初始化 mem_init
[0035]在内存初始化的过程中,指定内存的起始地址和内存最大分配长度,如图1所示,记录内存的起始地址、结束地址和内存长度,并将pt (内存指针)指向内存起始地址,同时将Pt的值等于NULL (空闲),完成初始化。
[0036]2)内存分配 mem_melloc
[0037]从内存起始地址开始,查找内存指针pt等于NULL的地方,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则将内存指针pt地址的数据内容指向下一个可以动态分配内存的内存指针ptn, n=l, 2,3...,η的地址,设当前分配成功的内存单元为memn,n=l, 2,3...,η,内存指针pt地址的数据内容则需要指向相应内存指针ptn的地址,而内存指针ptn地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功。
[0038]当第一次需要分配内存单元meml,即n=l时,如图2所示,找到内存指针pt,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,内存指针Pt地址的数据内容则需要指向相应内存指针ptl的地址,ptl地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功。
[0039]当第二次需要分配内存单元mem2,即n=2时,如图3所示,找到内存指针pt,发现pt的数据等于ptl,则再查找ptl,发现ptl的数据内容等于NULL,计算内存单元mem2所需要的内存是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则从ptl作为起始地址,分配内存单元mem2的空间,此时,ptl地址的数据内容等于pt2的地址,pt2地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功。
[0040]当第三次需要分配内存单元mem3,即n=3时,如图4所示,找到内存指针pt,根据pt的内容找到ptl,再根据ptl的内容找到pt2,由于pt2等于NULL,则内存单元mem3从是pt2开始分配,如果内存单元mem3所需的内存小于或等于空闲剩余内存,则从pt2作为起始地址,分配内存单元mem3的空间,pt2地址的数据内容等于pt3的地址,pt3地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功。
[0041]以此类推,按照上述方法,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败。
[0042]3)内存释放 mem_free
[0043]如果释放的内存是最后一次分配的内存,如图4所示内存分布情况中,此时需要释放内存单元mem3时,贝U直接找到内存单元mem3的起始地址,通过pt找到ptl, ptl找到pt2,pt2找到pt3,由于pt3等于NULL,则将pt2等于NULL,以便下次分配内存从此开始,如图5所示。
[0044]如果当前需要释放的内存不是最后一次分配的内存,此时则需要将内存移动,实现零碎片。例如释放内存单元mem2,由于内存单元mem2在meml和mem3之间,如果直接释放,势必会产生mem2这段内存碎片,但我们可以通过如图6所示的流程方法来实现释放内存则不产生内存碎片,将内存单元mem2的内存起始地址开始存放内存单元mem3的地址内容,直到内存单元mem3存放完毕为止,之后新的空闲内存指针则为pt4,则将第一次分配的内存单元的ptl指向pt4,pt4等于NULL,下次分配则从pt4开始分配,到达了空闲内存最大化的目的,实现了零内存碎片的释放。
[0045]由此可见,本发明方法在内存的分配和释放过程,未产生一个单元的内存碎片,这相比现有技术,本发明方法有效地利用了微控制器非常有限的内存资源,更大地发挥了内存的利用率,不再产生内存碎片,从而更好地保证了嵌入式系统的高稳定可靠性,同时,本发明方法也解决了使用堆栈方式造成溢出错误导致了系统崩溃的风险,具有内存使用率高、实用性强等优点,值得推广。
[0046]以上所述之实施例子只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。
【权利要求】
1.一种小内存微型控制器零碎片的动态内存分配方法,其特征在于,包括以下步骤:1)内存初始化在内存初始化的过程中,指定内存的起始地址和内存最大分配长度,记录内存的起始地址、结束地址和内存长度,并将内存指针pt指向内存起始地址,同时将内存指针Pt的值等于NULL,完成初始化;2)内存分配从内存起始地址开始,查找内存指针pt等于NULL的地方,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则将内存指针pt地址的数据内容指向下一个可以动态分配内存的内存指针ptn, n=l, 2,3...,η的地址,设当前分配成功的内存单元为memn,n=l, 2,3...,η,内存指针pt地址的数据内容则需要指向相应内存指针ptn的地址,而内存指针ptn地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;往后,每次内存分配都会从内存指针Pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败;3)内存释放判断释放的内存是否是最后一次分配的内存,若是,在释放该内存时,则需要直接找到该内存的起始地址,通过内存指针pt找到相应的内存指针ptn, n=l, 2,3...,η ;由于内存指针ptn等于NULL,则将内存指针ptn的前一个内存指针ptn-Ι等于NULL,以便下次分配内存从此开始;若不是,则需要将该内存移动,以实现零碎片。
2.根据权利要求1所述的一种小内存微型控制器零碎片的动态内存分配方法,其特征在于,在步骤2)中 :当第一次需要分配内存单元meml,即n=l时,找到内存指针pt,计算所需要分配内存单元是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,内存指针pt地址的数据内容则需要指向相应内存指针ptl的地址,ptl地址的数据内容则需要等于NULL,以便下一次内存分配从此开始,返回内存分配成功;当第二次需要分配内存单元mem2,即n=2时,找到内存指针pt,发现pt的数据等于ptl,则再查找ptl,发现ptl的数据内容等于NULL,计算内存单元mem2所需要的内存是否小于或等于空白内存空间,如果大于,则返回内存分配失败,如果小于或等于,则从ptl作为起始地址,分配内存单元mem2的空间,此时,ptl地址的数据内容等于pt2的地址,pt2地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;当第三次需要分配内存单元mem3,即n=3时,找到内存指针pt,根据pt的内容找到ptl,再根据ptl的内容找到pt2,由于pt2等于NULL,则内存单元mem3从是pt2开始分配,如果内存单元mem3所需的内存小于或等于空闲剩余内存,则从pt2作为起始地址,分配内存单元mem3的空间,pt2地址的数据内容等于pt3的地址,pt3地址的数据内容等于NULL,以便下次内存分配从此开始,返回内存分配成功;以此类推,按照上述方法,每次内存分配都会从内存指针pt开始,查找到空闲内存的起始位置,分配响应的内存,如果内存空间不足,则返回分配内存失败。
3.根据权利要求1所述的一种小内存微型控制器零碎片的动态内存分配方法,其特征在于,在步骤3)中,当需要将内存移动时,如下:将需释放的内存单元memn, n=l, 2,3...,η的起始地址开始存放最后一次分配的内存单元memn+n,n=l, 2,3...,n的地址内容,直到最后一次分配的内存单元存放完毕为止,之后新的空闲内存指针则为ptn+Ι,将第一次分配的内存单元的内存指针ptl指向ptn+1, ptn+1等于NULL,下次分配则从ptn+Ι开始分配,到达了空闲内存最大化的目的,进而实现了零内存碎片的释放。`
【文档编号】G06F12/02GK103678152SQ201410008273
【公开日】2014年3月26日 申请日期:2014年1月8日 优先权日:2014年1月8日
【发明者】李 瑞, 罗轮 申请人:广州思泰信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1