OpenOCD
Отладчик GDB не умеет сам говорить с выводами SWD или JTAG микроконтроллера. Между ними нужен посредник, который управляет адаптером и понимает ядро и флеш-память конкретного чипа. Самый распространённый открытый посредник — OpenOCD.
Обновлено Редакция GAW
OpenOCD (Open On-Chip Debugger) — открытая программа для отладки, внутрисхемного программирования и граничного сканирования встраиваемых систем. Сама по себе она не касается выводов микроконтроллера: по руководству OpenOCD, работа идёт через отладочный адаптер — модуль, который выдаёт на плату сигналы JTAG или SWD. Адаптер бывает отдельным «свистком» или встроен в отладочную плату. Руководство отдельно напоминает разницу транспортов: JTAG умеет и отладку, и граничное сканирование, SWD — только отладку.
Из чего складывается запуск
OpenOCD настраивают файлами конфигурации, которые лежат в его библиотеке скриптов (гл. 5–6 руководства):
| Файл | Что описывает |
|---|---|
interface/…cfg | адаптер: драйвер, частоту, выбранный транспорт |
target/…cfg | кристалл: ядро, TAP, банки флеш-памяти |
board/…cfg | плату: какой target, как разведены сигналы сброса, что делать при reset init |
В простом случае хватает двух файлов: openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg (разд. 4.1). Для адаптеров по стандарту CMSIS-DAP есть драйвер cmsis-dap: версия 1 работает через отчёты USB HID, версия 2 — через bulk-передачи USB.
Порты и подключение GDB
После запуска OpenOCD открывает три сервера (гл. 7):
- 3333 — GDB. Если целей несколько, вторая слушает 3334 и так далее. GDB подключается командой
target extended-remote localhost:3333; режим extended-remote руководство называет предпочтительным. - 4444 — telnet. Здесь команды OpenOCD вводит человек:
reset halt,flash info 0,mdw 0x08000000. - 6666 — Tcl. Машинный интерфейс для скриптов и сред разработки.
Как устроена связь GDB с отладочным сервером, разобрано в термине GDB-сервер. Внутри сеанса GDB команды самого OpenOCD передают через monitor: пример из гл. 20 — monitor reset halt, затем load для записи программы и continue. Список доступных команд выдаёт monitor help.
Запись флеш-памяти без отладки
Для прошивки в производстве или из скрипта есть команда program (гл. 13). Она выполняет init, затем reset init, стирает и пишет флеш командой flash write_image, по флагу verify сверяет записанное, по reset запускает программу, по exit завершает OpenOCD:
openocd -f board/stm32f3discovery.cfg -c "program firmware.elf verify reset exit"
openocd -f board/stm32f3discovery.cfg -c "program firmware.bin exit 0x08000000"
Файлы ELF, HEX и S19 несут адреса сами, а у двоичного файла .bin адрес нужно указать. OpenOCD входит в набор серверов отладки STM32CubeIDE, работает с большинством адаптеров из обзора программаторов и отладчиков, а выводы и разъёмы отладки описаны в статье JTAG и SWD.
Частые вопросы
Какие порты открывает OpenOCD?
По руководству OpenOCD, если порты не заданы в конфигурации: 3333 — для GDB, 4444 — для telnet, через который команды вводит человек, и 6666 — для машинного Tcl-интерфейса. Если целей несколько, вторая получает порт GDB 3334, третья 3335 и так далее. Любой порт можно сменить командами gdb port, telnet port и tcl port или отключить словом disabled.
Как прошить микроконтроллер OpenOCD без GDB?
Командой program прямо из командной строки: openocd -f board/<плата>.cfg -c "program firmware.elf verify reset exit". OpenOCD инициализирует адаптер, сбрасывает и останавливает ядро, стирает и записывает флеш, сверяет записанное, запускает программу и завершается. Для файла .bin нужно указать адрес, например 0x08000000 для STM32.
Чем OpenOCD отличается от GDB?
GDB — сам отладчик: он знает символы программы, ставит точки останова по строкам исходника и показывает переменные. OpenOCD — сервер, который управляет адаптером SWD или JTAG, знает ядро и флеш-память конкретного чипа и выполняет команды GDB на железе. GDB подключается к нему по TCP командой target extended-remote localhost:3333.
Источники
- The OpenOCD Project. OpenOCD User's Guide for release 0.12.0+dev, 26 October 2026 (GNU FDL 1.2) — About: OpenOCD предназначен для отладки, внутрисхемного программирования и граничного сканирования, работает через отладочный адаптер; JTAG поддерживает отладку и граничное сканирование, SWD — только отладку; разд. 4.1: запуск openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg; гл. 6: файлы interface, board и target; гл. 7: gdb port по умолчанию 3333 (следующей цели — порт + 1), tcl port 6666, telnet port 4444; разд. 8: драйвер cmsis-dap, backend hid (v1) и usb_bulk (v2); гл. 12: команда program filename [preverify] [verify] [reset] [exit] [offset]; гл. 13: program выполняет init, reset init, flash write_image, verify_image, reset run, пример program filename.bin exit 0x08000000; гл. 20: target extended-remote localhost:3333, monitor reset halt, load, monitor help
- Free Software Foundation. Debugging with GDB, 20.1 Connecting to a Remote Target (GNU FDL) — режимы target remote и target extended-remote; в extended-remote GDB остаётся подключённым после выхода программы; подключение по TCP: target remote host:port; команда monitor передаёт произвольную команду удалённому монитору
Нашли ошибку?
Смотрите также
- JTAG и SWDTAP из 16 состояний, IR/DR, пакеты SWD, ACK, DP и AP, SWO, VTref
- Программаторы и отладчикиUSBasp, ST-LINK, J-Link, PICkit 5, Snap, CMSIS-DAP, WCH-LinkE: сравнение
- SWDSerial Wire Debug: отладка и прошивка Cortex-M по двум проводам
- JTAGПоследовательный интерфейс тестирования и отладки по IEEE 1149.1: TCK, TMS, TDI, TDO
- STM32CubeIDEСреда ST для STM32: проект, сборка, отладка ST-LINK, SWV и ошибки
- GDB-серверПосредник между GDB и целью: протокол RSP, режимы remote и extended-remote