我在Linux上使用带有gdb的Segger J-Link Base来调试Atmel SAM4S8C MCU.我在gdb命令文件中有以下内容,我--command在启动gdb时使用参数指定:
target remote localhost:2331
monitor flash device SAM4S8C
Run Code Online (Sandbox Code Playgroud)
我还在load命令文件中指定了我的ELF文件和程序.
我注意到当我加载程序(使用load)时,堆栈指针没有正确设置. monitor reset也不会修改堆栈指针.
该的J-Link用户指南说(用于Cortex-M3设备):
此外,用户必须在复位后手动校正堆栈指针(R13)和PC(R15)以调试应用程序.
从gdb执行此操作的命令是什么?
奇怪的是,我必须手动完成这项工作.堆栈指针是复位向量的第一个条目.在我开发代码时,初始堆栈指针会发生变化(特别是在具有非常不同的初始堆栈指针的应用程序之间切换,这是我第一次注意到这一点).
有没有办法让gdb在ELF文件中读取load它并自动设置它?
Cortex-M 的设计不需要汇编启动代码:
启动时,Cortex-M 将自动从闪存的前两个 32 位字加载 sp 和 pc 寄存器。
就我的 LPC1788 而言,这意味着我需要加载内容为0x00000000的 r13/sp和内容为0x00000004的 r15/pc :
target remote localhost:2331
monitor interface SWD
monitor endian little
monitor speed auto
monitor reset
monitor halt
monitor flash device = LPC1788
monitor flash download = 1
monitor flash breakpoints = 1
file program.elf
load program.elf
break main
monitor reg r13 = (0x00000000)
monitor reg r15 = (0x00000004)
continue
Run Code Online (Sandbox Code Playgroud)