Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2751
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Введение в отладку

135

5.1.2. Подключение к OpenOCD Telnet Console

После запуска OpenOCD он действует как демон-программа6, ожидающая внешних подключений. OpenOCD предлагает два способа взаимодействия с ней. Одним из них является режим посредством GDB, как мы увидим позже. Другой – через telnet-соединение7 с локальным портом 44448. Давайте начнем соединение.

$ telnet localhost 4444 Trying ::1...

telnet: connect to address ::1: Connection refused Trying 127.0.0.1...

Connected to localhost. Escape character is '^]'. Open On-Chip Debugger

>

Чтобы получить доступ к списку поддерживаемых команд, мы можем набрать help. Список довольно большой, и его содержание выходит за рамки данной книги (официальный документ OpenOCD – хорошее место, чтобы начать понимать, для чего используются данные команды). Здесь мы просто увидим, как загрузить микропрограмму.

Прежде чем мы сможем загрузить микропрограмму на целевой микроконтроллер нашей Nucleo, мы должны приостановить выполнение программы (halt) микроконтроллером. Это делается при помощи команды инициализации сброса reset init:

Open On-Chip Debugger > reset init

target state: halted

target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x080002a8 msp: 0x20018000, semihosting

OpenOCD говорит нам, что микроконтроллер теперь приостановлен, и мы можем приступить к загрузке микропрограммы с помощью команды flash write_image:

> flash write_image erase <путь к файлу .elf>

 

auto erase enabled

 

 

Padding image

section 0 with 3 bytes

 

target state:

halted

 

 

target halted

due to

breakpoint, current mode: Thread

 

xPSR: 0x61000000 pc:

0x20000042 msp: 0xfffffffc, semihosting

 

wrote 16384 bytes from file <путь к файлу .elf> in 0.775872s (20.622 KiB/s)

>

где <путь к файлу .elf> – полный путь к бинарному файлу (обычно он хранится во вложенной папке Debug в папке проекта Eclipse).

Чтобы запустить нашу микропрограмму, мы можем просто ввести команду сброса reset в командной строке OpenOCD.

6Демон – это способ UNIX называть программы, работающие в качестве сервисов. Например, HTTP-сервер или FTP-сервер в UNIX называются демоном. В мире Windows такие программы называются сервисами.

7Начиная с Windows 7, telnet является необязательным компонентом для установки. Тем не менее, настоятельно рекомендуется использовать более развитый клиент telnet, такой как putty

(http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).

8Порт по умолчанию можно изменить, введя команду telnet_port в конфигурационном файле платы. Это может быть полезно, если мы отлаживаем две разные платы с использованием двух сессий OpenOCD, как мы увидим далее.

Введение в отладку

136

Существует несколько других команд OpenOCD, которые могут быть полезны во время отладки микропрограммы, особенно при работе с аппаратными сбоями. Команды reg показывают текущее состояние всех регистров ядра Cortex-M, когда целевой микроконтроллер приостановлен:

>reset halt

...

>reg

===== arm v7m registers

(0)r0 (/32): 0x00000000

(1)r1 (/32): 0x00000000

...

Другая группа полезных команд – это md[whb] для чтения слова, полуслова и байта соответственно. Например, команда:

> mdw 0x8000000 0x08000000: 12345678

считывает 32 бита (слово) по адресу 0x8000 000. Команды mw[whb] являются эквивалентными командами для хранения данных в заданной ячейке памяти.

Теперь вы можете закрыть демон OpenOCD, отправив команду выключения shutdown на консоль telnet. Она также закроет сеанс telnet.

5.1.3. Настройка Eclipse

Теперь, когда мы знакомы с тем, как работает OpenOCD, мы можем настроить Eclipse для отладки нашего приложения из IDE. Это значительно упростит процесс отладки, позволяя нам легко устанавливать точки останова в нашем коде, проверять содержимое переменных и выполнять пошаговое выполнение.

Eclipse – это универсальная интегрированная среда разработки с широкими возможностями настройки, позволяющая создавать конфигурации, которые легко интегрируют внешние инструменты, такие как OpenOCD, в цикл разработки ПО. Процесс, который мы собираемся выполнить, заключается в создании конфигурации отладки. Существует как минимум три способа интеграции OpenOCD в Eclipse, но, возможно, только один из них является наиболее удобным, когда мы имеем дело с отладчиком ST-LINK.

Мы сконфигурируем OpenOCD как внешний инструмент отладки, который мы выполняем только один раз и оставляем как демон-процесс, как мы делали в предыдущем параграфе, выполняя его из командной строки. Следующим шагом является создание конфигурации отладки GDB, которая инструктирует GDB подключиться к порту 3333 OpenOCD и использовать его в качестве сервера GDB.

Введение в отладку

137

Рисунок 3: Диалоговое окно External Tools Configurations

Во-первых, убедитесь, что у вас есть проект, открытый в Eclipse. Затем перейдите в меню

Run → External Tools → External Tools Configurations…. Откроется диалоговое окно конфигураций внешних инструментов External Tools Configurations. Выделите пункт Program в представлении списка слева и щелкните по значку New (он обведен красным на рисунке 3). Теперь заполните поля ниже следующим образом:

Name: впишите название, которое вам нравится для новой конфигурации; предлагается использовать OpenOCD FX, где FX – это семейство STM32 вашей платы

Nucleo (F0, F1 и т. д.).

Location: выберите местоположение исполняемого файла OpenOCD

(C:\STM32Toolchain\openocd\bin\openocd.exe для пользователей Windows,

/STM32Toolchain/openocd/bin/openocd для пользователей Linux и Mac OS).

Working directory: выберите местоположение каталога скриптов OpenOCD

(C:\STM32Toolchain\openocd\scripts для пользователей Windows,/STM32Toolchain/openocd/scripts для пользователей Linux и Mac OS).

Arguments: впишите аргументы командной строки для OpenOCD, то есть

-f

board\<nucleo_conf_file.cfg>

для

пользователей

Windows

и

-f

board/<nucleo_conf_file.cfg>

для пользователей Linux

и Mac

OS.

<nucleo_conf_file.cfg> должен быть заменен конфигурационным файлом, который соответствует вашей плате Nucleo, в соответствии с таблицей 1.

По завершении нажмите кнопку Apply, а затем кнопку Close. Чтобы избежать ошибок, которые могут вызвать путаницу, на рисунке 4 показано, как заполнять поля в Windows, а на рисунке 5 – в UNIX-подобной системе (соответственно расположите домашний каталог).

Введение в отладку

138

Рисунок 4: Как заполнить поля External Tools Configurations в Windows

Рисунок 5: Как заполнить поля External Tools Configurations в UNIX-подобных системах

Теперь чтобы запустить OpenOCD, вы можете просто перейти в меню Run → External Tools и выбрать созданную вами конфигурацию. Если все выполнено правильно, вы должны увидеть классические сообщения OpenOCD в консоли Eclipse, как показано на рисунке 6. В то же время светодиод LD1 на плате Nucleo должен начать мигать ЗЕЛЕНЫМ и КРАСНЫМ поочередно.

Введение в отладку

139

Рисунок 6: Вывод консоли OpenOCD в Eclipse

Теперь мы готовы создать конфигурацию отладки для использования GDB в сочетании с OpenOCD. Данная операция должна повторяться всякий раз, когда мы создаем новый проект.

Перейдите в меню Run → Debug Configurations…. Выделите пункт GDB OpenOCD Debugging в представлении списка слева и щелкните по значку New (тот, что обведен красным на рисунке 7).

Рисунок 7: Диалоговое окно Debug Configuration

Eclipse автоматически заполняет все необходимые поля во вкладке Main. Однако, если вы используете проект с несколькими конфигурациями сборки, вам нужно нажать кнопку Search Project и выбрать ELF-файл для активной конфигурации сборки.

Введение в отладку

140

К сожалению, иногда Eclipse не может автоматически найти бинарный файл. Это, вероятно, ошибка или, по крайней мере, странное поведение. Такое может случаться очень часто, особенно когда открыто более одного проекта. Чтобы решить данную проблему, нажмите кнопку Browse и найдите бинарный файл в папке проекта (обычно он находится в подкаталоге <название-проекта>/Debug).

В качестве альтернативы, другое решение заключается в закрытии диалогового окна Debug Configuration, а затем обновлении всего дерева проекта (щелкнув правой кнопкой мыши по корню проекта и выбрав пункт Refresh). Вы заметите, что Eclipse обновляет содержимое вложенной папки Binaries. Теперь вы можете снова открыть диалоговое окно Debug Configuration и завершить настройку, нажав кнопку Search Project.

Рисунок 8: Диалоговое окно Debug Configuration – раздел Debugger

Затем перейдите во вкладку Debugger и снимите флажок Start OpenOCD locally, поскольку мы создали конкретную конфигурацию внешнего инструмента OpenOCD. Убедитесь, что все остальные поля совпадают с полями, показанными на рисунке 8.

Введение в отладку

141

Рисунок 9: Диалоговое окно Debug Configuration – раздел Startup

Теперь перейдите в раздел Startup и оставьте все параметры по умолчанию, но не забудьте добавить команду OpenOCD set remotetimeout 20, как показано на рисунке 9.

Что означают все эти поля?

Если вы сделаете паузу и посмотрите на поля в данном разделе, вы должны распознать большинство команд, которые мы ввели при использовании сеанса telnet OpenOCD для загрузки микропрограммы на нашу плату Nucleo.

Флажок Initial reset является эквивалентом reset init для сброса микроконтроллера. Load symbols и Load executables являются эквивалентом ко-

манды flash write_image9. Наконец, set remotetimeout 20 увеличивает время

поддержания активности между GDB и OpenOCD, что гарантирует, что нижний уровень OpenOCD (OpenOCD backend) все еще жив. 20(мс) – это проверенное значение для использования.

9 Опытные пользователи STM32 будут оспаривать данное предложение. Они были бы правы: здесь мы выдаем разные команды загрузки GDB, а не команду OpenOCD flash write_image. Однако ради простоты я считаю данное предложение верным. Позже глава объяснит это лучше.