Есть ли утечка памяти в шестнадцатеричной функции MicroPython

Я написал небольшую программу MicroPython для Raspberry PI Pico.

Эта программа создает поток, который увеличивает счетчик и печатает значение в шестнадцатеричном формате.

      import _thread

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

_thread.start_new_thread(myThread, ())

Эта программа всегда терпит неудачу 0x16ea.

Если я не использую шестнадцатеричную функцию, код работает нормально.

Немного покопаемся, используя micropython.mem_info()и похоже, что шестнадцатеричная функция имеет утечку памяти. Или я что-то не так делаю?

3 ответа

Решение

Я видел тот же результат при запуске вашей программы на PICO с MicroPython v1.17-59-g782d5b2e5-dirty, который я скомпилировал. Программа запускается, печатает пару мусорных символов и останавливается около того же значения. Я перекомпилировал MicroPython с #define MICROPY_PY_BUILTINS_STR_OP_MODULO (0), установленным в mpconfigport.h, чтобы отключить встроенный шестнадцатеричный код.

Запуск программы теперь приводит к:

      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 - это строка печати (шестнадцатеричная (счет)).

Я поднял https://github.com/micropython/micropython/issues/7981, чтобы исследовать это, с меньшим воспроизведением, которое не использует hex.

Небольшая поправка к ответу Русса выше, автоматический сбор должен происходить в потоках (и это действительно происходит в этом примере) - в порту rp2040 есть специальный код для обработки сбора независимо от того, какой поток его инициировал.

Компьютер на базе Windows 10 AMD не может воспроизвести ошибку.

Если я запустил программу по умолчанию из вопроса, она просто продолжала работать бесконечно (пытался печатать только каждые 1000000-го отсчета, и это все еще выполнялось быстро).

Чтобы проверить, есть ли утечка памяти, я заменил print() часть с x = hex(count), и пусть работает.

Использование памяти было стабильным, не менялось ни вверх, ни вниз, так что нет, hex() не имеет утечки.

Так что ваша проблема, вероятно, связана с проблемой совместимости.

Другие вопросы по тегам