MicroPython научили останавливаться на строке без SWD и второго кабеля
Отладка MicroPython долго начиналась с почти археологического ритуала: вывести одну переменную в serial-консоль, прошить плату, дождаться нужной ветки, добавить ещё один print(). Этот способ терпим для мигания светодиодом, но быстро ломается на автомате испытательного стенда, обработчике периферии или управляющем цикле с несколькими задачами. Новый MicroPython Debugger от GHI Electronics позволяет остановить сам интерпретатор на строке исходника и посмотреть, что он видел в этот момент.
Отладчик живёт внутри прошивки
Трюк устроен внутри runtime, поэтому это не аппаратная отладка ядра по SWD или JTAG. GHI поддерживает отдельный fork MicroPython с движком mpdebug. После прошивки плата по одному физическому USB-кабелю предъявляет компьютеру два CDC-интерфейса: привычный REPL и отдельный канал протокола отладки. Расширение для VS Code загружает код по F5, получает события VM и связывает их с исходным файлом на компьютере.
В остановленном состоянии доступны breakpoints, включая условные и по числу попаданий, continue и step over/into/out, call stack, локальные и глобальные переменные, Watch и hover над объектами. Глобальную переменную можно изменить до продолжения исполнения. print() программы уходит в Debug Console, так что обычная телеметрия не исчезает в момент, когда нужен debugger.
Где он уже запускается
Готовые образы выпущены для RP2040, RP2350, ESP32-S2 и нескольких вариантов ESP32-S3. Это существенно уже, чем общий ярлык «ESP32»: обычный ESP32 в перечне нет. Для собственной платы придётся собрать специальную firmware; fork основан на MicroPython v1.29.0. Независимый запуск подтверждён на обычном Raspberry Pi Pico, хотя с платой RP2040 GEEK автор проверки столкнулся с проблемой настройки.
Что VM пока не может показать
У такого подхода есть цена, и она хорошо показывает границу между трассировкой Python VM и полноценным debug probe. Breakpoint останавливает все потоки. Исключение, уже пойманное обработчиком программы, debugger не перехватит. Декораторы micropython.native и micropython.viper отключают нужные trace events, поэтому этот код не получится проходить построчно. В top-level цикле while True точка останова иногда пропускается, а у .mpy-модуля без соседнего .py доступны аргументы функции, но не остальные локальные переменные.
Python остаётся в управляющем контуре
Для embedded-разработки это всё равно меняет характер задачи. Python особенно удобен там, где нужно быстро собрать последовательность измерений, поговорить с несколькими приборами или вести высокоуровневую логику устройства. До сих пор сложный сбой в такой части системы часто становился поводом переписать её на C только ради привычных средств отладки. Теперь control plane можно оставить в MicroPython, а горячие участки вынести в native-код с ясным пониманием, где заканчивается видимость отладчика.