Как отлаживать флеш-программу на целевом ARM MCU с помощью gdb

Я пытаюсь отладить программу ARM flash на целевом MCU, используя gdb

Я настраиваю gdbserver в целевой системе (cortex-m7) с помощью jlinkgdbserver. И у меня есть эльф, готовый к отладке.

Впервые для меня нормально выполнить отладку с помощью следующих

      > arm-none-eabi-gdb flash_program.elf
(gdb)> target remote localhost:2331     # connect to gdb server on target
(gdb)> load                             # since it is a flash program, jlink will flash the program
                                        # target is reset to elf entry point
(gdb)> .... (debugging begins)

Однако, когда отладка идет в какое-то место, и я снова хочу отлаживать из точки входа, то, как я понял, снова мигает

      (gdb)> Ctrl+D               # disconnect the gdbserver
> arm-none-eabi-gdb flash_program.elf
(gdb)> target remote localhost:2331
(gdb)> load
(gdb)> .... (debugging from start again)

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

Флэш-программа уже была записана на носитель, я просто хочу, чтобы цель сбросила себя и снова запустилась из точки входа. Но я пробовал такие вещи, как monitor reset и run. Но обе цели M7 не могут начать заново.

Есть ли еще какая-нибудь команда gdb, которую я могу попробовать?

2 ответа

Команда gdb загрузит изображение, если вы специально не настроили адрес ссылки. У вас есть два варианта выживания:

  1. установить адрес ссылки / настроить скрипт компоновщика, чтобы программа была полностью в оперативной памяти. Или же
  2. Не изменяйте адрес, но каждый раз после изменения кода и компиляции используйте загрузку только один раз (чтобы запрограммировать флеш), а затем используйте команду symbol-file для загрузки только символа.

Я использовал STM32F103C8T6 для предоставления ответа, но вам просто нужно будет заменить его базовый адрес ПЗУ () на тот, который использует ваш Cortex-M7: в моем случае я загрузил начальное значение для указателя стека из 0x20000000, а начальное значение счетчика программ из 0x20000000+4.

Программа для отладки была stm32f103c8t6.elf, был уже прошит и содержал символы отладки.

      arm-none-eabi-gdb

target remote localhost:2331
0x20000480 in ?? ()
(gdb) monitor halt
(gdb) monitor reset 0
Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
(gdb) monitor reset 1
Resets the core only, not peripherals.
(gdb) monitor reset 2
Resets core & peripherals using RESET pin.
(gdb) symbol-file stm32f103c8t6.elf
Reading symbols from stm32f103c8t6.elf...
(gdb) set $sp = *0x20000000
(gdb) set $pc = *0x20000004
(gdb) stepi
0x200003c2      121     {
(gdb)
0x200003c4      121     {
(gdb) stepi
122       SystemInit();                             /* CMSIS System Initialization */
(gdb)
SystemInit () at /opt/arm/ARM.CMSIS.5.6.0//Device/ARM/ARMCM3/Source/system_ARMCM3.c:61
61      {
(gdb)

В зависимости от типа стратегии сброса, которую вы хотите использовать, вам, возможно, придется явно указать ее в monitor reset команда:

Как объясняется в документации Segger и в этой замечательной статье , вы можете использовать стратегию номер 0, 1 или 2:

      # Normal
monitor reset
monitor reset 0

# Core
monitor reset 1

# ResetPin
monitor reset 2

Насколько я понимаю, возможность использования стратегии №2 зависит от того, как был подключен ваш вывод RESET, то есть от того, установлен ли он на вашей плате или нет.

Отказ от ответственности: я занимаюсь программным обеспечением, и все ошибки интерпретации, связанные с вопросами, связанными с оборудованием, принадлежат мне ...

Другие вопросы по тегам