首先介绍下堆栈是个什么东西: 堆和栈是两个不一样的东西,不过它们本质都是一片内存区域,只不过这片内存具有自己独特的属性。堆栈都是一种数据项按序排列的数据结构,只能在一端对数据项进行插入和删除。 堆和栈最为突出的特点是两者存放数据类型的不同。 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 除此之外,还有一个存放数据的地方叫做静态区,也叫全局区。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。该区域的数据是等程序结束后由系统进行释放。 好了,接下来说说STM32的堆和栈。首先有两个问题:1,STM32的堆和栈有多大,在哪里定义的;2,STM32的堆栈在空间上的分配以及增长方向又是怎么样的。 对于第一个问题:堆栈的大小是在STM32的启动文件里面定义的。通过汇编伪指令EQU 来定义大小。1.堆和栈大小 定义大小在startup_STM32f2xx.s Stack_Size EQU 0x00000800 AREA STACK, NOINIT, READWRITE, Stack_Mem SPACE Stack_Size __initial_sp ; Heap Configuration ; Heap Size (in Bytes) ; Heap_Size EQU 0x00000800 AREA HEAP, NOINIT, READWRITE, __heap_base 2.堆和栈空间分配 栈:向低地址扩展 堆:向高地址扩展 栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。所以栈是一种分时轮流使用的存储区,编译器里定义的Stack_Size,是为了限定函数的局部数据活动的范围,操过这么范围有可以跑飞,也就是栈溢出;Stack_Size不影响Hex,更不影响Hex怎么运行的,只是在Debug调试时会提示错。有的人写单片机代码在函数里定义一个大数组 int buf[8192],栈要是小于8192是会死的很惨。 堆:存的是全局变量,这变量理论上是所有函数都可以访问的,全局变量有的有初始值,但这个值不是存在RAM里的,是存在Hex里,下载到Flash里,上电由代码(编译器生成的汇编代码)搬到RAM去的。使用了malloc时分配情况: STM32内存分配规律: 从0x20000000开始依次为:静态存储区+堆区+栈区 未使用malloc时分配情况 从0x20000000开始依次为:静态存储区+栈区 全局变量(静态变量)->堆区->栈区。
|