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

Программирование и отладка ESP32 в Eclipse

В этой статье я опишу настройку IDE Eclipse CDT для программирования и отладки программ под ESP32 в Eclipse. До этого я уже описал процесс настройки инструментария для ESP32 в статье «Программирование ESP32 на языке C в SDK от Espressif», а также подключение JTAG адаптера и настройку отладки в публикации «Отладка программ для ESP32 через JTAG адаптер на Raspberry Pi 3». Дальнейшее изложение материала рассчитано на то, что вы уже проделали все необходимые шаги по настройке инструментария, описанные в двух предыдущих публикациях.

На своем сайте я много раз описывал настройку Eclipse для программирования и отладки различных микроконтроллеров, поэтому не поленюсь это сделать и для такого замечательного устройства как ESP32.

Найстройка сборки проекта в Eclipse

Прежде всего установите IDE Eclipse CDT на свою систему Ubuntu Linux, если она еще не установлена.
Для этого необходимо посетить ресурс https://www.eclipse.org/ и нажать кнопку “Download”. После загрузки и распаковки архива внутри можно обнаружить установочный файл eclipse-inst , который необходимо запустить и уже в процессе установки выбрать версию CDT . Запускать установку необходимо из командной строки, иначе установщик не обнаружит виртуальную Java машину на вашем компьютере (хотя наверняка она там есть, если же нет, то необходимо установить).

После установки Eclipse необходимо дописать путь к исполняемому файлу в файле .bashrc и перелогиниться в системе


$ vim ~/.bashrc
export PATH=$PATH:~/eclipse/cpp-2018-12/eclipse

Теперь можно запускать Eclipse из командной строки, набрав


$ eclipse

После запуска как обычно необходимо выбрать рабочее пространство. Для этих целей я создал в каталоге /esp подкаталог eclipse-workspace.

В качестве первого наглядного примера возьмем пример blink из документации от Espressif с мерцающим светодиодом, ничего нового не будем выдумывать.
Сначала как обычно скопируем пример из ~/esp/esp-idf/examples/get-started/blink в корневой каталог ~/esp/blink.

Дальше импортируем пример в рабочее пространство Eclipse, нажав File -> Import… и выбрав в окне «Import» пункт “C/C++” -> “Existing Code as Makefile Project”, жмем «Next».

В появившемся окне «New project» выбираем название проекта, полный путь к нему, а также инструментарий «Cross GCC» в настройках индексатора.

Когда проект появиться в окне «Project explorer» , кликаем на нем мышкой и выбираем пункт меню «Project — > Properties». В настройках проекта выбираем пункт «C/C++ Build — > Environment» и добавляем новую переменную «BATCH_BUILD» со значением 1 , нажав на кнопку «Add».

Кроме этой переменной нужно также добавить IDF_PATH, указав в ней расположение фреймворка ESP-IDF (~/esp/esp-idf). Проверьте также значение переменной PATH на наличие в ней пути к инструментарию xtensa-esp32-elf (~/esp/xtensa-esp32-elf/bin).

И не спешите закрывать окно с настройками, они только начинаются. Выбираем меню “C/C++ General” -> “Preprocessor Include Paths. Macros etc”, в открывшемся окне выбираем закладку “Providers”.

На закладке “Providers” в пункте “CDT Cross GCC Built-in Compiler Settings” поле “Command to get compiler specs” должно содержать следующее введенное вами значение


xtensa-esp32-elf-gcc ${FLAGS} -std=c++11 -E -P -v -dD "${INPUTS}"

А в пункте “CDT GCC Build Output Parser” в поле “Compiler command pattern” нужно записать такое значение


xtensa-esp32-elf-(gcc|g\+\+|c\+\+|cc|cpp|clang)

В пункте “C/C++ General” -> “Indexer” проверьте, чтобы значения флажков соответствовали изображенным на следующем рисунке

В пункте меню “C/C++ Build” -> “Behavior” проверьте , чтобы был установлен флаг “Enable parallel build”.

Теперь можно нажать на кнопку «Apply and Close», предварительная настройка проекта закончена.

В своей статье «Программирование ESP32 на C в SDK Espressif» я упоминал о том, что производитель сознательно выбрал систему сборки, предусматривающую предварительную конфигурацию в графическом режиме, набрав в командной строке make menuconfig. Такой способ действительно очень удобен при наличии большого количества параметров для настройки.

К сожалению выполнить конфигурацию проекта из IDE Eclipse не получиться, поэтому прежде чем собирать новый проект, его необходимо сконфигурировать из командной строки.
Это можно сделать в окне терминала Ubuntu Linux, набрав команды


cd ~/esp/blink
make menuconfig

После конфигурации проекта сборку , прошивку и отладку программы мы будем производить из IDE Eclipse.

В правой части экрана в Eclipse выбираем закладку «Build Targets». Добавляем с помощью значка «New Build Target» три новые цели : all , clean , flash.

Как вы наверное догадались для сборки проекта необходимо сделать двойной щелчек мышью на цели all, для очистки от временных файлов — на цели clean, а для программирования устройства через UART (не забывайте нажимать на кнопку «BOOT») — двойной щелчек на цели flash.


Настройка отладки в Eclipse

Для целей отладки я буду использовать плату Raspberry Pi 3 в качестве JTAG адаптера. Вы можете соединиться с RPi3 из терминала Ubuntu Linux или из самой IDE Eclipse.

Рассмотрим как это делается в Eclipse.
Для начала нужно открыть вкладку “Console” внизу экрана.
Далее нажимаем на пиктограмму “Open Console” и выбираем пункт “3 Command Shell Console”. В открывшемся окне “Select Remote Connection” выбираем тип соединения “SSH”. Напротив поля “Connection Name” нажимаем на кнопку “New” и заполняем поля в новом окне “New Connection”

В открывшемся окне консоли вводим команду для запуска openocd на плате Rpi3


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

Теперь настроим клиентскую часть отладчика в Eclipse. Плагин “GDB Hardware Debugging”, необходимый для отладки программ, установлен в Eclipse “из коробки”, что не может не радовать.
Выбираем в меню пункт «Run — > Debug Configurations…».В левой части открывшегося окна выбираем наш плагин и создаем новую конфигурацию «blink checking».

На вкладке «Main» необходимо выбрать путь к elf -файлу и установить переключатель «Disable auto build».

На вкладке «Debugger» необходимо указать IP адрес платы Raspberry Pi 3 и номер порта 3333 для соединения с openocd.

На вкладке «Startup» в поле для ввода секции «Initialization commands» необходимо ввести


mon reset halt
flushregs
set remote hardware-watchpoint-limit 2

В секции «Load Image and Symbols» убрать галочку с «Load Image», поскольку прошивку мы будем грузить через UART, и оставить галочку на «Load Symbols».

В секции «Run Commands» выбрать «Set breakpoint at» и дописать название функции app_main в качестве точки останова, установить галочку на «Resume».

На вкладке “Common” в секции “Display in favorites menu” ставим галочку «Debug».

Остальные закладки оставляем без изменений.

Жмем на кнопку «Debug» для немедленной отладки или применяем внесенные в настройки изменения нажатием на кнопку «Apply», а в IDE Eclipse нажимаем на кнопку с жуком (Debug blink checking).

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

Обратите внимание, что в закладке «Console» вы будете наблюдать сообщения, посылаемые openocd, а в закладке «Debugger Console» — сообщения от gdb клиента.

Если вы как и я используете плату ESP32_DEVKITV1, то для того, чтобы увидеть мерцание светодиода, необходимо изменить в файле sdkconfig.h номер вывода

Вполне возможно, что его можно было выбрать при конфигурации проекта (make menuconfig), но я не нашел где это сделать.

Все основные команды для управления отладкой доступны из верхней инструментальной панели , а также из меню «Run».
Чтобы открыть дополнительные окна для наблюдения используйте меню «Window — > Show View — > Other…» , а далее в выпадающем списке «Debug» выберите название окна.

Для того, чтобы отладка программы была продуктивной, необходимо изучить документацию Espressif по архитектуре ESP32.
В то время как устанавливать точки останова и просматривать содержимое своих переменных вы можете и без знания архитектуры ESP32, отладить работу периферийных устройств без этих знаний получиться едва ли.

SoC ESP32 очень интересна по своим возможностям. Большинство русскоязычной информации по ESP32 связано с работой в Arduino IDE и других еще более высокоуровневых инструментах, в то время как наибольшую эффективность использования SoC ESP32 мы сможем получить только благодаря старому доброму языку C и изучению документации по ESP32 и ESP-IDF от Espressif.

Viewed 85304 times by 9280 viewers

Leave a Reply

You must be logged in to post a comment.