0

我为 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()一下,看起来 hex 函数有内存泄漏。还是我做错了什么?

4

2 回答 2

1

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

现在运行程序会导致:

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, ())
于 2021-11-06T03:30:38.323 回答
1

我已经提出了https://github.com/micropython/micropython/issues/7981来调查这个问题,并使用了一个不使用hex.

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

于 2021-11-09T12:37:26.043 回答