我们先看一张图:
上图中指示了STM32的RAM区域存储结构,下面是低地址,上面是高地址。
编译器在编译和链接后,是可以计算出全局变量,局部变量以及一些未初始化的全局变量所占用空间的,我们把这个总和计算出来,现在RAM上画一片地方来存放,也就是上图的静态存储区域。
然后我们再画一片自留地给到定义好的HEAP区域,最后画一片给到STACK,也就是我们说的栈。我们在代码中看一下如何定义的。我手头有一个CW32的例程,用这个来示意一下。
在项目中的startupxx.s文件中,用汇编定义了堆和栈的大小。
如果我们不使用malloc进行动态分配内存,那么这里的Heap_Size完全可以定义为0,不过编译器直接把这个事给干了,也就是说,如果它发现你没有使用malloc,编译器会直接移除这部分空间,可以在例程编译生成的map文件中看到。
所以,没必要手贱的去改这个汇编文件。
再说RAM空间的堆叠方式,它是先放的静态变量,然后放的堆空间(编译器会优化掉),最后放的栈空间,所以只要我们改变栈空间大小,那么栈顶指针就会变化。实验一下吧。
接下来,我们把栈改大一倍,编译看看,栈顶地址是不是相应的变大了
那么,如果我们增加静态存储区的大小,这个栈顶地址应该也会改变。
如何增加静态存储区大小呢?定义一个全局变量就好了。
记得把编译器的优化等级去掉哦,不然编译器会偷偷把你没用的变量啥的都给你移除掉,实验就没效果了。
我注释掉了一个4字节的数组,栈的大小也改回了0x200,编译后,我的栈顶地址变成了0x20000e60。
接下来,我把注释打开,增加一个4字节的数组。
我们可以看到,栈顶地址确实增加了,从原来的0x20000e60增加到了0x20000e68。
为什么地址一下增加了8呢?
于是我有改小了一下数组,重新编译后,栈顶地址又变回了0x20000e60。
|