Как лучше открыть таблицу регистров периферии в gdb (openocd)?
Сейчас ситуация такая: понужнобилось отладить stm32f103c8t6. Пишу в блокноте, заливаю через стлинк. Запустил сервер openocd, подключился в gdb. Отладка работает, это конечно здорово, но состояние регистров ядра мне многое не говорит.
Сейчас ситуация такая: наверное, если начать это понимать, станешь магистром черной магии, но не думаю, что мне хватит духа.
Сейчас ситуация такая: как проверять значения переменных (желательно таблицей) и регистров их буквенными обозначениями. Накопал в интернетах svd-файл, но не накопал как его прикрутить без питоно-плясок. Слышал, что в иаре используются ddf (device description file), но о них вообще в интернете тишина.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В GDB/OpenOCD “таблицу регистров периферии” обычно открывают не как красивое окно, а через чтение memory-mapped registers по адресам из reference manual. OpenOCD даёт доступ к памяти микроконтроллера, а GDB может читать конкретные адреса командами
x,monitor mdwили через SVD-инструменты.Пример чтения слова по адресу в GDB:
x/1wx 0x40021000 x/16wx 0x40021000
Через OpenOCD monitor:
monitor mdw 0x40021000 16
Чтобы было удобно, используйте SVD-файлы. Для многих ARM Cortex-M есть CMSIS-SVD, где описаны периферийные регистры. Некоторые IDE и расширения умеют показывать их в виде дерева: Cortex-Debug для VS Code, Ozone, STM32CubeIDE, CLion embedded tools.
Если работаете только в консоли, можно сделать GDB-команды/скрипты с именованными адресами:
set $RCC_BASE = 0x40021000 x/8wx $RCC_BASEset $RCC_BASE = 0x40021000 x/8wx $RCC_BASE
Важно: чтение некоторых регистров может иметь side effects, например сбрасывать флаги. Поэтому сверяйтесь с reference manual.
Итог: напрямую в GDB читайте memory-mapped адреса через
xилиmonitor mdw. Для нормальной таблицы регистров подключайте SVD-инструменты или IDE, которая умеет отображать периферию по SVD.