STM32 编译结果 map 之 code、RO-data、RW-data、ZI-data 字段解析
2021-02-09 来源:eefocus
1、Code
即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。
2、RO-data
Read Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。
例如:
C语言中const关键字定义的变量就是典型的RO-data。
3、RW-data
Read Write data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。
例如:
C语言中使用定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
4、ZI-data
Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW-data的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。
例如:
C语言中使用定义的全局变量,且定义时赋予“0值”给该变量进行初始化.。
若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为0。
ZI-data的栈空间(Stack)及堆空间(Heap):
在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。
而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。
编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。