在Micro Python中管理堆空间

Python变得越来越流行,并且现在实时嵌入式软件开发人员可以通过Micro Python访问微控制器上的Python,这比开发人员了解Micro Python堆现在更为重要。开发人员需要注意几个与堆相关的库和内核选项。

首先,并非所有的Micro Python端口都充分利用了微控制器中可用的RAM空间。 微型Python最早是为具有128 KB RAM的STM32F405开发的。大多数端口以STM32F405作为默认模板开头,这意味着堆仍可能仅分配给0x1C000字节。这看起来好像是很多堆空间,但是Python解释器在运行时使用堆来分配对象和处理脚本,因此可用的堆空间越多越好!

开发人员可以在其内核链接器文件中查找_heap_end变量。该变量的大小应与微控制器具有的RAM数量匹配。例如,STM32F405具有128 kB的RAM,并且_heap_end = 0x2001C000。使用诸如STM32F429之类的部件具有192 kB RAM的开发人员需要确保_heap_end = 0x2002C000。向堆分配额外的0x10000 64 kB RAM。进行此调整可以防止在脚本中出现内存不足错误。

即使开发人员有很多堆空间,他们也希望定期监视其堆空间使用情况,以确保有效地使用堆。当Python解释器执行其脚本时,将创建并销毁对象。有一个垃圾收集器可以回收丢弃的对象,但有时运行速度不够快。随着时间的流逝,堆会变得非常分散,几乎无法使用。开发人员可以通过导入gc库并调用collect方法来强制进行垃圾回收。

导入gc

gc.collect()

使用mem_info方法可以在执行过程中严密监视Micro Python的内存使用情况。调用mem_info()将打印出基本信息,例如堆栈使用率,总堆空间,已用堆空间,甚至可用块数。当开发人员使用详细模式(传递1)调用mem_info时,它真的变得很有趣。发生这种情况时,仍会提供基本信息,但也会打印出有关如何使用堆的完整打印。下图显示了一个小样本:

每个字符代表堆内存位置的使用方式。不幸的是,关于字符的含义并没有很多公开的信息,但是幸运的是,gc内核代码中隐藏了一些文档,这些文档描述了大多数字符的含义。为了避免麻烦,您可以在下面找到秘密解码器环:

。免费
=是尾巴

h是qstr-pool和qstr-data

一个是数组
一个是字节数组

S是字符串

D是字典
L是类型列表
T是元组

F是浮动的
M是模块
B是type_fun_bc

m在标记处

开发人员不能忘记,即使Python在微控制器上运行,编写代码的方式也会对实时性和内存造成影响。从内存的角度来看,在开发过程中使用贯穿整个程序的mem_info是监视堆的使用方式以及堆是否碎片到试图分配另一个对象最终失败的好方法。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据 .