【问题标题】:What are the possible reasons for registers to be offset by 1 in GDB?GDB中寄存器偏移1的可能原因是什么?
【发布时间】:2021-03-22 20:03:32
【问题描述】:

微控制器是一个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

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

结果:

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

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

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

【问题讨论】:

  • 这很好奇!我以前从未见过这样的事情。可能是 JTAG 实现中的错误?
  • 您能否提供一些有关 JTAG 探针、GDB 服务器软件、您正在使用的 GDB 版本的信息?
  • 这根本与问题无关,但看起来你正在尝试做一个非常小的实现。为此,您可以将负载降低到 sp,因为硬件已经从向量中的第一个条目开始为您执行此操作。
  • 请提供一个编译示例,其中包括未运行到以太网中的代码以及您停止程序以检查寄存器的位置
  • @old_timer 我还在程序末尾添加了一个无限循环,并将其停在那里。之前我只是简单的让它运行​​到最后,然后检查寄存器的值。

标签: assembly arm gdb gnu cortex-m


【解决方案1】:

好吧,看到大多数 cmets 都认为这可能是 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

这为我解决了这个问题。

最初,我在 Windows 上使用 stlink v1.6.1,但是我切换到了 part of the STM32CubeIDE 的 GDB。

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

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

【讨论】:

  • @PeterCordes 啊,我的印象是输入arm-none-eabi-gdb访问的GDB接口是客户端,处理USB连接到外部设备和“客户端”的软件连接到,叫服务器?抱歉,如果不是这种情况......我对这一切都很陌生。这是正确的还是我直接错了?如果是,请纠正我!
  • 就是这样,arm-none-eabi-gdb是客户端。您谈到在“Windows”上使用某些东西,并更改为其他东西,所以我假设您在谈论更改客户端。但显然使用 JTAG,GDB 服务器也可以在您的桌面上运行并处理 USB 连接。感谢您的澄清,我只将 GDB 远程调试与 qemu 之类的东西一起使用,其中模拟器是 GDB 服务器。我不确定是否会有带有 JTAG 设置的“服务器”。
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 2013-02-16
  • 2021-09-01
  • 2012-01-01
  • 2016-11-11
  • 2020-09-09
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多