stm32堆栈整理

STM32的堆栈大小在官方文件已经定义好了,分别是:
Heap_Size EQU 0x00000200 一共512字节
Stack_Size EQU 0x00000400 一共1K字节
/*********************************************************************************************/
可是STM32在keil环境下每次编译后的堆栈起始地址并非固定的(就算事先已经定义好了堆栈的大小),由于栈的起始地址是由用户程序中事先定义好的变量数目决定的(实测是如此)。但欣慰的是,一旦此次编译以后,堆栈的首地址就不会再发生改变了,换言之,就是在烧完程序以后,堆栈的地址就永远不变了。
/*********************************************************************************************/
要关心STM32的堆栈关系,首先没法避免的就是下面这两幅图片了:
这里写图片描述html

这里写图片描述

图一:MDK环境下,STM32 Bulid Output窗口部分截图
图二:MDK环境下,STM32的.map文件中关于堆栈地址的说明(绿色高亮部位)
/*********************************************************************************************/
STM32的内部sram的首地址为0x20000000,图二中的__initial_sp既为栈的高地址(也就是栈的首地址)(STM32的堆栈地址在MDK下的配置默认是连续的,栈的地址高于堆的地址,栈的生长方向为从高地址向低地址生长,栈的地址为从低地址向高地址生长,最后二者生长到了一块儿,也就是“头碰头”)图二中的HEAP既为堆的低地址,STACK既为最后头碰头的地址(注意并非栈的起始地址而是结束地址,由于栈相对于堆是逆向生长的)
/*********************************************************************************************/
那么问题来了,__initial_sp的值是怎么来的呢?这就要看图一了。
首先抛出结论:__initial_sp = 0x20000000+RW+ZI
RW:Read/Write 可读可写的数据段。就是那些在任务初始化时就已经被赋值了的变量,MDK通常将这种类型的数据保存在STM32的SRAM中。(“全局变量”存在“普通意义上的”SRAM 中)(“局部变量”存储在“栈”中)(“局部的static变量”在存储上等价于全局变量)
ZI:Zero Initial 初始化为0的变量,也就是直接初始化并无赋值的变量spa

能够这么认为:在STM32的片内SRAM中,__initial_sp-0x20000000为用户已经使用了的SRAM空间,从高地址到低地址依次为“栈Stack”“堆Heap”“全局变量”
/*********************************************************************************************/
至此,图二中绿色高亮部分的STACK和HEAP的数值也就不难理解了
STACK = __initial_sp - 0x400(栈的大小)
HEAP = STACK - 0x200(堆的大小)
/*********************************************************************************************/.net

下面的百度文库给出了比较完整的答案:(百度文库此次居然靠谱了word天)
https://wenku.baidu.com/view/f13602e403d8ce2f016623a0.html
————————————————
版权声明:本文为CSDN博主「ryzejiang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/qq_15210067/article/details/766515093d

相关文章
相关标签/搜索