MicroPython hex 函数中是不是存在内存泄漏

Posted

技术标签:

【中文标题】MicroPython hex 函数中是不是存在内存泄漏【英文标题】:Is there a memory leak in MicroPython hex functionMicroPython hex 函数中是否存在内存泄漏 【发布时间】:2021-12-16 03:45:44 【问题描述】:

我为 raspberry PI Pico 编写了一个小型 MicroPython 程序。

这个程序创建一个线程,它增加一个计数器并以十六进制打印值。

import _thread

def myThread():
    count = 0
    while True:
        count = count + 1
        print(hex(count))

_thread.start_new_thread(myThread, ())

这个程序总是在0x16ea失败。

如果我不使用十六进制函数,代码可以正常工作。

使用micropython.mem_info() 进行一些挖掘,看起来十六进制函数存在内存泄漏。还是我做错了什么?

【问题讨论】:

通过 micropython 的 pico 线程充其量是不可靠的。使用“异步”可能会有更好的结果。 【参考方案1】:

当我使用我编译的 MicroPython v1.17-59-g782d5b2e5-dirty 在 PICO 上运行程序时,我看到了相同的结果。程序运行,打印几个垃圾字符并在相同的值附近停止。我重新编译了 MicroPython,并在 mpconfigport.h 中设置了 #define MICROPY_PY_BUILTINS_STR_OP_MODULO (0) 以禁用内置的十六进制。

现在运行程序会导致:

Unhandled exception in thread started by <function myThread at 0x20009810>
Traceback (most recent call last):
  File "test.py", line 8, in myThread
MemoryError: memory allocation failed, allocating 0 bytes

第 8 行是 print(hex(count)) 行。 hex 方法为其返回的新字符串对象分配一些内存,MicroPython 不会在线程中进行自动垃圾回收。

如果您在内存不足之前将程序修改为 gc.collect(),则程序运行时不会停止

import gc
import _thread

def myThread():
    count = 0
    while True:
        count = count + 1
        print(hex(count))

        if (count % 1000 == 0):
            gc.collect()

_thread.start_new_thread(myThread, ())

【讨论】:

【参考方案2】:

我已提出 https://github.com/micropython/micropython/issues/7981 来调查此问题,并使用不使用 hex 的较小复制品。

对上面 Russ 的回答的小修正,自动收集应该发生在线程中(在这个例子中它实际上发生了)——rp2040 端口中有特定的代码来处理收集,无论哪个线程触发它。

【讨论】:

以上是关于MicroPython hex 函数中是不是存在内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

导入 micropython 中存在的模块时出现 ImportError

MicroPython内核开发笔记:书内嵌入实验任务

为啥 Hex() 函数返回一个字符串而不是一个 int hex?

MicroPython内核开发笔记书内软件用例 :浮点数相关实验

MicroPython内核开发笔记书内软件用例 :DAC相关实验

MicroPython内核开发笔记书内软件用例 :Timer相关实验