首页 > 解决方案 > GDB中寄存器偏移1的可能原因是什么?

问题描述

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

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

例如,下面的代码:

核心.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

链接器脚本/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

结果是:

寄存器值

如您所见,r6设置为0xdeadbeef而不是r5,这是之前在代码中编写的。此偏移量与设置的其他两个寄存器相同。

我相信链接器脚本的值是正确的,所以我认为问题是由于其他地方的配置不正确造成的。

所以,我有点不确定如何从这里开始,并询问是否有人对可能出现的问题有任何想法或建议。

标签: assemblyarmgdbgnucortex-m

解决方案


好吧,看到大多数评论表明这可能是 GDB 服务器的问题,我决定试一试另一个 GDB 服务器。

结果非常令人高兴:

正确的寄存器

为了:

核心.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

这为我解决了这个问题。

Oringinally,我在 Windows 上使用stlink v1.6.1,但是我切换到 GDB,它是STM32CubeIDE 的一部分

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

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


推荐阅读