首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新定义stm32f3的初始堆栈指针值

重新定义stm32f3的初始堆栈指针值
EN

Stack Overflow用户
提问于 2020-03-09 09:03:28
回答 1查看 391关注 0票数 0

我有一个stm32f303发现板,我正在尝试更多地理解链接和重新定位过程。我正在这里编译和运行这个示例:https://github.com/mblythe86/stm32f3-discovery-basic-template

重置堆栈指针值在安装脚本设备/startup_stm32f30x.s中的向量表中定义。原值为0x2000A000 (即。初始SRAM地址+ 32K)。我看到分配给SRAM的唯一其他东西是.data和.bss部分:

代码语言:javascript
复制
 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函数,导致问题的反汇编如下所示:

代码语言:javascript
复制
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内存访问。知道这是怎么回事吗?除了向量表之外,还有什么东西管理初始堆栈指针吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-09 22:57:45

我的建议。

  1. 下载更多用户友好的IDE和体面的调试器GUI。例如,环礁工作室.
  2. 停止使用网络上的某个地方的“模板”。这一个使用史前SPL库-不再支持STM。使用CubeMx生成项目模板。
  3. 您有48k内存,但分为两个不同的内存区域。40k SRAM(0x20000000 - 0x2000A000)和CCM (0x100000-0x10002000)
  4. (每点3 ) SRAM的最后一个地址是0x2000A000,所以当您将堆栈放置在0x2000A020时-您立即在HardHault处理程序中结束。(它不是WDG,因为在启动时,所有的HFs都是由一个函数处理的)
  5. ,您也可以将堆栈放在CCM中。

  1. ,这是最简单的配置- ARM核心有两个堆栈,用户使用和特权代码。
  2. 堆栈不必在内存区域的末尾。我经常希望把它放在开头。当堆栈溢出时,它会调用HF,给我采取行动的机会。如果堆栈位于RAM的末尾,它可能会悄悄溢出,覆盖存储在RAM
  3. Always中的数据,读取整个文档的。数据表、参考手册和编程手册
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60597359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档