【怎么在KEIL中自定义STM32的栈顶地址】

STM32的启动文件中定义的栈和堆的大小,由于栈是向下生长的。所以我们一般希望将栈顶设置为RAM的最高有效地址。这样就可以最大限度保护栈不会溢出。但是STM32的启动文件居然不是这样的思路。

那STM32的启动文件的分配思路是怎么样的呢。它其实是先确定用户使用RAM的情况,然后在未使用的RAM地址开始分配一段RAM区域来做为栈使用。也就是说它并不是将栈顶设置在RAM地址的最高分缘处。这样其实有大部分RAM被浪费掉,随着用户程序的复杂度加大,有可能会引启栈溢出的风险。

现在我们来自定义栈顶地址,修改启动文件:

可复制以下代码,其中ARM.__AT_0x2001FC00指定了栈区域的启始地址,并不是栈顶地址:

Stack_Size EQU 0x00000400

ADDR_STACK_TOP EQU 0x20020000

; 0x2001FC00 = ADDR_STACK_TOP - Stack_Size

AREA |.ARM.__AT_0x2001FC00|, DATA, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size

__initial_sp

参考博文:www.zhangshilong.cn/work/46137.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值