打印
[应用相关]

SMT32的堆栈自留地

[复制链接]
386|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

我们先看一张图:


上图中指示了STM32的RAM区域存储结构,下面是低地址,上面是高地址。
编译器在编译和链接后,是可以计算出全局变量,局部变量以及一些未初始化的全局变量所占用空间的,我们把这个总和计算出来,现在RAM上画一片地方来存放,也就是上图的静态存储区域。
然后我们再画一片自留地给到定义好的HEAP区域,最后画一片给到STACK,也就是我们说的栈。我们在代码中看一下如何定义的。我手头有一个CW32的例程,用这个来示意一下。
在项目中的startupxx.s文件中,用汇编定义了堆和栈的大小。

如果我们不使用malloc进行动态分配内存,那么这里的Heap_Size完全可以定义为0,不过编译器直接把这个事给干了,也就是说,如果它发现你没有使用malloc,编译器会直接移除这部分空间,可以在例程编译生成的map文件中看到。

所以,没必要手贱的去改这个汇编文件。
再说RAM空间的堆叠方式,它是先放的静态变量,然后放的堆空间(编译器会优化掉),最后放的栈空间,所以只要我们改变栈空间大小,那么栈顶指针就会变化。实验一下吧。


接下来,我们把栈改大一倍,编译看看,栈顶地址是不是相应的变大了



那么,如果我们增加静态存储区的大小,这个栈顶地址应该也会改变。
如何增加静态存储区大小呢?定义一个全局变量就好了。
记得把编译器的优化等级去掉哦,不然编译器会偷偷把你没用的变量啥的都给你移除掉,实验就没效果了。

我注释掉了一个4字节的数组,栈的大小也改回了0x200,编译后,我的栈顶地址变成了0x20000e60。
接下来,我把注释打开,增加一个4字节的数组。

我们可以看到,栈顶地址确实增加了,从原来的0x20000e60增加到了0x20000e68。
为什么地址一下增加了8呢?
于是我有改小了一下数组,重新编译后,栈顶地址又变回了0x20000e60。

使用特权

评论回复
沙发
jf101| | 2024-6-23 14:44 | 只看该作者
SMT32的堆栈自留地其实就是一片特定的空间区域

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

291

主题

1900

帖子

4

粉丝