Порой бывает так, что вы скачиваете репозиторий, а там нет файлов .project и .сproject для eclipse или файлы .project и .сproject есть, но они, внезапно, по каким-то причинам повреждены и IDE их просто не может открыть. Тем не менее, прошивка собирается командой make all. Затем ты ее прошиваешь и LED не мигает. Очевидно, что прошивка зависла (заклинила). Где-то свалилась в HardFault_Handler. Тут не надо впадать в судороги конвульсии и паралич. В этом случае надо просто взять и запускать пошаговую отладку из консоли. Это классический способ разобраться, где же произошла осечка.

Загрузка прошивки в микроконтроллер

Залить прошивку можно утилитой ST-LINK_CLI.exe вот таким простым скриптом

echo off
cls

set project_name=some_firmware
set project_dir=%cd%

echo project_dir=%project_dir%
set artefact_hex=%project_dir%\build\%project_name%.hex
echo artefact_hex=%artefact_hex%
set FlashTool=ST-LINK_CLI.exe
set Device=
set options= -c %Device% 
set options=%options% SWD freq=2000 HOTPLUG  
set options=%options% -P %artefact_hex% 
set options=%options% -V "after_programming" 
set options=%options% -Log
set options=%options% -TVolt

call %FlashTool% %options%
call %FlashTool% -Rst

Пуск отладочного сервера (Back-End) .

Для пошаговой отладки надо установить GDB Server. Это утилита-переходник, которая с одной стороны допрашивает микропроцессор по SWD (или JTAG), а с другой стороны обслуживает TCP сокет к которому подключится отладчик arm-none-eabi-gdb.exe к порту с номером 61234.  Эту утилиту можно извлечь из набора утилит от Atollic TrueSTUDIO. Atollic TrueSTUDIO(R) for STM32 можно скачать с сайта ST.com.

Надо зарегистрироваться на сайте st.com. Скачивать дистрибутив en.TrueSTUDIO_V9.3.exe.exe получится при помощи VPN  так как РФ у ST числится, как санкционная территория.

ST-LINK_gdbserver установлен в 

C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0\Servers\ST-LINK_gdbserver\ST-LINK_gdbserver.exe

Нужно добавить в переменную Path путь к папке с утилитами binutils компилятора. В данном случае этот путь выглядит так:

C:\Program Files (x86)\GNU Tools ARM Embedded\5.4 2016q3\bin\

Затем перейти в папку:

C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0\Servers\ST-LINK_gdbserver

и запустить скрипт  ST-LINK_gdbserver.bat.

C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0\Servers\ST-LINK_gdbserver\ST-LINK_gdbserver.bat

Бинарь с отладочным сервером для STM32 можно найти в Atollic True STUDIO

echo off
cls
set AtolicDir=C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0
set GDBServerDir=%AtolicDir%\Servers\ST-LINK_gdbserver
set GDBServerPath="%GDBServerDir%\ST-LINK_gdbserver.bat"
cd %GDBServerDir%
call %GDBServerPath% 

При пуске ST-LINK_gdbserver.bat появится такой лог загрузки.

Сервер ждет подключения клиента. Серверу всё равно какую прошивку отлаживать. Он сам по себе.

Пуск GDB клиента  (Front-End )

GDB сервер работает в тандеме с GDB клиентом. GDB клиент берётся из GNU ARM Embedded ToolChain. ToolChain следует брать с официального сайта https://developer.arm.com/

Toolchain устанавливается как обычная win программа прямо из gcc-arm-none-eabi-10.3-2021.10-win32.exe файла

Проверка, что установилось. Вот полный комплект GCC ARM. Всего 32 утилиты.

Надо прописать адрес toolchain в переменной Path. Вам нужна только консольная утилита arm-none-eabi-gdb.exe. У нее только один аргумент elf фал.

set elf_file=project.elf
arm-none-eabi-gdb.exe  %elf_file%

Подключиться к отладочному серверу через порт 61234. Клиент и сервер обмениваются информацией по порту 61234

target remote localhost:61234

До пуска программы можно задать точку останова

b system_init_one 

Выглядит эта отладка примерно так

Само собой, в консоли GDB клиента есть история команд, и вы можете стрелками вверх/ вниз на клавиатуре набирать уже используемые в прошлом команды. Вам потребуются вот эти команды. Это джентельменский набор самых употребительных gdb команд.

Команда

Назначение

info locals

Показать локальные переменные

b function

Установить точку останова на функции с именем function

bt

Показать стек вызова функций

d

удалить все точки останова

d n

Удалить точку останова с номером n

с

Отпустить программу в режим свободного исполнения

f

Выполнить остаток функции

i b

Показать список всех точек останова

n

выполнить одну строчку кода

s

зайти во внутрь функции

info args

Показать аргументы текущей функции

jump main

Перезагрузиться

p count

напечатать значение переменной count

q

выйти из утилиты gdb

target remote localhost:2331

Подключиться к J-Link

Чтобы выйти из GDB клиента достаточно набрать в его консоли команду q (quit). Target все еще suspended. Поэтому также надо закрыть GDB сервер. Только после этого Target станет resumed и продолжит исполнять свой код.

Трюки для эффективной отладки прошивок

--Используйте HeartBeat LED. Так вы поймете, что прошивка зависла, если нет мигания.
--Используйте GPIO+Oscilloscope+DMM для физической отладки быстрых процессов
--Используйте утилиту STM Studio для построения графиков переменных по их адресу в ячейках RAM.
--Выводите тактирование на MCO и проверяете настройки PLL
--Если вы поймали HardFault и удалось извлечь значение регистров PC и LR, то можно определить на какой строчке упала прошивка выполнив преобразование адреса в номер строки утилитой arm-none-eabi-addr2line.exe.
--Можно расставлять assert-ы в коде
--Можно отлаживаться через UART-CLI.
--Выводите значение переменных на DAC (ЦАП) и проверяйте осциллографом
--Покрывайте код модульными тестами (программные скрепы). Это лучший способ найти ошибку в коде, который затруднительно пройти пошаговой отладкой. Плюс тесты помогут безопасно делать перестройку (рефакторинг). Сегодня российское общество испытывает явный дефицит программных скреп.

Итог

Удалось научиться пошагово отлаживать прошивку для STM32 без какой бы то ни было GUI-IDE. Даже без Eclipse. Прямо в консоли windows. Вот так просто и не затейливо.

Вот теперь Вы умеете делать пошаговую DBG отладку из консоли и можете учить этому других. Как сами видите, в GDB отладке через консоль нет вообще ничего сложного. Как по мне, дак, всякие там циклопические и дорогущие IDE (IAR, Keil и т п) для пошаговой отладки не особо-то и нужны как бы. Тем более в консольном отладчике, как правило, не надо проводить много времени. Подключился, поймал зависон, выполнил командц bt, понял, где зависла программа, отключился, починил и перепрошил. Вот и всё. Easy.

Потом, написав один набор скриптов запуска GDB, в консоли можно пошагово отлаживать ARM микроконтроллеры абсолютно любого вендора: STM32(ST), nRF5x(NS), CC26x2(TI), MDR32(M), LPC21xx (NXP). Меняться будут только GDB серверы. Всё остальное одинаково у всех. Ибо все же они - ARMы. При этом накладные расходы на установку Toolchain(а) для консольной пошаговой отладки минимальные и всё абсолютно бесплатно. Вам уже нравится консольный GDB?

PS. В частности мне удалось выяснить, что моя прошивка оказывается падала в HardFault_Handler из-за повторной инициализации тактирования PLL.

Словарь

Сокращение

Расшифровка

GDB

The GNU Project Debugger

SWD

Serial Wire Debug

RISC

reduced instruction set computer

VPN  

Virtual Private Network

GUI

graphical user interface

CLI

command-line interface

IDE

integrated development environment

ARM

Advanced RISC Machine

GCC

GNU Compiler Collection

Больше ссылок

Название ссылки

URL

Дайте мне 15 минут, и я изменю ваш взгляд на GDB @Djivs

https://habr.com/ru/articles/824638/

Настройка ToolChain(а) для Win10+GCC+С+Makefile+ARM Cortex-Mx+GDB

https://habr.com/ru/articles/673522/

Сайт, где можно скачать GDB клиент для ARM процессоров.

https://developer.arm.com/downloads/-/gnu-rm#:~:text=The%20GNU%20Arm%20Embedded%20Toolchain,Arm%20Cortex%2DR%20processor%20families.

16 Способов Отладки и Диагностики FirmWare

https://habr.com/ru/articles/681280/

GDB Client команды

https://docs.google.com/spreadsheets/d/1AWD8GsDfaA9dtdsfqgbB1klagou1yrREc1AAK9CRUik/edit?gid=0#gid=0

Пошаговая GDB отладка ARM процессора из консоли в Win10

https://habr.com/ru/articles/694708/

GDB Client команды

https://docs.google.com/spreadsheets/d/1AWD8GsDfaA9dtdsfqgbB1klagou1yrREc1AAK9CRUik/edit?gid=0#gid=0

Error
Note: automatically using hardware breakpoints for read-only addresses.

https://community.st.com/t5/stm32cubeide-mcus/could-some-expert-on-stm32f4-series-explain-the-meaning-of-the/td-p/120230

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы отлаживаете прошивки STM32 консольным GDB?
30.77%да4
69.23%нет9
Проголосовали 13 пользователей. Воздержался 1 пользователь.