Обновить

Black Magic Probe на ESP32-C5: беспроводной отладчик без OpenOCD

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели5.9K
Всего голосов 10: ↑10 и ↓0+15
Комментарии15

Комментарии 15

О, весьма интересно! Я так понимаю, на ESP8266 нет возможности по-быстрому запустить?

Чисто технически - да. Есть даже нечто похожее https://github.com/walmis/blackmagic-espidf - тот же BMP, но на ESP8266. Правда Espressif официально перевёл ESP8266 в NRND. Так что я даже не смотрел в эту сторону. Даже эту ссылку случайно нашёл отвечая на ваш вопрос.

Спасибо за статью. Пробовал как-то связку отладочную на двух esp8266 через кейл пару лет назад. Было очень уныло и нестабильно. Попробую на c5-) интересно прям. Подскажите чёрная магия может подключаться к работающей цели без сброса? Бывает зависло устройство и очень хочется узнать где-). Опыта с openocd немного к сожалению но дело наживное.

Да, может. По сути это одно и то же сопоставление вашего .elf с тем что считывается из микроконтроллера. Так что сам процесс перепрошивки и reset просто пропускаются. Так работает везде

подскажите а есть ли инструменты или пользовались ли вы трассировкой для freertos c помощью blackmagic? или может просто снимаем поток данны от swo и потом его скармливаем некой утилитке для анализа. Сам не пробовал эти утилиты но они вроде умеют через gdb работать знаичт и с blackmagic будут работать

Вообще есть два основных подхода. Если говорить только о потоках freertos, то gdb сам по себе может запросить их количество и стек каждого из них. BlackMagic, к сожалению, всегда возвращает один поток при остановке MCU. Так решили разработчики и они не собираются добавлять поддержку freertos. Второй вариант - через gdb самому найти все что связано с freertos. Для этого написаны уже утилиты, да. Лично я использую xRTOS (есть и други плагины) в vscode. Там и потоки посмотреть можно и очерерди и т.д.

А если проект собирался keilom (armcc) получится ли через gdb его потолаживать? Keil выдает axf но это вроде тот же elf. Задачка у меня выяснить где таск останавливается. Точнее начинает иногда потреблять почти все время процессора. Где-то наверное в глубине обращения к какому-то железу, предполагаю флага ждет.. Но вот как это найти и желательно подключившись к рабочему железу. Возникает такая ситуация очень редко. Раз в несколько месяцев

По поводу Keil: есть SystemView от Segger - ему без разницы, чем собран проект, он читает RTT-буфер из RAM. Главное - добавить их библиотеку и настроить FreeRTOS-хуки. Для SystemView .elf/.axf вообще не нужен, хватит бинарника (даже без флагов debug info, но лучше с ними). А вот для ручного GDB - да, .axf (это тот же ELF) с debug info обязателен, иначе переменные не посмотрите.

Единственное, SystemView показывает таймлайн переключений, а не готовый процент загрузки CPU по задачам. Если нужен именно процент - это vTaskGetRunTimeStats(). Я обычно через него смотрю, выводя в каком-нибудь cli, если вопрос стоит "КАКАЯ таска жрет время". Но для "поймать, ГДЕ таска начинает жрать время" таймлайна обычно достаточно.

Да я через cli смотрю сколько задачи потребляют. Как раз через вышеупомянутую функцию. И вижу что одна задача с высоки приоритетом начинает забирать все время практически. Хотя обычно меньше 1% и в каком месте эта задача циклиться пытаюсь найти. Пробовал стек ручками разбирать через tcb но толком не смог увидеть. Надо глубже стек раскручивать. Сможет это systemviewer показать и у меня на плате только swd интерфейс выведен и swo вывод. А вот полного JTAG не доступно

Да, сможет по swd. swo при этом не нужен

как я понял при подключении к blackmagic.local:2347 получаем uart мостик к цели. А как в таком случае скорость порта задавать? Пины это rx и tx на esp. Подключился через putty и поставил на эти пины перемычку для проверки и эха не вижу.

blackmagic.local:2347 использует пины io4 и io5 от lpuart. Да, как-то я забыл об этом написать. Скорость пока поменять получится только в прошивке. Это дополнительный функционал, ему я уделил меньше всего внимания. Глобально хотел его положить в веб чтобы там терминал иметь, а не putty или что-то подобное открывать

гляжу вы его выключили в репо свежем.

# Serial bridge UART0 <-> LP UART
# add_definitions(-DENABLE_UART_SERIAL=1)

А логи самой esp идут в uart0 и по идее не должны быть в lpuart. Сейчас да перемычка эхо дает нормальное на порту 2347. В веб да тоже классно но иногда логи большие и их сохранять нужно

Пересобрал под свою скорость Uart завтра попробую как заведется

Кстати есть очень классный трассировщик от jlink - SystemView. Чтобы он работал нужно в код добавить их библиотеку, немного поднастроить freertos и через утилиту можно наглядно графиками увидеть как переключаются потоки и не только. https://www.segger.com/products/development-tools/systemview/

Когда будете править Readme к проекту печатной платы, укажите, пожалуйста, что проект сделан в Altium designer, а то пришлось гуглить расширения файлов.

По умолчанию для открытого проекта ожидал увидеть KiCad, но понимаю что каждый рисует там где привычнее.

Думал быстренько добавлю пришедший в стандарты с ST-Link v3 разъём STDC-14, но наверное проще будет с нуля перерисовать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации