1

我正在尝试使用在目标 MCU 上调试 ARM 闪存程序gdb

我正在使用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)

所以这似乎有点多余,而且它一次又一次地擦除和编程相同的闪存区域,我担心我最终会通过调试损坏存储。

flash 程序已经烧录到介质中,我只是想让目标自行重置并再次从入口点运行。但我尝试了monitor resetrun. 但是目标M7都不能从头再来。

还有其他我可以尝试的 gdb 命令吗?

4

2 回答 2

1

我使用STM32F103C8T6来提供答案,但您只需将其 ROM 基地址 ( 0x20000000) 替换为您的 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 引脚的接线方式,即它是否在您的板上被下拉。

免责声明:我是一个软件人,所有与硬件相关的问题的解释错误都是我的......

于 2021-01-29T19:29:03.323 回答
1

gdb 命令load将刷新图像,前提是您没有专门设置链接地址。你有两种生存方式:

  1. 设置链接地址/调整链接器脚本,所以程序将完全在 RAM 中。或者
  2. 保持地址不变,但每次代码更改和编译后,仅使用一次加载(以使闪存被编程),然后使用符号文件命令仅加载符号。
于 2021-03-01T11:58:17.420 回答