如何解决寄存器在 GDB 中偏移 1 的可能原因是什么?
微控制器是 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
结果:
如您所见,r6
设置为 0xdeadbeef
而不是 r5
,这是之前在代码中编写的内容。该偏移量与其他两个设置的寄存器相同。
我相信链接描述文件的值是正确的,所以我认为问题是其他地方配置不正确造成的。
所以,我有点不确定如何从这里开始,并询问是否有人对可能出现的问题有任何想法或建议。
解决方法
好吧,看到大多数评论表明这可能是 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,但是我切换到了作为 part of the STM32CubeIDE 出现的 GDB。
看来问题确实出在 GDB 服务器上。
感谢大家的帮助和建议,非常感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。