Классическая ситуация. Записали через интерфейс SWD прошивку и… ничего не происходит. HeartBeat LED не мигает. Boot лог в UART(е) не появляется. CLI не отвечает. Вероятно прошивка где-то свалилась в Hard Fault Handler. Причем прямо в инициализации еще до запуска супер цикла внутри функции main(). Обратилась к несуществующей памяти. Что же делать? Как понять, где ошибка, чтобы принять меры?
Можно конечно включать и исключать перед сборкой куски программы и прошивать пока не выясним ту проблемную функцию. Но это может занять очень много времени. Целый день.
Есть ли более эффективный способ? Да. Тут выручит пошаговая 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

Проверить корректность установки GNU Toolchain можно выполнив команду arm-none-eabi-gcc —version в консоли Windows

Фаза 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. Если всё верно, то нажимаем ок.

JLink GDB Server переходит в режим ожидания подключения к GDB клиенту.

Вот примерный лог успешного подключения после запуска GDB клиента.

Фаза 3. Настройка GDB Клиента
Надо открыть меню Debug Configuration, создать конфигурацию и указывает путь к *.elf файлу

На вкладке Debugger указать путь к GDB клиенту arm-none-eabi-gdb.exe.

Можно прописать полный путь к GDB клиенту
C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin\arm-none-eabi-gdb.exe

Настроить вкладку Startup.

ставим, что надо остановиться на функции main

Настроить вкладку Common, как показано на скриншоте

Теперь достаточно нажать кнопку Debug и можно производить пошаговую отладку

получилась такая схема взаимодействия утилит

вот кстати скрипт для пере прошивки. Микроконтроллер Nrf5340 можно пере прошить утилитой nrfjprog.exe.
echo off cls set project_name=nrf5340_dk_nortos_decadriver_m set project_dir=%cd% set workspace_dir=%cd%\..\..\..\ set tool_dir=%cd%\..\..\..\tool echo project_dir=%project_dir% set artefact_hex=%project_dir%\build\%project_name%.hex echo artefact_hex=%artefact_hex% ::set FlashTool="C:\Program Files (x86)\Nordic Semiconductor\nrf-command-line-tools\bin\nrfjprog.exe" set FlashTool=nrfjprog call %project_dir%\recover.bat set options=--iface USB --family NRF53 --coprocessor CP_APPLICATION --program %artefact_hex% --log --chiperase --verify --reset call %FlashTool% %options% echo workspace_dir=%workspace_dir% echo tools_dir=%tools_dir% call %tool_dir%\launch_terminal.bat 10 460800 "nrf5340_dk_nortos_decadriver_m"
Вывод
Если говорить по честному, то всё, что требуется от пошаговой 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/
ссылка на оригинал статьи https://habr.com/ru/articles/682498/
Добавить комментарий