我有一个stm32f303发现板,我正在尝试更多地理解链接和重新定位过程。我正在这里编译和运行这个示例:https://github.com/mblythe86/stm32f3-discovery-basic-template
重置堆栈指针值在安装脚本设备/startup_stm32f30x.s中的向量表中定义。原值为0x2000A000 (即。初始SRAM地址+ 32K)。我看到分配给SRAM的唯一其他东西是.data和.bss部分:
2 .data 0000004c 20000000 08000e94 00020000 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00000040 2000004c 08000ee0 0002004c 2**2
ALLOC那么(忽略堆栈)地址0x2000008c - 0x40000000的所有内容都应该是免费的,对于SRAM,我应该可以使用吗?
我尝试在启动脚本中将初始堆栈指针值减少32个字节(从0x2000A000减少到0x20009FD0),然后编译并运行所有内容。
我尝试将初始堆栈指针值增加32个字节(从0x2000A000增加到0x2000A020),这样就会停止工作。
运行GDB并中断SystemInit函数,导致问题的反汇编如下所示:
08000c18 <SystemInit>:
8000c18: b580 push {r7, lr}
8000c1a: af00 add r7, sp, #0
8000c1c: 4a1f ldr r2, [pc, #124] ; (8000c9c <SystemInit+0x84>)
8000c1e: 4b1f ldr r3, [pc, #124] ; (8000c9c <SystemInit+0x84>)
8000c20: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88此时,我们触发某种异常并跳转到WWDG_IRQHandler。在ldr.w指令处,r3的值是0xe000ed00,这似乎是外围设备总线上的东西?
让我感到困惑的是,这部分代码和所有寄存器和内存地址在工作的原始版本中是相同的(当然,堆栈指针值除外),包括0xe000ed00 + 0x88处的ldr.w内存访问。知道这是怎么回事吗?除了向量表之外,还有什么东西管理初始堆栈指针吗?
发布于 2020-03-09 22:57:45
我的建议。
,
https://stackoverflow.com/questions/60597359
复制相似问题