Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JLink和Cortex M4从gdb设置堆栈指针?_Gdb_Arm_Embedded - Fatal编程技术网

如何使用JLink和Cortex M4从gdb设置堆栈指针?

如何使用JLink和Cortex M4从gdb设置堆栈指针?,gdb,arm,embedded,Gdb,Arm,Embedded,我正在使用Segger J-Link Base和Linux上的gdb调试Atmel SAM4S8C MCU。在启动gdb时,我用--command参数指定的gdb命令文件中有以下内容: target remote localhost:2331 monitor flash device SAM4S8C 我还指定了我的ELF文件,并在命令文件中加载程序 我注意到,当我加载程序时(使用load),堆栈指针设置不正确监视器重置也不会修改堆栈指针 说明(对于Cortex-M3设备): 此外,用户必须在重

我正在使用Segger J-Link Base和Linux上的gdb调试Atmel SAM4S8C MCU。在启动gdb时,我用
--command
参数指定的gdb命令文件中有以下内容:

target remote localhost:2331
monitor flash device SAM4S8C
我还指定了我的ELF文件,并在命令文件中加载程序

我注意到,当我加载程序时(使用
load
),堆栈指针设置不正确<代码>监视器重置也不会修改堆栈指针

说明(对于Cortex-M3设备):

此外,用户必须在重置后手动更正堆栈指针(R13)和PC(R15),以便调试应用程序

从gdb执行此操作的命令是什么

奇怪的是,我不得不手工做这件事。堆栈指针是重置向量的第一个条目。在我开发代码时,初始堆栈指针会发生变化(特别是在具有非常不同的初始堆栈指针的应用程序之间切换,这是我第一次注意到的)


有没有办法让gdb在加载期间从ELF文件中读取并自动设置它?

Cortex-M的设计不需要程序集启动代码:
启动时,Cortex-M将自动从闪存的前两个32位字加载sp和pc寄存器。
对于我的LPC1788,这意味着我需要加载包含0x00000000内容的r13/sp和包含0x00000004内容的r15/pc:


我有这个问题,因为我的产品使用了一个位于flash开头的引导加载程序,我想在调试时跳过它。由于堆栈指针值应存储为可执行文件中的第一个字,重置向量应存储为下一个字,因此您需要类似以下内容:

$sp = {int} program_start_address
$pc = {int} program_start_address + 4
e、 g.对于从0x0801000开始的二进制文件

$sp = {int} 0x08001000
$pc = {int} 0x08001004

在上下文中,这句话似乎是专门关于调试基于Cortex-M3的NXP LPC设备脱离重置,并且似乎是关于绕过它们奇特的ROM引导加载程序。因此,它不一定直接应用于Atmel设备,尽管情况可能大致相似。您可以通过
set$sp=
设置堆栈指针,但我将丢失GDB和闪存加载的详细信息,抱歉。我所有的努力都是使用商业工具内部开发的ROM和引导加载程序。@Russchultz谢谢,当我试图直接设置它时,我错过了
=
。请注意,在Ada模式下,堆栈指针是通过
set$sp:=
设置的。如果在Ada模式下使用
set$sp=
,gdb将生成以下消息:
警告:表达式不是赋值(可能没有效果)
monitor reg
命令工作正常(谢谢!),但是我用
sp
替换了
r13
,用
pc
替换了
r15
,地址分别为
0x00400000
0x00400004
。如果我把它放在我的启动文件中,它只在启动gdb时起作用——在gdb控制台中的后续
load
s上不起作用。是否有办法在每次加载时设置寄存器?
$sp = {int} 0x08001000
$pc = {int} 0x08001004