GDB中寄存器偏移1的可能原因是什么?

3

微控制器是STM32 F767ZI,其中包含一个32位ARM Cortex M7

在设置寄存器的值时,所有寄存器似乎都偏移了1个。

例如,以下代码:

core.S

.syntax unified
.cpu cortex-m7
.fpu softvfp
.thumb

// Global memory locations
.global vtable
.global reset_handler

 .type vtable, %object
 vtable:
    .word _estack
    .word reset_handler
.size vtable, .-vtable

/*
 * The Reset handler
 */
 .type reset_handler, %function
 reset_handler:
    // The '_estack' value is defined in the linker script
    LDR sp, =_estack
    

    // Dummy values
    LDR r5, =0xDEADBEEF
    MOV r3, #50
    
.size reset_handler, .-reset_handler

linkerScripts/stm32-767zi.ld

_estack = 0x20080000;

MEMORY
{
    FLASH ( rx )        : ORIGIN = 0x08000000, LENGTH = 2048K
    RAM ( rxw )         : ORIGIN = 0x20000000, LENGTH = 512K
}

在运行以下命令进行编译后:

arm-none-eabi-gcc -x assembler-with-cpp -c -O0 -mcpu=cortex-m7 -mthumb -Wall core.S -o core.o

然后...

arm-none-eabi-gcc core.o -mcpu=cortex-m7 -mthumb -Wall --specs=nosys.specs -nostdlib -lgcc -T./linkerScripts/stm32-767zi.ld -o main.elf

得到的结果如下:

register values

可以看到,r6 的值设置为 0xdeadbeef 而不是之前代码中写的 r5。另外两个寄存器的偏移量也相同。

我认为链接脚本的值是正确的,所以我会认为问题是由于其他地方的配置不正确导致的。

因此,我有点不确定接下来该怎么做,想问问其他人是否有任何想法或建议可以解决这个问题。


2
这很奇怪!我以前从未见过这样的情况。也许是JTAG实现中的一个错误? - fuz
2
你能提供一些关于JTAG探针、GDB服务器软件和你所使用的GDB版本的信息吗? - Frant
1
这与问题没有任何关系,但是看起来你正在尝试创建一个非常简单的实现。为了达到这个目标,你可以将负载降低到 sp,因为硬件已经从向量的第一个条目开始为你做了这个。 - Tom V
@old_timer 我刚刚尝试使用arm-none-eabi-as -mcpu=cortex-m7 -mthumb -g -c core.S -o core.o编译它,然后使用arm-none-eabi-ld core.o -T linkerScripts/stm32-767zi.ld -o main.elf,但仍然得到相同的结果。 - Starman
1
@old_timer 我还在程序末尾添加了一个无限循环,并在那里停止它。以前,我只是让它一直运行到结束,然后检查寄存器的值。 - Starman
显示剩余7条评论
1个回答

3

看到大多数评论都认为这可能是GDB服务器的问题,我决定尝试另一个GDB服务器。

结果非常令人满意:

正确的寄存器

对于:

core.S

.syntax unified
.cpu cortex-m7
.fpu softvfp
.thumb

// Global memory locations
.global vtable
.global reset_handler

 .type vtable, %object
 vtable:
    .word _estack
    .word reset_handler
.size vtable, .-vtable

/*
 * The Reset handler
 */
 .type reset_handler, %function
 reset_handler:
    // The '_estack' value is defined in the linker script
    LDR sp, =_estack
    

    // Dummy values
    LDR r5, =0xDEADBEEF
    MOV r3, #50
    
.size reset_handler, .-reset_handler

这对我解决了问题。

最初,我在Windows上使用的是stlink v1.6.1,但现在我已经切换到作为STM32CubeIDE一部分的GDB

看起来问题确实出在GDB服务器上。

感谢大家的帮助和建议,非常感激。


1
@PeterCordes 啊,我原本以为通过输入 arm-none-eabi-gdb 访问的 GDB 接口是客户端,并且处理与外部设备的 USB 连接并连接到“客户端”的软件被称为服务器?如果不是这样,请谅解... 我对所有这些都还很陌生。这是正确的吗,还是我完全错了?如果是这样,请纠正我! - Starman
2
那就是这种情况,arm-none-eabi-gdb 是客户端。你提到了在 Windows 上使用某些东西,并改用其他东西,所以我假设你是在谈论更改客户端。但显然,在 JTAG 中,GDB 服务器也在您的桌面上运行并处理 USB 连接。感谢澄清,我只使用过像 qemu 这样的远程调试,其中模拟器是 GDB 服务器。我甚至不确定在 JTAG 设置中是否会有“服务器”。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接