Как использовать GDB (GNU Debugger) и OpenOCD для отладки микроконтроллеров - с терминала?

стандартный (недорогой) способ программирования микроконтроллеров ARM использует Eclipse со сложной цепочкой инструментов, подключенной к нему. Eclipse определенно имеет свои достоинства, но я хотел бы чувствовать себя независимым от этой IDE. Я хотел бы узнать, что происходит за кулисами, когда я создаю (compile - link - flash) свое программное обеспечение и когда я запускаю сеанс отладки. Чтобы получить такое более глубокое понимание, было бы замечательно запустить всю процедуру из командной строки.

Примечание: я использую 64-разрядную Windows 10. Но большинство вещей, объясненных здесь, также относится к системам Linux. Откройте все командные терминалы с правами администратора. Это может избавить вас от многих проблем.

1. Построение программного обеспечения

миссии первого выполнена. Теперь я могу скомпилировать и связать свое программное обеспечение в двоичный .bin и .elf Изображение через командную строку. Ключом к успеху было выяснить, где Eclipse помещает свои make-файлы для конкретного проекта. Как только вы узнаете, где они находятся, все, что вам нужно сделать, это открыть командный терминал и ввести .

enter image description here

вам больше не нужно затмение для этого! Особенно если вы можете прочитать (и понять) Makefile и настроить его для ваших нужд, когда ваш проект авансы.

обратите внимание, что я нашел инструменты GNU (компилятор, компоновщик, утилита make, GDB, ...) в следующей папке после установки SW4STM32 (System Workbench для STM32):

C:Ac6SystemWorkbenchpluginsfr.ac6.mcu.externaltools.arm-none.win32_1.7.0.201602121829toolscompiler

затем я сделал новую папку на своем жестком диске и скопировал в нее все эти инструменты GNU:

C:AppsAC6GCC
           |-> arm-none-eabi
           |-> bin
           '-> lib

и я добавляю эти записи в "переменную пути среды":

 - C:AppsAC6GCCbin
 - C:AppsAC6GCClibgccarm-none-eabi.2.1

Хурай, теперь у меня есть все инструменты GNU и работает в моей системе! Я поставил следующее в папке makefile:

@echo off
echo.
echo."--------------------------------"
echo."-           BUILD              -"
echo."--------------------------------"
echo.

make -j8 -f makefile all

echo.

запуск этого bat-файла должен выполнить эту работу! Если все пойдет хорошо, вы получите один .bin и один .elf двоичный файл в результате компиляции.

2. Мигание и отладка прошивки

естественным следующим шагом является мигание прошивки на чип и запуск сеанса отладки. В Eclipse это всего лишь один "щелчок по кнопке" - по крайней мере, если Eclipse настроен правильно для вашего микроконтроллера. Но что происходит за кулисами? Я прочитал (часть) магистерской диссертации Доминика Рата-разработчика OpenOCD. Ты можешь найти его. вот:http://openocd.net/ . Вот что я узнал:--34-->

  • Eclipse запускает программное обеспечение OpenOCD при нажатии на значок "отладка". Eclipse также предоставляет некоторые файлы конфигурации для OpenOCD-такие, что OpenOCD знает, как подключиться к вашему микроконтроллеру. "Как установить связь" - не тривиальная вещь. OpenOCD должен найти правильный драйвер USB для подключения к адаптеру JTAG (например, STLink). Как адаптер JTAG, так и его USB-драйвер обычно поставляется производителем чипа (например, поштучно). Eclipse также передает файл конфигурации OpenOCD, который описывает спецификации микроконтроллера. Как только OpenOCD знает обо всех этих вещах, он может сделать надежное соединение JTAG с целевым устройством.

  • OpenOCD запускает два сервера. Первый-это сервер Telnet на TCP-порту 4444. Это дает доступ к CLI OpenOCD (интерфейс командной строки). Клиент Telnet может подключаться и отправка команд в OpenOCD. Эти команды могут быть простыми "stop", "run", "set breakpoint",...

  • таких команд может быть достаточно для отладки вашего микроконтроллера, но многие люди уже были знакомы с отладчиком Gnu (GDB). Вот почему OpenOCD также запускает сервер GDB на TCP-порту 3333. Клиент GDB может подключиться к этому порту и начать отладку микроконтроллера!

  • отладчик Gnu-это программное обеспечение командной строки. Много люди предпочитают визуальный интерфейс. Это именно то, что делает Eclipse. Eclipse запускает клиент GDB, который подключается к OpenOCD, но все это скрыто для пользователя. Eclipse предоставляет графический интерфейс, который взаимодействует с клиентом GDB за кулисами.

я сделал рисунок, чтобы объяснить все эти вещи:

enter image description here

> > запуск OpenOCD

мне удалось запустить OpenOCD из командная строка. Я объясню, как.

  1. сначала убедитесь, что ваш программист STLink-V2 JTAG правильно установлен. Вы можете протестировать установку с помощью "утилиты stlink" из STMicroelectronics. Он имеет хороший графический интерфейс, и вы просто нажмите кнопку connect. enter image description here
  2. далее загрузите исполняемый файл программного обеспечения OpenOCD с этого веб-сайта:http://gnutoolchains.com/arm-eabi/openocd/ . Установите его и поместите в папку на вашем жестком диске, например "C:Apps".
  3. откройте командный терминал и запустите OpenOCD. Вам нужно будет дать OpenOCD несколько файлов конфигурации, чтобы он знал, где искать ваш микроконтроллер. Обычно необходимо указать файл конфигурации, описывающий программист JTAG, и файл конфигурации, определяющий микроконтроллер. Передайте эти файлы в OpenOCD с помощью в командной строке. Вам также необходимо предоставить OpenOCD доступ к scripts папка, передавая ее с

5 ответов


насколько я помню, у меня тоже были проблемы с командой прямой загрузки, поэтому я переключился на "flash write_image erase my_project.hex 0 ihex".. очевидно, я использовал hex-файлы, но похоже, что файлы elf должны работать, см. http://openocd.org/doc/html/Flash-Commands.html ... хорошо, что эта команда также стирает только разделы flash, которые записываются, что действительно удобно, и вам не нужно стирать

прежде чем запускать выше команда вам нужно будет запустить "stm32f1x unlock 0", чтобы убедиться, что чип разблокирован и ваш разрешено подключить к вспышке ... См. таблицу данных об этом

также для начала работы команда "stm32f1x mass_erase 0" полностью и быстро сотрет чип, поэтому хорошо убедиться, что вы начинаете в известном состоянии

Я знаю, что некоторые из этих команд говорят, что они для f1, но поверьте мне, они работают для серии f4 до

Btw этот файл содержит большую часть команды I используйте для вспышки моего f4, так что это может быть хорошая ссылка https://github.com/othane/mos/blob/master/hal/stm32f373/stm32f373.mk

Я надеюсь, что вы получите unstuck


Это немного краткий и не большой стиль stackoverflow, но я бы указал вам на мой код, где я установил это для моей библиотеки "mos" для STM32F4 и STM32F1 (https://github.com/othane/mos)... Это большая тема для ответа, поэтому я, хотя пример может быть лучше

короче говоря, мой проект-это дерево Makefiles, так как у вас есть ваш код, компилирующий основной интерес для вас, находится здесь https://github.com/othane/mos/blob/master/hal/stm32f373/stm32f373.mk ... в основном вам нужен openocd, а затем у меня есть ряд команд, позволяющих стирать чип или мигать и отлаживать новый код и т. д., просто набрав make .стереть или сделать .вспышка или make .debug

наконец, если вы посмотрите в моих модульных тестах (это в основном примеры программ) , вы найдете Makefile для его создания + файл gdbinit, как этот https://github.com/othane/mos/blob/master/utest/gpio/debug_gpio_utest.gdbinit ... тогда вы просто делаете " make & & make .flash & & make .отладка " в одном терминале и вызовите свои кросс-компиляторы gdb, как это "arm-none-eabi-gdb-x ./debug_gpio_utest.файл gdbinit" в другом ... это запустит gdb после мигания кода, и вы можете использовать обычные команды break и list из gdb и т. д. Для взаимодействия с кодом (обратите внимание, как я определил команду reset в .gdbinit файл, проверка справки для mon command ... в основном это позволит вам отправлять команды через gdb непосредственно в openocd и действительно полезно)

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


на первый взгляд распределение на gnutoolchains.com должно быть достаточно хорошо. Есть несколько сценариев сборки, чтобы сварить свою собственную версию. У меня есть мой, чтобы включить ARM7TDMI. Он отлично работает под Linux и FreeBSD, но MinGW не удалось в последний раз, когда я пробовал: - (

Что касается OpenOCD, я бы рекомендовал запустить его в том же каталоге, что и ваш экземпляр GDB, чтобы двоичная загрузка казалась прозрачной, если вы вызываете ее из GDB (самый простой способ). У вас также есть возможность создать скрипт, который запускает OpenOCD и загружает код, но затем вам придется перезапускать его после каждой компиляции.


теперь вы просто вызываете " gdb "и подключаете его к" удаленному серверу " (localhost, если сервер и gdb работают на одной машине). Настройте GDB так, чтобы он знал расположение исходного кода и расположение файла ELF. Есть тонна веб-сайтов, которые проходят через основное использование GDB..

кажется, есть GDB для Windows (http://www.equation.com/servlet/equation.cmd?fa=gdb)

следующие команды в GDB должны получить вас начал:

удаленный адрес localhost:3333

каталог /путь/к/проекта

символ-файл /путь/к/проекта.эльф


по-видимому, это была проблема с оборудованием. Я никогда не думал, что мой чип будет дефектом, так как загрузка двоичного файла на чип с помощью утилиты STLink работала без проблем. Только OpenOCD жаловался и давал ошибки. Поэтому, естественно, я винил OpenOCD , а не сам чип.

сегодня я попробовал ту же процедуру с новым чипом на борту, и теперь он работает!

Я получаю следующий вывод в GDB при выдаче load команда:

    (gdb) load
       Loading section .isr_vector, size 0x1c8 lma 0x8000000
       Loading section .text, size 0x39e0 lma 0x80001c8
       Loading section .rodata, size 0x34 lma 0x8003ba8
       Loading section .init_array, size 0x4 lma 0x8003bdc
       Loading section .fini_array, size 0x4 lma 0x8003be0
       Loading section .data, size 0x38 lma 0x8003be4
       Start address 0x8003450, load size 15388
       Transfer rate: 21 KB/sec, 2564 bytes/write.
    (gdb)

спасибо всем, кто сделал все возможное, чтобы помочь мне : -)