разработка и программирование электронных устройств

Отладка программ для ESP32 через JTAG адаптер на Raspberry Pi 3

При написании встраиваемых в устройство программ часто возникает необходимость внутрисхемной отладки приложения. Для ESP32 ситуация с отладкой программы усложняется наличием двух процессорных ядер и операционной системы реального времени FreeRTOS в составе ESP-IDF.

Для целей отладки приложения в ESP32 используется схема отладки GDB – клиент (xtensa-esp32-elf-gdb ) -> GDB – сервер (openocd-esp32) –> JTAG — интерфейс.
Специально для своих микросхем Espressif портировал GDB – сервер OpenOCD (или будет корректней написать “добавил поддержку своих микросхем в OpenOCD”, хотя последний придется скачивать отдельно с github аккаунта espressif).
Итак, напомню суть процесса отладки по указанной выше схеме. Есть GDB- сервер и GDB-клиент, которые устанавливают между собой соединение и обеспечивают процесс внутрисхемной отладки. В качестве сервера используется OpenOCD, который помимо связи с клиентом управляет JTAG – адаптером (список поддерживаемых адаптеров очень даже приличный), подсоединенным к JTAG-разъему целевого устройства.

GDB – клиент может запрашивать у сервера (OpenOCD) различную информацию (содержимое внутренних регистров, содержимое памяти ) и выводить эту информацию пользователю в консоль или же , например, при использовании специального плагина для Eclipse эта информация показывается в удобном графическом интерфейсе IDE Eclipse CDT.
Сложность заключается в настройке работы описанной выше схемы, после этого отладка ничем не отличается от аналогичной в IAR EWB или Keil uVision, где все работает “с коробки”.

Давайте попробуем проделать эту настройку вместе в данной публикации.

Я предлагаю задействовать в качестве JTAG адаптера плату Raspberry Pi 3 (теоретически можно воспользоваться любой версией raspberry pi). В таком варианте подключения выбранные порты GPIO на разъеме RPi3 используются как сигнальные линии JTAG(SWD). Openocd устанавливается непосредственно на саму плату RPi3. Поскольку для взаимодействия между GDB клиентом и сервером может использоваться интерфейс сокетов (IP адрес и номер порта), то клиент и сервер не обязательно должны быть запущены на одной машине.

На следующем рисунке изображена описанная выше схема отладки.

Для использования RPi3 в качестве JTAG адаптера придется изъять плату из корпуса, чтобы получить доступ к 40-контактному разъему. Соответствие контактов сигнальных линий JTAG
на RPi3 и ESP32_DEVKITV1 изображено в следующей таблице.

JTAG line ESP32_DEVKITV1 pin RPi3 pin
GND Pin2 (GND) 6,39
TDI Pin4 (GPIIO12) 19 (GPIO10)
TDO Pin3 (GPIO15) 21 (GPIO9)
TMS Pin5 (GPIO14) 22 (GPIO25)
TCK Pin3 (GPIO13) 23 (GPIO11)

Соединяем линии JTAG между платами, подаем питание на RPi3 и ESP32_DEVKITV1, устанавливаем соединение с Raspberry Pi 3.
Для этого нужно знать IP адрес платы RPi3 , в моем случае адрес установлен статически и имеет значение 192.168.0.111.

В продолжении предыдущей статьи Программирование ESP32 на языке C в SDK от Espressif я буду настраивать отладку для ОС Ubuntu Linux.

Открываем терминал в Ubuntu и устанавливаем соединение с RPi3 по протоколу SSH.


ssh pi@192.168.0.111
<вводим пароль >(по-умолчанию “raspberry”)

Устанавливаем необходимые компоненты


pi@raspberrypi:~ $ sudo apt-get install git autoconf libtool make pkg-config libusb-1.0-0 libusb-1.0-0-dev

Создаем подкаталог /esp в домашнем каталоге RPi3 и заходим в него



pi@raspberrypi:~ $ mkdir ~/esp
pi@raspberrypi:~ $ cd ~/esp

Теперь нужно загрузить сюда версию openocd для ESP32, для этого клонируем репозиторий


pi@raspberrypi:~ $ git clone --recursive https://github.com/espressif/openocd-esp32.git

Далее конфигурируем и собираем openocd из исходников. При конфигурировании важно не забыть добавить поддержку управления через GPIO для бродкомовских чипов. Можно использовать любую версию raspberri pi в качестве JTAG адаптера.



pi@raspberrypi:~ $ cd ~/esp/openocd-esp32
pi@raspberrypi:~ $ ./bootstrap
pi@raspberrypi:~ $ ./configure --enable-sysfsgpio --enable-bcm2835gpio
pi@raspberrypi:~ $ make -j2

Если вы не планируете устанавливать еще одну версию openocd для работы с другими устройствами, то дальше можно установить openocd-esp32 в систему Raspbian, после чего обращаться к нему из командной строки по названию openocd .



pi@raspberrypi:~ $ sudo make install

После установки openocd скрипты будут доступны по пути /usr/local/share/openocd/scripts.

Хочу обратить ваше внимание на один важный момент. По-умолчанию openocd будет ждать соединения с gdb клиентом на той-же машине (localhost). Нас этот вариант не устраивает, потому что в таком случае придется запускать gdb клиент (а также возможно Eclipse CDT с плагином для отладки) на RPi3 , что значительно проигрывает по скорости работы варианту с запуском отладки на нашем персональном компьютере.

Для того, чтобы добавить возможность соединения gdb клиента и сервера с разных IP адресов вашей локальной сети необходимо добавить в конфигурационный скрипт строчку


bindto 0.0.0.0

Я добавил эту строчку в файл interface/sysfsgpio-raspberrypi.cfg
Запуск gdb сервера для отладки платы ESP32_DEVKITV1 (которая создана на базе модуля ESP-WROOM-32) выглядит следующим образом



pi@raspberrypi:~ $ sudo openocd -s share/openocd/scripts -f interface/sysfsgpio-raspberrypi.cfg -f board/esp-wroom-32.cfg


Теперь, когда gdb сервер запущен, необходимо подсоединиться к нему с помощью gdb клиента, который мы установили в систему Ubuntu вместе с инструментарием в предыдущей статье.

Открываем еще одно окно терминала в Ubuntu и запускаем gdb клиент для отладки программы hello-world , которую мы рассмотрели в предыдущей статье.



cd ~/esp/hello_world
xtensa-esp32-elf-gdb build/hello-world.elf
>>>target remote 192.168.0.111:3333

Если после этой команды со стороны openocd соединение не будет установлено, то необходимо повторно ввести данную команду в командной строке gdb клиента.
Далее устанавливаем точку останова на входе в функцию app_main() и запускаем программу



>>>set remote hardware-watchpoint-limit 2
>>>mon reset halt
>>>flushregs
>>>thb app_main
>>>c

В разделе “Source” запущенного gdb клиента вы увидите подсвеченной 17-ую строку на открывающей скобке функции app_main().

Далее если ввести команду step , то подсветка переместится на следующую строку кода

Можем констатировать факт работающей отладки. В режиме командной строки вполне реально отладить свою программу, но для этого необходимо знать хотя бы самые базовые команды gdb.

Можно пойти другим путем и настроить отладку в IDE Eclipse CDT, что и рекомендует сделать производитель на страницах своей документации.

Настроить сборку проектов и отладку в IDE Eclipse CDT вы можете самостоятельно, воспользовавшись приведенными ниже ссылками на официальную документацию.
Я планирую описать этот процесс в следующей статье, хотя это будет практически перевод официальной документации от espressif.

Забегая наперед отмечу, что мне удалось запустить отладку в IDE Eclipse CDT с использованием удаленного GDB сервера openocd на Raspberry Pi 3.

Список ссылок :

  1. Build and Flash with Eclipse IDE
  2. Using Debugger

Viewed 2465 times by 542 viewers

Leave a Reply

You must be logged in to post a comment.