堆、栈、Code、RO-data、RW-data、 ZI-data等在STM32内的表现

        本文参考了部分文章:

                    https://jingyan.baidu.com/article/6c67b1d6a09f9a2786bb1e4a.html
                    https://blog.csdn.net/slj_win/article/details/16906141
    

前言

    经常说的堆栈,一般指栈。堆栈在不同环境的含义不同。数据结构中的堆栈是一种抽象的数据结构。尤其数据结构中堆的含义与STM32中的堆完全不是一个概念。

    STM32 开发时,当我们没有没有主动申请内存时,是不会有堆区的。

    STM32开发中不管堆区还是栈区都是指的RAM空间。

    可以不设置堆的大小,如果使用了malloc等操作堆的函数,则必须定义堆的大小。

    “不管堆栈设置的大小,编译出的HEX都是一样”的这句话在KEIL5.2,STM32F103环境下是错误的

一、预备知识: 

    1、堆栈在数据结构定义

栈:一种先进后出的数据结构。

堆:堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

                    堆中某个节点的值总是不大于或不小于其父节点的值;
                    堆总是一棵完全二叉树。
                    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

    2、在STM32中的表现

                  栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似 于数据结构中的栈。是一种分时使用的存储区域。

                堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。存放的是全局变量,理论上是所有函数都可以访问的,该全局变量初始值并不存在RAM全局区。

                全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。

                文字常量区:常量字符串就是存放在这里的。

                程序代码区:存放函数体的二进制代码。


二、举例说明

        在STM32中如果有以下代码
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
    int b; //栈
    char s[]="abc"; //栈
    char *p3= "1234567"; //在文字常量区Flash
    static int c =0 ; //静态初始化区
    p1= (char *)malloc(10); //堆区
    strcpy(p1,"123456"); //"123456"放在常量区
}

    所以堆和栈的区别:

        1、stack的空间由操作系统自动分配/释放,heap上的空间手动分配(malloc)/释放(free)。

        2、stack的空间有限,heap是很大的自由存储区。

        3、程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。


你可能感兴趣的:(STM32开发)