Классическая ситуация. Записали через интерфейс SWD прошивку и... ничего не происходит. HeartBeat LED не мигает. Логи в UART(е) не появляются. CLI не отвечает. Вероятно прошивка где-то свалилась в Hard Fault Handler. Обратилась к несуществующей памяти. Что же делать? Как понять, где ошибка?
Можно конечно включать и исключать перед сборкой куски программы и прошивать пока не выясним ту проблемную функцию. Но это может занять очень много времени. Целый день.
Есть ли более эффективный способ? Да. Тут выручит пошаговая GDB отладка. А для этого надо настроить GDB сервер и GDB клиент.
Про пошаговую отладку в консоли у меня есть отдельный пост.
Однако пошаговая отладка в консоли может показаться утомительной. Куда проще пошагово отлаживаться прямо в текстовом редакторе, например в Eclipse.
Что надо из оборудования?
оборудование |
Назначение |
кабель USB-A USB micro |
Для подключения программатора к NetTop PC |
отладочная плата (например nrf5340-DK) |
для пошаговой отладки прошивки в микроконтроллере |
программатор J-Link |
для пошаговой отладки микроконтроллера |
LapTop |
для запуска утилит |
Что надо из софтвера?
Утилита |
Назначение |
JVM |
Виртуальная машина для прокрутки текстового редактора eclipse |
JLinkGDBServer.exe |
GDB сервер |
nrfjprog.exe |
утилита, чтобы прошить микроконтроллер семейства nrf |
arm-none-eabi-gdb.exe |
GDB клиент |
eclipse.exe |
Текстовый редактор |
Фаза 1. Установить GNU ToolChain для Arm Embedded
Надо прописать в переменную Path путь к ARM ToolChain(у): препроцессору, компилятору, асcембреру, компоновщику, binutils(ам), отладчику.
C:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.10/bin
![](https://habrastorage.org/getpro/habr/upload_files/01a/830/8cc/01a8308cc98444bc02c08e9301c152c2.png)
Проверить корректность установки GNU Toolchain можно выполнив команду arm-none-eabi-gcc --version в консоли Windows
![](https://habrastorage.org/getpro/habr/upload_files/a1f/59d/2f1/a1f59d2f189247259f74ab7895601261.png)
Фаза 2. Запустить GDB Сервер Отладки
В качестве сервера отладки можно использовать утилиту JLinkGDBServer.exe.
C:\Program Files (x86)\SEGGER\JLink\JLinkGDBServer.exe
Можно даже накропать простенький скрипт, чтобы не настраивать каждый раз мышкой настройки JLink GDB Server(а)
echo off
cls
set GDBServerOpt = -select USB -device nRF5340_xxAA_APP -endian little -if SWD -speed 400 -ir -LocalhostOnly -logtofile -log "C:\projects\code_base_workspace\code_base_firmware\tool\GdbServerLog.txt"
set GDBServerDir="C:\Program Files (x86)\SEGGER\JLink\"
set GDBServerPath=%GDBServerDir%JLinkGDBServer.exe"
cd %GDBServerDir%
call %GDBServerPath% %GDBServerOpt%
В настройках JLink GDB Server(а) надо проверить интерфейс соединения с платой. В данной плате это USB. Проверить интерфейс соединения программатора и целевого микроконтроллера. В данной схемотехнике это SWD. Проверить, что выбрано нужное процессорное ядро. В данном случае это nRF5340_xxAA_APP. Если всё верно, то нажимаем ок.
![](https://habrastorage.org/getpro/habr/upload_files/b2f/d22/842/b2fd228425707d426d262e7626b0a4a1.png)
JLink GDB Server переходит в режим ожидания подключения к GDB клиенту.
![](https://habrastorage.org/getpro/habr/upload_files/e62/8fb/371/e628fb371c9b157e285c9a6d302bf992.png)
Вот примерный лог успешного подключения после запуска GDB клиента.
![](https://habrastorage.org/getpro/habr/upload_files/a52/6c5/c15/a526c5c155193f1a83742da200fe8795.png)
Фаза 3. Настройка GDB Клиента
Надо открыть меню Debug Configuration, создать конфигурацию и указывает путь к *.elf файлу
![](https://habrastorage.org/getpro/habr/upload_files/261/a5b/623/261a5b623f2e7ec2a3804ca3547c516b.png)
На вкладке Debugger указать путь к GDB клиенту arm-none-eabi-gdb.exe.
![](https://habrastorage.org/getpro/habr/upload_files/0bd/9eb/266/0bd9eb2660e0616828ff4a30b00f6a76.png)
Можно прописать полный путь к GDB клиенту
C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin\arm-none-eabi-gdb.exe
![](https://habrastorage.org/getpro/habr/upload_files/0ec/397/388/0ec397388ff38b3ec23fbc18973092f7.png)
Настроить вкладку Startup.
![](https://habrastorage.org/getpro/habr/upload_files/09f/88e/c24/09f88ec248c7b1828332ef79baa81238.png)
ставим, что надо остановиться на функции main
![](https://habrastorage.org/getpro/habr/upload_files/5d2/882/8af/5d28828af02f8414bf9ad9b405fb56fb.png)
Настроить вкладку Common, как показано на скриншоте
![](https://habrastorage.org/getpro/habr/upload_files/ead/0d2/852/ead0d28527610064e8b4e0b72edf3295.png)
Теперь достаточно нажать кнопку Debug и можно производить пошаговую отладку
![](https://habrastorage.org/getpro/habr/upload_files/fc8/01f/a52/fc801fa522fabaf859c8770cc21c6545.png)
получилась такая схема взаимодействия утилит
![](https://habrastorage.org/getpro/habr/upload_files/46c/958/96d/46c95896debd401a703d5968f85a5fdb.png)
Вывод
Если говорить по честному, то всё, что требуется от пошаговой GDB отладки это максимум отладить запуск полнодуплексного UART. Далее просто подключается интерфейс командной строки и вся последующая отладка идет через UART-CLI.
А в CLI(Shell) как раз есть возможность прицельно вычитывать куски данных из физической памяти (регистры, RAM, Flash), искать адреса по значениям (аналог утилиты Art Money), читать и дергать GPIO, пулять пакеты в SPI, I2C, перезагружать ядро, запускать конкретные функции зная из адреса из *.map файла да и вообще делать всё, что только душа пожелает.
Словарь
Акроним |
Расшифровка |
CLI |
Command-line interface |
UART |
universal asynchronous receiver-transmitter |
LED |
light-emitting diode |
RISC |
reduced instruction set computer |
JVM |
Java virtual machine |
PC |
personal computer |
UNIX |
UNiplexed Information Computing System |
ARM |
Advanced RISC Machine |
SWD |
Serial Wire Debug |
USB |
Universal Serial Bus |
GNU |
GNU's Not UNIX |
GDB |
GNU Debugger |
Ссылки
https://bitknitting.wordpress.com/2015/07/11/using-eclipse-to-program-the-nrf51822/
https://dev.px4.io/v1.10_noredirect/en/debug/eclipse_jlink.html
https://eclipse-embed-cdt.github.io/debug/jlink/
https://habr.com/ru/company/rainbow/blog/251053/
https://habr.com/ru/post/215483/
https://habr.com/ru/post/578830/
https://habr.com/ru/post/673522/https://habr.com/ru/post/694708/https://habr.com/ru/post/694408/https://habr.com/ru/post/681280/
https://karibe.co.ke/2014/03/debugging-arm-freescale-microcontrollers-with-j-link-gdb-server-and-gnu-arm-toolchain-gdb-with-semihosting-in-linux/
https://mcuoneclipse.com/2019/09/22/eclipse-jtag-debugging-the-esp32-with-a-segger-j-link/
https://mcuoneclipse.com/2022/07/16/getting-started-raspberry-pi-pico-rp2040-with-eclipse-and-j-link/
Комментарии (4)
progchip666
00.00.0000 00:00+1Сорри за ламерский вопрос. А точки возможность , возможность расставить точки останова, просмотр состояния переменных и регистров такая отладка не подразумевает?
aabzel Автор
00.00.0000 00:00-1Всё что требуется от пошаговой GDB отладки это запустить полнодуплексный UART. Далее подключается интерфейс командной строки
https://habr.com/ru/post/694408/
и вся последующая отладка идет через UART CLI.
В UART-CLI как раз есть возможность прицельно вычитывать куски данных из физической памяти.
progchip666
Не люблю работу из консоли, но статья может быть полезна даже для меня. C учётом специфики нашего времени, того и глядишь с привычными IDE могут начаться проблемы.
aabzel Автор
Этот пост как раз про пошаговую отладку из IDE Eclipse.
Про пошаговую отладку непосредственно в консоли у меня есть другой текст https://habr.com/ru/post/694708/