【发布时间】:2020-03-09 09:03:28
【问题描述】:
我有一个 stm32f303 发现板,我正在尝试更多地了解链接和重定位过程。我在这里编译和运行这个例子:https://github.com/mblythe86/stm32f3-discovery-basic-template
复位堆栈指针值在设置脚本Device/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,好像是外围设备总线上的东西?
对我来说令人困惑的部分是这部分代码以及所有寄存器和内存地址在原始版本中都是相同的(当然堆栈指针值除外),包括 ldr.w 内存访问0xe000ed00 + 0x88。知道这里发生了什么吗?除了向量表,还有什么东西可以管理初始栈指针吗?
【问题讨论】:
-
STM32F303VCT6 微控制器在 LQFP100 封装中具有 256 KB 闪存和 48 KB RAM
-
你绝对不能使用 0x2000008c - 0x40000000
-
ST 记录的 sram 从 0x20000000 到 0x2000BFFF
-
0xe000ed00 应该在 arm 文档中。
-
是的,确认,它在 arm 文档中。