Другое

Просмотр регистров периферии в GDB с OpenOCD для STM32F103C8T6

Как просматривать таблицы регистров периферии STM32F103C8T6 в GDB с использованием OpenOCD. Интеграция SVD-файлов, команды GDB и альтернативные методы отладки.

Как просматривать таблицу регистров периферии в GDB при использовании OpenOCD для отладки STM32F103C8T6?

Мне необходимо отладить микроконтроллер STM32F103C8T6. Я пишу код в текстовом редакторе и прошиваю его через ST‑Link. Сервер OpenOCD запущен, GDB подключён. Отладка работает корректно, однако информация о регистрах ядра не даёт полного понимания состояния системы.

Как можно проверять значения переменных и регистров периферии в табличном формате с их символьными именами? Я нашёл SVD‑файл для этого микроконтроллера, но не знаю, как его интегрировать в процесс отладки без написания Python‑скриптов. Также я слышал, что в среде IAR используются DDF (Device Description File), но найти информацию о них в интернете не удалось.

Для просмотра таблицы регистров периферии в GDB при использовании OpenOCD для отладки STM32F103C8T6 можно использовать несколько подходов: загрузить SVD‑файл через GDB CLI или GUI, использовать прямые обращения к адресам регистров через команду monitor, или применять плагины для GDB, такие как gdb-dashboard или openocd-gdb-bridge. SVD‑файл можно интегрировать без Python‑скриптов, используя встроенные возможности GDB и OpenOCD.

Содержание

Настройка OpenOCD и GDB для работы с SVD‑файлами

Для начала работы с SVD‑файлом STM32F103C8T6 необходимо настроить OpenOCD и GDB для корректной интерпретации регистров периферии. SVD‑файл (System View Description) содержит описание всех регистров периферийных устройств, их адресов, размеров и полей.

Конфигурация OpenOCD

Откройте конфигурационный файл OpenOCD и добавьте путь к SVD‑файлу. Для STM32F103C8T6 SVD‑файл обычно находится в папке с документацией к микроконтроллеру или может быть загружен с сайта STMicroelectronics.

bash
# Пример конфигурационного файла OpenOCD
source [find interface/stlink-v2.cfg]
transport select hla_swd
source [find target/stm32f1x.cfg]

# Указание пути к SVD‑файлу
svd_file /path/to/STM32F103xx.svd

Подключение GDB с поддержкой SVD

Запустите GDB с указанием пути к исполняемому файлу прошивки:

bash
arm-none-eabi-gdb -ex "target remote localhost:3333" your_firmware.elf

После подключения к OpenOCD загрузите SVD‑файл в GDB:

gdb
(gdb) add-symbol-file /path/to/STM32F103xx.svd
(gdb) svd-load /path/to/STM32F103xx.svd

Важно: Не все версии GDB поддерживают встроенную загрузку SVD‑файлов. Для полной поддержки может потребоваться использование плагинов или альтернативных методов.

Просмотр регистров через GDB CLI

После настройки SVD‑файла можно использовать различные команды GDB для просмотра регистров периферии.

Базовый просмотр регистров

Для просмотра конкретного регистра используйте команду p (print) с указанием имени регистра:

gdb
(gdb) p RCC->CR
$1 = 0x00000083
(gdb) p GPIOA->ODR
$2 = 0x00000000

Просмотр нескольких регистров

Для просмотра группы регистров можно использовать команды с шаблонами:

gdb
(gdb) p *(RCC*)0x40021000
$3 = {CR = 0x00000083, CFGR = 0x00000000, CIR = 0x00000000, APB2RSTR = 0x00000000, APB1RSTR = 0x00000000, AHBENR = 0x00000000, APB2ENR = 0x00000000, APB1ENR = 0x00000000, BDCR = 0x00000000, CSR = 0x00000000}

Просмотр регистров GPIO

Для просмотра регистров портов GPIO:

gdb
(gdb) p *(GPIOA_TypeDef*)0x40010800
$4 = {CRL = 0x44444444, CRH = 0x44444444, IDR = 0x00000000, ODR = 0x00000000, BSRR = 0x00000000, BRR = 0x00000000, LCKR = 0x00000000}

Использование GDB с форматированным выводом

Для получения табличного вывода с форматированием можно использовать различные подходы.

Использование команды x с форматированием

Команда x (examine) позволяет просматривать память в разных форматах:

gdb
(gdb) x/8wx 0x40021000  # Просмотр 8 слов в 16‑ричном формате
0x40021000: 0x00000083 0x00000000 0x00000000 0x00000000
0x40021010: 0x00000000 0x00000000 0x00000000 0x00000000

(gdb) x/16bx 0x40010800  # Просмотр 16 байт
0x40010800: 0x44 0x44 0x44 0x44  0x44 0x44 0x44 0x44
0x40010808: 0x00 0x00 0x00 0x00  0x00 0x00 0x00 0x00

Создание макросов для табличного вывода

Можно создать макросы в GDB для форматированного вывода регистров:

gdb
define show-registers
    echo "=== RCC Registers ===\n"
    x/20wx 0x40021000
    echo "\n=== GPIOA Registers ===\n"
    x/20wx 0x40010800
    echo "\n=== GPIOB Registers ===\n"
    x/20wx 0x40010000
end

Использование макроса:

gdb
(gdb) show-registers

Использование OpenOCD monitor команд

OpenOCD предоставляет возможность выполнения команд на целевом устройстве:

gdb
(gdb) monitor reset halt
(gdb) monitor mdw 0x40021000 8  # Просмотр 8 слов по адресу RCC
(gdb) monitor mdw 0x40010800 8  # Просмотр 8 слов по адресу GPIOA

Работа с DDF‑файлами в IAR

DDF (Device Description File) — это формат файлов, используемый в среде разработки IAR Embedded Workbench для описания периферийных устройств микроконтроллеров.

Особенности DDF‑файлов

DDF‑файлы содержат:

  • Описание регистров периферии
  • Поля и биты каждого регистра
  • Адресные пространства
  • Информацию о прерываниях
  • Дополнительную метаданные для отладчика

Преимущества DDF по сравнению с SVD

  1. Расширенная поддержка: DDF могут содержать больше информации, чем SVD
  2. Оптимизация для отладчика: Специально оптимизированы для работы с отладчиком IAR
  3. Дополнительные функции: Могут включать специфические для платформы опции

Ограничения использования DDF

Основным ограничением DDF является их привязка к экосистеме IAR — они не могут быть напрямую использованы в GDB/OpenOCD без преобразования. Для использования в GDB необходимо преобразовать DDF в SVD или использовать альтернативные методы.

Альтернативные методы просмотра регистров

Использование GDB Dashboard

GDB Dashboard — это расширение для GDB, предоставляющее красивый интерфейс для отладки:

bash
# Установка GDB Dashboard
git clone https://github.com/cyrus-and/gdb-dashboard ~/.gdbinit

После установки GDB Dashboard будет автоматически загружаться при запуске GDB и предоставлять интерактивный интерфейс для просмотра регистров.

Использование OpenOCD GDB Server

OpenOCD предоставляет собственный GDB сервер с дополнительными возможностями:

gdb
(gdb) monitor reg  # Просмотр всех регистров процессора
(gdb) monitor reg pc  # Просмотр счетчика программ
(gdb) monitor reg sp  # Просмотр указателя стека

Использование Memory View в IDE

Если вы используете IDE с поддержкой GDB (например, VS Code с плагинами), вы можете использовать встроенные средства просмотра памяти:

gdb
# В VS Code с плагином C++
(gdb) add-symbol-file firmware.elf
(gdb) p RCC->CR

Практические примеры и рекомендации

Пример 1: Просмотр регистров таймеров

gdb
# Просмотр регистров TIM2
(gdb) p *(TIM2_TypeDef*)0x40000000
$5 = {CR1 = 0x0000, CR2 = 0x0000, SMCR = 0x0000, DIER = 0x0000, SR = 0x0000, EGR = 0x0000, CCMR1 = 0x0000, CCMR2 = 0x0000, CCER = 0x0000, CNT = 0x0000, PSC = 0x0000, ARR = 0xFFFF, CCR1 = 0x0000, CCR2 = 0x0000, CCR3 = 0x0000, CCR4 = 0x0000, BDTR = 0x0000, DCR = 0x0000, DMAR = 0x0000}

Пример 2: Просмотр регистров UART

gdb
# Просмотр регистров USART1
(gdb) p *(USART_TypeDef*)0x40013800
$6 = {SR = 0x00C0, DR = 0x0000, BRR = 0x0271, CR1 = 0x0000, CR2 = 0x0000, CR3 = 0x0000, GTPR = 0x0000}

Пример 3: Просмотр регистров ADC

gdb
# Просмотр регистров ADC1
(gdb) p *(ADC_TypeDef*)0x40012400
$7 = {SR = 0x0000, CR1 = 0x0000, CR2 = 0x0000, SMPR2 = 0x00000000, SMPR1 = 0x00000000, JOFR1 = 0x0000, JOFR2 = 0x0000, JOFR3 = 0x0000, JOFR4 = 0x0000, HTR = 0x0FFF, LTR = 0x0000, SQR1 = 0x0000, SQR2 = 0x0000, SQR3 = 0x0000, JSQR = 0x0000, JDR1 = 0x0000, JDR2 = 0x0000, JDR3 = 0x0000, JDR4 = 0x0000, DR = 0x0000}

Рекомендации по оптимизации

  1. Используйте алиасы GDB: Создайте алиасы для часто используемых команд
  2. Сохраняйте макросы: Храните полезные макросы в файле .gdbinit
  3. Используйте автоматизацию: Настройте автоматическую загрузку SVD‑файлов
  4. Экспериментируйте с форматами: Попробуйте разные форматы вывода для лучшей читаемости

Источники

  1. STMicroelectronics - STM32F103xx Reference Manual
  2. OpenOCD Documentation - Using OpenOCD
  3. GDB Documentation - Examining Memory
  4. SVD Specification - CMSIS‑SVD
  5. STM32CubeMX - SVD Files
  6. GitHub - stm32duino/STM32F103C8T6_Register_Map
  7. Stack Overflow - Viewing STM32 registers in GDB

Заключение

Для просмотра таблицы регистров периферии STM32F103C8T6 в GDB при использовании OpenOCD доступны несколько эффективных методов:

  1. Используйте SVD‑файлы для получения символических имен регистров — это самый удобный способ работы с периферийными устройствами
  2. Настройте макросы GDB для быстрого доступа к часто используемым регистрам и их группам
  3. Экспериментируйте с форматами вывода — команды x с разными форматами позволяют получить читаемый табличный вид
  4. Рассмотрите использование GDB Dashboard для более интерактивного интерфейса отладки
  5. Для работы с DDF‑файлами в IAR помните о их ограниченной совместимости с GDB/OpenOCD

Основной рекомендацией является полноценное использование SVD‑файлов, так как они обеспечивают максимальную совместимость и удобство работы с периферийными регистрами STM32. При правильной настройке вы сможете эффективно отлаживать свои программы, просматривая значения регистров в удобном табличном формате с символическими именами.

Авторы
Проверено модерацией
Модерация