用于分配存储器的方法技术

技术编号:18824774 阅读:27 留言:0更新日期:2018-09-01 13:42
公开一种用于管理不连续调用栈的方法,从而在没有存储器管理单元的情况下更加高效地使用存储器。该方法包括:将指示所述不连续调用栈的顶部的栈位置指示符存储在数据存储区中;使用所述栈位置指示符从所述多个存储器块中识别所述不连续调用栈的当前存储器块,所述当前存储器块存储所述不连续调用栈的所述顶部以及指示所述不连续调用栈的前一个存储器块的位置的前一个位置指示符;确定所述当前存储器块中可用的存储器量;确定栈框架所需要的存储器量;确定中断允许所需要的存储器量;响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配至少一个存储器块;将所述栈框架存储在所述分配的存储器块中;以及更新所述数据存储中的所述栈位置指示符。

【技术实现步骤摘要】
【国外来华专利技术】用于分配存储器的方法
本技术涉及在没有存储器管理单元的设备上的存储器的高效使用。更特别地,本技术涉及用于将存储器分配给不连续调用栈的方法。
技术介绍
存储器管理单元(MMU)处理与处理器相关联的存储器和高速缓存操作,以便高效地管理存储器。然而,微控制器很少具有存储器管理单元(MMU),因为MMU给设计增加了显著的尺寸和功耗。
技术实现思路
根据第一技术,提供了用于管理包括多个存储器块当中的至少一个存储器块的不连续调用栈(discontinuouscallstack)的方法。该方法包括:将指示所述不连续调用栈的顶部的栈位置指示符存储在数据存储区(datastore)中;使用所述栈位置指示符从所述多个存储器块中识别所述不连续调用栈的当前存储器块,所述当前存储器块存储所述不连续调用栈的所述顶部以及指示所述不连续调用栈的前一个存储器块的位置的前一个位置指示符;确定所述当前存储器块中可用的存储器量;确定栈框架所需要的存储器量;确定中断允许(interruptallowance)所需要的存储器量;响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配至少一个存储器块;将所述栈框架存储在所分配的存储器块中;以及更新所述数据存储中的所述栈位置指示符,使得更新后的栈位置指示符可以用来识别已经变成所述当前存储器块的所分配的存储器块。根据第二技术,提供了用于管理包括多个存储器块中的至少一个存储器块的不连续调用栈的方法。该方法包括:为中断保留所述多个存储器块中的至少一个存储器块;将指示所保留的存储器块的中断位置指示符存储在中断栈指针数据存储区中;将指示所述不连续调用栈的顶部的栈位置指示符存储在函数栈指针数据存储区中;使用所述栈位置指示符从所述多个存储器块中识别所述不连续调用栈的当前存储器块,所述当前存储器块存储所述不连续调用栈的所述顶部以及指示所述不连续调用栈的前一个存储器块的位置的前一个位置指示符;确定所述当前存储器块中可用的存储器量;确定栈框架所需要的存储器量;响应于所述确定,从所述多个存储器块中为所述栈框架分配至少一个存储器块;将所述栈框架存储在所述分配的存储器块中;以及更新所述函数栈指针数据存储区中的所述栈位置指示符,使得更新后的栈位置指示符可以用来识别已经变成所述当前存储器块的所分配的存储器块。根据第三技术,提供了包括用于执行第一和/或第二技术的方法的程序代码的计算机程序产品。附图说明现在将参考附图描述实施例,其中:图1A和1B例示了被划分成多个存储器块的存储器区域;图2A至2D例示了两个相等大小的存储器块;图3例示了用于分配存储器块的方法;图4A和4B例示了两个相等大小的存储器块;图5例示了用于分配存储器块的方法;图6A至6C例示了三个相等大小的存储器块;图7A至7C例示了三个相等大小的存储器块;图8例示了用于分配存储器块的方法;以及图9例示了寄存器和两个相等大小的存储器块。具体实施方式微控制器趋向于具有被划分成分开的存储器区段的一个或有限数量的连续存储器区域。每个存储器区段被分配用于不同的用途,其中存储器区域的连续区段为栈而保留,在本文中称作栈存储器。随着函数调用和中断/异常使得数据被压到栈上,被每个任务用来记录它的调用栈的栈存储器从一个存储器地址朝更高或者更低的存储器地址连续地生长。通常,栈存储器是存储器区域的连续区段,因为这允许编译器做任何它想要用栈做的事情。另外,连续栈存储器被认为具有零存储器碎片。常规地,要求栈存储器等于最大可能栈大小所需要的存储器空间量,并且不能够用于别的事情。因此,栈存储器经常包括大量的存储器空间,这些存储空间由于大多数时候栈不是与最大可能栈大小一样大而未被使用,但是这些存储空间又不能够用于别的事情。另外,作为开发者小心谨慎的结果,经常为栈存储器保留比所需要的最大可能栈存储器稍微更大的存储器空间。最初,要求开发者在主机上手动调整栈大小。当要求开发者手动调整栈大小变得不合理时,MMU可用于解决优化存储器分配的问题。然而,要求嵌入式开发者或者任何资源受约束的系统的开发者手动优化像栈大小或内循环的确切指令这样的事情仍然被认为是合理的。操作系统技术的开发已经大部分在具有MMU的系统上,并且对于非MMU系统而发生的独特开发非常少。另外,行业倾向于依赖非常少量的编译器供应商:大多数嵌入式编译器是为基于MMU的CPU而建立的编译器的补丁版本。因此,在不大力修改编译器的情况下,针对非MMU系统实现该技术很费劲。为了更加高效地利用不具有MMU的微控制器的存储器区域,存储器区域可以被划分成多个块,这多个块可以在多个用途中分配,使得存储器的任何空闲块可以用于任何目的。然而,仍然要求为栈保留单独的存储器区段,即,栈存储器区域。在一个实施例中,为了更加高效地利用栈存储器区域,栈存储器区域也被划分成多个块。在运行时间,需要每个块的地址以及每个块内使用的最后一个字节的地址或者每个块内第一个空闲字的地址。在一个实施例中,每个块具有相同大小。当多个块对齐并且其大小为2的相同幂次(例如128字节或者256字节)时,每个块的地址可以从块内的任何地址确定,使得仅需要每个块内使用的最后一个字节的地址或者每个块内的第一个空闲字的地址。在另一个实施例中,栈存储器区域可以被划分成多个不同大小的块。当栈存储器区域被划分成多个不同大小的块时,可以利用常规的堆分配器或者多池分配器(multi-poolallocator)。然而,当栈存储器区域被划分成多个不同大小的块时,无法从块内的任何地址确定每个块的地址。因此,需要每个块的地址以及每个块内使用的最后一个字节的地址或者每个块内第一个空闲字的地址。栈存储器区域内的每个存储器块可以在它变得可用时被分配以供使用。块不必按照顺序的次序分配。这导致不连续的栈。不连续的栈不太可能具有零存储器碎片,因为不保证可以使用栈的一个存储器块的整个内容。这种存储器碎片通过池分配处理,然而,栈存储器区域不可能以100%的效率使用。当没有数据存储在存储器块中时或者当存储在存储器块中的栈框架已经完成执行并且不再需要存储时,存储器块被认为是可供分配的“可用”存储器块。栈存储器区域一旦被分配就变成链接的存储器块的链表,并且在不再需要时则被解开链接。如本领域中已知的,只要需要,数据便存储在不连续的栈的存储器块中,并且可以从栈弹出。栈空间分配器用来在按照需要的基础上分配存储器块。如下面更加详细说明的,取决于下一个栈框架所需要的空间量以及当前存储器块中可用的空间量,栈空间分配器在当前存储器块中或者新的存储器块中向下一个栈框架分配空间。图1A例示被划分成多个相等大小的存储器块的栈存储器1。然而,如上所述,栈存储器区域可以被划分成多个不同大小的块。图1A的块1至块N在可用时被分配。如图1A中所例示的,在步骤A分配块1,紧接着在步骤B分配块2,然后在步骤C分配块4,然后在步骤D分配块3。栈空间分配器用来分配可用的存储器块进行存储。存储器块链接在一起但是不是在连续的方向上,从而造成不连续的栈。为了链接块,当前存储器块存储指示前一个存储器块的位置的前一个位置指示符(本文中称作PREV)。在一个实施例中,PREV是前一个存储器块的最后一个已使用字节的地址或者前一个存储器块的第一个空闲字的地址。在一个实施例中,对于向下本文档来自技高网...

【技术保护点】
1.一种用于管理包括多个存储器块中的至少一个存储器块的不连续调用栈的方法,该方法包括:将指示所述不连续调用栈的顶部的栈位置指示符存储在数据存储区中;使用所述栈位置指示符来从所述多个存储器块中识别所述不连续调用栈的当前存储器块,所述当前存储器块存储所述不连续调用栈的顶部以及指示所述不连续调用栈的前一个存储器块的位置的前一个位置指示符;确定所述当前存储器块中可用的存储器量;确定栈框架所需要的存储器量;确定中断允许所需要的存储器量;响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配至少一个存储器块;将所述栈框架存储在所分配的存储器块中;以及更新所述数据存储区中的所述栈位置指示符,使得更新后的栈位置指示符可以用来识别已经变成所述当前存储器块的所分配的存储器块。

【技术特征摘要】
【国外来华专利技术】2016.01.19 GB 1601003.5;2016.01.19 GB 1617459.11.一种用于管理包括多个存储器块中的至少一个存储器块的不连续调用栈的方法,该方法包括:将指示所述不连续调用栈的顶部的栈位置指示符存储在数据存储区中;使用所述栈位置指示符来从所述多个存储器块中识别所述不连续调用栈的当前存储器块,所述当前存储器块存储所述不连续调用栈的顶部以及指示所述不连续调用栈的前一个存储器块的位置的前一个位置指示符;确定所述当前存储器块中可用的存储器量;确定栈框架所需要的存储器量;确定中断允许所需要的存储器量;响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配至少一个存储器块;将所述栈框架存储在所分配的存储器块中;以及更新所述数据存储区中的所述栈位置指示符,使得更新后的栈位置指示符可以用来识别已经变成所述当前存储器块的所分配的存储器块。2.根据权利要求1所述的方法,其中所述数据存储区包括函数栈指针数据存储区。3.根据权利要求1或者权利要求2所述的方法,其中所述栈位置指示符包括指示在所述当前存储器块中由前一个栈框架使用的已使用存储器的结束的地址。4.根据权利要求1或者权利要求2所述的方法,其中所述栈位置指示符包括指示在所述当前存储器块中前一个栈框架之后的可用存储器的开始的地址。5.根据权利要求1至4中任一项所述的方法,还包括:将中断位置指示符存储在中断栈指针数据存储区中,所述中断位置指示符指示在所分配的存储器块中为所述中断允许分配的存储器量的开始;以及更新所述数据存储区中的所述中断位置指示符。6.根据权利要求5所述的方法,其中当所述中断允许和所述栈框架被分配相同的存储器块时,所述中断位置指示符包括所述栈位置指示符。7.根据权利要求5所述的方法,其中当所述中断允许和所述栈框架被分配不同的存储器块时,所述中断位置指示符与所述栈位置指示符不同。8.根据权利要求1至7中任一项所述的方法,其中所述多个存储器块包括多个相同大小的存储器块。9.根据权利要求1至7中任一项所述的方法,其中所述多个存储器块包括多个不同大小的存储器块,并且所述方法还包括:将指示所述当前存储器块的存储器位置指示符存储在第二数据存储区中;以及使用所述存储器位置指示符识别所述当前存储器块并且使用所述栈位置指示符识别所述当前存储器块中的所述不连续调用栈的顶部;以及更新所述数据存储区中的所述存储器位置指示符。10.根据权利要求1至9中任一项所述的方法,其中所述前一个位置指示符包括所述前一个存储器块的最后一个已使用字节的地址。11.根据权利要求1至9中任一项所述的方法,其中所述前一个位置指示符包括所述前一个存储器块的第一个空闲字的地址。12.根据权利要求1至11中任一项所述的方法,其中对于向下生长的不连续调用栈,所述前一个位置指示符被存储在所述当前存储器块中的最高位置。13.根据权利要求1至11中任一项所述的方法,其中对于向上生长的不连续调用栈,所述前一个位置指示符被存储在所述当前存储器块中的最低位置。14.根据权利要求1至13中任一项所述的方法,还包括:确定所述栈框架和所述中断允许需要的所述存储器量小于或者等于所述当前存储器块中可用的存储器量;以及响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配所述当前存储器块。15.根据权利要求1至13中任一项所述的方法,还包括:确定所述栈框架和所述中断允许需要的所述存储器量大于所述当前存储器块中可用的存储器量;以及响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配新的存储器块。16.根据权利要求1至13中任一项所述的方法,还包括:确定所述栈框架和所述中断允许需要的所述存储器量大于所述当前存储器块中可用的存储器量;确定所述栈框架需要的所述存储器量小于或者等于所述当前存储器块中可用的存储器量;以及响应于所述确定,从所述多个存储器块中为所述栈框架分配所述当前存储器块并且为所述中断允许分配新的存储器块。17.根据权利要求1至13中任一项所述的方法,还包括:确定所述栈框架和所述中断允许需要的所述存储器量大于所述当前存储器块中可用的存储器量;确定所述栈框架需要的所述存储器量大于所述当前存储器块中可用的所述存储器量;以及响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配至少一个新的存储器块。18.根据权利要求1至13中任一项所述的方法,还包括:确定所述栈框架和所述中断允许需要的所述存储器量大于所述多个存储器块的每个新的存储器块中可用的存储器量;以及响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配两个或更多个新的存储器块。19.根据权利要求1至13中任一项所述的方法,还包括:确定所述栈框架和所述中断允许需要的所述存储器量大于所述当前存储器块中可用的存储器量;确定所述栈框架需要的所述存储器量大于所述当前存储器块中可用的存储器量;确定所述栈框架和所述中断允许需要的所述存储器量小于所述多个存储器块当中的每个新的存储器块中可用的存储器空间量;以及响应于所述确定,从所述多个存储器块中为所述栈框架和所述中断允许分配新的存储器块。20.根据权利要求1至13中任一项所述的方法,还包括:确定...

【专利技术属性】
技术研发人员:J·克罗斯比B·莫兰
申请(专利权)人:阿姆IP有限公司
类型:发明
国别省市:英国,GB

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1