到了计算机系统中,堆和栈被分别了开来。
其中栈保持原有的特性,也可以叫做堆栈,它是一种运算受限的线性表,限制仅允许在表的一段进行插入和删除操作,可以被操作的这一端叫做栈顶,另一端叫做栈底,也就是容易积灰的那一端。
栈在程序运行的过程中主要负责存储局部变量,比如我们函数中定义的变量,如果控制器内核的寄存器不够用了,它就会把这个变量放到栈里面先存一会。
在操作系统中,任务切换时的现场参数保存也是存放到对应任务的栈(这里的栈其实放在STM32的全局变量里面)里面。
上面有点迷糊,这里我们主要讨论STM32裸机程序的堆栈情况。
在STM32中,堆是用来给分配动态内存的,系统只有用到malloc的时候才会使用这个区间,后面在讲这个位置。
我先看看,每次编译完程序,编译器链接后,会提供一个生成信息。
代码编译后提示信息可以看到的内容
Code :是代码占用的空间,存储到Flash【ROM】中的程序代码。
RO-data:是 Read Only 只读常量的大小,如const修饰的变量。用来存储程序的指令和常量,保存在Flash【ROM】中。
RW-data:是(Read Write) RW是可读可写变量,就是初始化时候就已经赋值了的(上电前就已经确定值的),RW + ZI就是你的程序总共使用的RAM字节数。
ZI-data:是(Zero Initialize) 没有初始化的可读写变量的大小,就是程序中用到的变量并且被系统初始化为0的变量的字节数。
Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,这部分在我们进行程序下载的时候,会全部存储在SMT32的Flash中。
当系统上电后,内核会将一部分数据存搬运到RAM当中,因为我们定义的很多变量是可读取的,所以要放到RAM中。
这其中包括RW-data和ZI-data。
对于RW-data,需要一点一点的搬运过去,既然是搬运,那么在FLASH中本来就会存储一份,所以RW-data会占用Flash空间。
而对于ZI-data,由于它没有初始化,所以它的初始值无所谓,所以我们只需要知道它的个数,在RAM中直接画一片地方给他用就行了,因此ZI-data无需单独在Flash中存储一份。
我们所说的堆栈,就在上述执行过程中同样的被画了一块自留地。
|