При написании встраиваемых в устройство программ часто возникает необходимость внутрисхемной отладки приложения. Для 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.
Список ссылок :
Viewed 272732 times by 37934 viewers
Comments