Во второй части был создан о откомпилирован проект для Eclipse, в котором мы выполнили настройку компилятора. В принципе уже можно собирать программы и закидывать их в контроллер с помощью программ vsprog, vsgui, st-flash официальной утилиты ST или чего-то еще. 

Но иногда также необходима возможность отладки написанного кода. Она позволит смотреть каким именно образом выполняются операторы языка С или ассемблерные инструкции. Кроме того отладка нужна для просмотра/изменения памяти и регистров ядра в определенный зафиксированный момент времени. Зафиксированный он по отношению к контроллеру - как только отладчик получает управление, контроллер "замораживается" до тех пор пока отладчик снова не скажет ему продолжить отладку, или выполнить следующую инструкцию. 

Сначала я расскажу об отладке с помощью Versaloon/openocd, а в конце статьи покажу как этим же методом настроить отладку для STM32VLDiscovery. Что касается Discovery, то я буду рассказывать только об отличиях, поэтому советую подробно прочесть всю статью сначала.

Для начала заходим в Run->Debug Configurations. Чтобы создать отладочную конфигурацию выбираем раздел GDB Hardware Debugging и нажимаем New. В правой части окна нужно настроить процесс отладки. На вкладке Main установите "Enable auto build" чтобы при запуске отладки проект автоматически пересобирался.

armnonegdbmaineclipse.jpg

Существует несколько запускателей отладчика, по умолчанию используется DSF Launcher, который нам не подходит. Для выбора нужного нажмите на ссылке Select слева от кнопки Apply. Откроется окно, в котором нужно выбрать "Standard GDB Hardware Debugging Launcher".

Ок. Переходим на вкладку Debug и указываем команду отладчика "arm-none-eabi-gdb". Также нужно снять галочку "Use remote target"

armnonegdbdebugeclipse.jpg

Команда "Use remote target" нужна для подключения к debug-серверу, но я ее снял, так как это можно сделать на следующем шаге вручную указав команду remote target).

На вкладке Startup можно указать последовательность выполнения команд отладчика. Их можно настраивать либо галочками либо вписывать вручную. Нам нужно снять ВСЕ! галочки, затем в команды инициализации ввести:

target remote localhost:3333
load ${workspace_loc}/stm32_ld_vl/Debug/stm32_ld_vl.elf
file ${workspace_loc}/stm32_ld_vl/Debug/stm32_ld_vl.elf

Нажимаем Apply. Должно получится так:

armnonegdbstartupeclipse(2).jpg

Что касается Windows, то тут к сожалению придется вписать абсолютный путь (я не придумал как это можно решить). Дело в том, что gdb воспринимает бэкслешы, присутствующие в виндовых путях как начала escape-последовательностей, и из-за этого разделители придется экранировать (использовать "\\", вместо "\"). А вот Eclipse в переменной ${workspace_loc} подставляет путь с одинарными бэкслешами. 

Так что придется привязаться к расположению workspace(что конечно не есть хорошо, но другого выхода я не придумал). Например если у вас workspace расположен в  с:\workspace, то должно быть так:

target remote localhost:3333
load C:\\workspace\\stm32_ld_vl\\Debug\\stm32_ld_vl.elf
file C:\\workspace\\stm32_ld_vl\\Debug\\stm32_ld_vl.elf

armnonedebugwin(2).jpg

Осталось добавить отладочную конфигурацию в меню запуска отладки. Для этого на вкладке Common ставим галочку Debug:

armnonegdbcommoneclipse(1).jpg

Нажимаем Apply, Close.

Теперь запускаем Debug-сервер OpenOCD. Для этого в терминале выполняем скрипт: vsl_dbg_serv_swd.sh (В Windows из меню Пуск пункт Run SWD Debug Sever)

armnoneopenocdstartv(1).jpg

Теперь можно переходить в eclipse и запускать отладку. Для проверки поставим точку останова на первую строку обработчика прерывания таймера. Для того что бы поставить точку прерывания нужно встать курсором на строку и нажать Ctrl+Shift+B, либо просто нажать на рамку около строки. В результате на рамке должна появится синяя точка (см. рис. ниже). Теперь можно нажать на треугольник рядом с "жуком", появится меню запуска отладки. В нем нужно выбрать конфигурацию:

armnoneclipsestartdbg(1).jpg

После инициализации отладчика eclipse должен "встать" на первую инструкцию после выполняемую в resete. Этот ассемблерный код как видно находится в файле инициализации в библиотеке CMSIS. Именно он выполняет всякую инициализацию, а потом только вызывает функцию main(). Нажмем кнопку Resume (или F8):

armnoneclipsefirstinstrdbg.jpg

В результате код начнет выполнятся до тех пор, пока не выполнится до следующей точки останова. Должен загореться один светодиод.  Нажмите еще раз Resume, через секунду должен загореться другой светодиод и маркер опять встанит на эту строку (это уже следующий такт прерывания). Для того что бы отслеживать различные выражения (например просто переменную) нужно открыть представление Expressions (Window -> Show view -> Other -> Debug -> Expressions). В открывшемся представлении можно добавить нужное выражение (например добавим переменную i):

armnoneclipseexpressdbg.jpg

Для окончания сеанса отладки нужно нажать красную кнопку Terminate (Ctrl + F2), и остановить openocd (Ctrl+C в консоли где он запущен). Только после этого можно запускать следующий сеанс. 

Автоматический запуск/остановка OpenOCD

Всегда запускать вручную openocd не удобно. Тем более не удобно то, что приходится постоянно вручную закрывать openocd перед новой отладкой. 

Eclipse поможет нам все делать автоматически c помощью конфигураций внешних инструментов.

Заходим в Run->External Tools -> External Tools Configurations. Нажимаем Program, New. Таким образом мы создали конфигурацию для запуска одной внешней программы. Запускать мы будем bash, а в качестве аргумента передавать ему имя скрипта, который запускает OpenOCD.

  • Name: run_openocd
  • Location: /bin/bash (В win: C:\Program Files\Versaloon\vsl_dbg_serv_swd.bat. Здесь и далее я буду подразумивать что VersaloonSoft.exe был установлен в папку "по умолчанию" C:\Program Files\Versaloon\, если вы установили в другую заменяйте путь на свой)
  • Working Directory: пусто (В Win C:\Program Files\Versaloon\)
  • Arguments: vsl_dbg_serv_swd.sh (В win: пусто)
  • На вкладке Build снимаем галочку Build Befoure Launch (Так как сборка и так выполнится при запуске отладочной конфигурации)
  • Apply

armnoneclipseexternstartoocd(1).jpg

Скриншот для win:

armnonedebugwinrumoocdext(1).jpg

Теперь создадим еще одну конфигурацию для того что бы закрывать openocd:

  • Name: kill_openocd
  • Location: /bin/bash (В win: c:/windows/system32/taskkill.exe)
  • Arguments: -c "killall -9 openocd"  (В win: /f /IM openocd.exe)
  • На вкладке Build снимаем галочку Build Befoure Launch
  • Apply, Close.

armnoneclipseexternkilloocd.jpg

Скриншот для win:

armnonedebugwinrumoocdextkillall.jpg

Итак что у нас есть:

  1. отладочная конфигурация;
  2. конфигурация запуска внешнего инструмента bash, который запускает openocd;
  3. конфигурация запуска внешнего инструмента bash, который останавливает killall.

Осталось объединить их в группу запуска (Launch Group), что бы они вызывались в последовательности 3, 2, 1.

Заходим в Run -> Debug Configurations. Выбираем Launch Group, нажимаем New. Указываем Name: Debug. 

  • Нажимаем Add, выбираем Launch Mode: Run, зажимаем Shift и выбираем оба пункта kill_openocd, run_openocd. OK:

armnoneclipseexternaddkillrun(1).jpg

  • Нажимаем Add, выбираем Launch Mode: Debug, выбираем пункт stm32_ld_vl Debug, run_openocd. OK:

armnoneclipseexternaddhwdebg(1).jpg

В результате должно выйти так:

armnoneclipseexternaddlaunchlaunches.jpg

Именно в такой последовательности. Если последовательность перепутана, то нажимаем на строку и с помощью кнопок Up/Down переставляем, что бы было как на рисунке.

Ну и добавим группу в меню запуска отладки, путем установки галочки Debug на вкладке Common:

armnoneclipseexternaddlaunchgrcommon.jpg

Apply, Close. Теперь для запуска отладки достаточно выбрать пункт Debug в меню запуска отладки:

Запуск прошивки через vsprog из Eclipse

Кроме отладки иногда нужна и простая прошивка - скомпилировал, быстро прошил, посмотрел работает ли и если нужно начал отладку.

Добавим еще одну  конфигурацию внешнего инструмента:

  • Name: vsprog
  • Location: /usr/local/bin/vsprog (В Win C:\Program Files\Versaloon\vsprog.exe)
  • Arguments: -sstm32f1 -ms -oe -owf -I  ${workspace_loc}/stm32_ld_vl/Debug/stm32_ld_vl.hex -V "tvcc.set 3300" 
    (В Win: -sstm32f1 -ms -oe -owf -I  ${workspace_loc}\stm32_ld_vl\Debug\stm32_ld_vl.hex -V "tvcc.set 3300")
  • На вкладке Build оставляем галочку Build Befoure Launch, что бы проект пересобирался перед запускам этого инструмента.
  • Apply, Close.

armnoneflashonlyexttool.jpg

В win:

armnonedebugwinrumvspext(1).jpg

И также добавим группу запуска в Run -> Debug Configurations, которая сначала будет закрывать openocd (если он запущен vsprog не сможет прошить).

Name: Flash (от to flash - прошить). И добавляем подряд конфигурации kill_openocd, vsprog:

armnoneflashonlyextgrplaunches.jpg

Предлагаю добавить группу Flash в меню запуска (отметить галочку Run на вкладке Common):

armnoneflashonlyextgrpcommon.jpg

В результате после нажатия на треугольник рядом с кнопкой запуска появится список с пунктом Flash:

Теперь вести разработку можно не выходя из Eclipse. 

Быстрое создание новых проектов

Что бы быстро создать проект для той же линейки, которой вы создали новый проект, можно скопировать папку рабочей области (которая по-умолчанию называется workspace), и переименовать ее, дав название нового проекта.  Затем в Eclipse нужно сделать File->Switch Workspace и выбрать эту папку (либо просто выбрать рабочую область при запуске Eclipse).

В Windows в настройках конфигурации отладки также придется поменять абсолютный путь C:\workspace, на путь к новой папке. Рабочие области проектов, которые создавались в последних двух частях можете скачать тут.

Отладка на STM32VLDiscovery

Тут я просто приведу пачку скриншотов, показывающих отличие отладки с программатором stlink v1, который встроен в Discovery. Как выполнять настройки я написал выше.

Linux

Отладочная конфигурация (вкладка Main):

armdbgdics.jpg

вкладка Debugger:

armdbgdics2.jpg

Вкладка Startup:

armdbgdics3.jpg

Запуск и остановка дебаг-сервера st-util (который входит в texane/stlink):

armdbgdicsrunstutil.jpg

armdbgdicskillstutil.jpg

Группа запуска "Debug": 

armdbgdicsgroup.jpg

Windows

Тут в качестве gdb-сервера можно использовать ST-LINK_gdbserver из коммерческой среды Atollic TrueSTUDIO. Скачать его можно тут st-link_gdbserver.zip.

Ну а дальше все как всегда. Создаем отладочную конфигурацию: 

armwinlaunchgdbsrvparams.jpg

Как видно отличие от openocd и st-util в том, что этот gdb-server ожидает подключение на порте 61234. Команды отладчика, например такие:

armwinlaunchgdbsrvparams2.jpg

Ну и наконец создаем конфигурации для запуска gdb-сервера:

armwinlaunchgdbsrv.jpg

Для останова gdb-сервера:

armwinkilldbsrv.jpg

и объединяем их в группу запуска:

armwinlaunchgrp.jpg

Выводы

В статье мы рассмотрели настройку 4-х вариантов debug-серверов:

  • openocd (для Versaloon) в linux
  • openocd.exe (для Versaloon) в windows
  • st-util (Для st-link v1) в linux
  • ST-LINK_gdbserver.exe (Для st-link v1) в windows

И множество отладочных бэкендов на этом не заканчивается. Даже сам по себе openocd является достаточно универсальным сервером и сам может поддерживать не только versaloon а и тот же st-link. Однако я заметил в нем несколько мелких недоработок и решил попробовать другие серверы. Конечно, каждый из них не лишен недостатков так что при возникновении проблем можно всячески эксперементировать/взаимозаменять их. Открытая архитектура позволяет это делать.