assembly - 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
,这是之前在代码中编写的。此偏移量与设置的其他两个寄存器相同。
我相信链接器脚本的值是正确的,所以我认为问题是由于其他地方的配置不正确造成的。
所以,我有点不确定如何从这里开始,并询问是否有人对可能出现的问题有任何想法或建议。
解决方案
好吧,看到大多数评论表明这可能是 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 服务器上。
感谢大家的帮助和建议,非常感谢。
推荐阅读
- c# - 从字节范围播放视频
- c# - 为什么我的 ASP.NET Web 服务无法完成此 POST 请求?
- javascript - Cypress: Get token from API then save in local storage and use in another API's header then return the response body of the 2nd API
- node.js - 带有 Docker 的 MongoDB 和 nodejs “MongoTimeoutError:服务器选择在 30000 毫秒后超时”
- javascript - vuex 突变,编辑还是插入?
- php - 通过 wordpress nav_menu_css_class 过滤所有菜单项实例-
- c++ - 括号后面的类名是什么类型
- spring - Spring Cloud Gateway 启动失败:找不到名称为 GatewayFilterFactory
- java - 匹配内容中任何地方的模式?
- python - 从包含某些字符的列表中删除单词