Как отлаживать флеш-программу на целевом 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 загрузит изображение, если вы специально не настроили адрес ссылки. У вас есть два варианта выживания:
- установить адрес ссылки / настроить скрипт компоновщика, чтобы программа была полностью в оперативной памяти. Или же
- Не изменяйте адрес, но каждый раз после изменения кода и компиляции используйте загрузку только один раз (чтобы запрограммировать флеш), а затем используйте команду 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, то есть от того, установлен ли он на вашей плате или нет.
Отказ от ответственности: я занимаюсь программным обеспечением, и все ошибки интерпретации, связанные с вопросами, связанными с оборудованием, принадлежат мне ...