变量、内存区域、MDK文件(map、htm)
阅读原文时间:2023年07月09日阅读:2

变量分为:局部变量和全局变量

局部变量:函数体内部定义的变量,作用域为函数内部,static声明(静态局部变量)该变量则函数调用结束后不消失而保留值,分配的存储空间不释放。

全局变量:函数体外部定义的变量,作用域为文件内部,static声明(静态全局变量)该变量则只能在本文件(声明该变量的文件)中被调用。

变量声明分为:定义性声明(int a)需要分配存储空间;引用性声明(extern int a)不需要分配存储空间

内存区域划分:

1、栈区:由高地址向低地址增长,由CPU硬件实现,用于存放局部变量、函数形参(自右向左入栈)、函数调用时的现场保护和返回地址,由编译器自动分配和释放

2、堆区:由低地址向高地址增长,由软件实现,用于动态内存分配(malloc和free等)

3、静态存储区:存放全局变量和静态变量(全局区)、存放常量字符串(文字常量区)

4、程序代码区:存放函数二进制代码

MAP文件相关概念:

1、Section:描述映像文件的代码和数据块

2、RO:Read-Only缩写,包括RO-data(只读常量)和RO-code(只读代码)

3、RW:Read-Write缩写,主要是RW-data,已初始化变量

4、ZI:Zero-Initialized缩写,主要是ZI-data,未初始化变量

5、.text:等同RO-code

6、.constdata:等同RO-data

7、.bss:等同ZI-data

8、.data:等同RW-data

烧写时FLASH占用空间Code+RO-data+RW-data

运行时RAM占用空间RW-data+ZI-data;

htm文件可以查看被调用函数的栈stack使用情况,调试和OS中分配任务stack时有用

从nordic 芯片的来看。

.data 初始化的全局变量为其他址

.bss 初始化全局变量量为0

Common symbol  未进行初始化的全局变量

.rodata 是属于字符串常量,可以用const 值将数据放到flas里面