一.RAM中的分区

1、栈区(stack)
临时创建的局部变量存放在栈区。
函数调用时,其入口参数存放在栈区。
函数返回时,其返回值存放在栈区。
const定义的局部变量存放在栈区。
2、堆区(heap)
堆区用于存放程序运行中被动态分布的内存段,可增可减。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
3、全局区(静态区)(对应C程序的数据段,不包含ro-data)
全局区有.bss段和.data段组成,可读可写。
3.1.bss段
未初始化的全局变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容有操作系统初始化。
3.2.data段
已经初始化的全局变量存放在.data段。
静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
const定义的全局变量存放在.rodata段。
二.Flash中的分区
Flash又可以细分为文本段、只读数据段、数据复制段。其中文本段包含代码和代码中的常量部分,只读数据区通常存放程序中以const关键字修饰的数据,
数据复制段存放的则是程序中初始化不为0的全局变量的数据,在每次单片机复位后要对这些变量重新赋值。
三.map文件
Code:代码,也就是编译之后产生的机器指令。
RO_data:Read Only data,只读数据域,指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。C语言中const关键字定义的变量就是典型的RO-data。这部分在程序运行过程中不能被更改,因此在运行时只需要来读取即可,无需占用 RAM 空间。
RW_data:Read Write data,可读写数据域,指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。C语言中定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
ZI_data:Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域。它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“ 0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为 0);
想要让一个程序正常运行。
芯片的 Flash 大小 要大于 Code + RO-data + RW-data 的大小;
芯片的 RAM 大小 要大于 RW-data + ZI_data 的大小