单片机Map表详解与变量存储区域分布解析
一、map表的浅析
单片机map表的查看:
1、打开map表拉到最底下,查看:
由此可知,单片机内存的具体使用情况,大体上分为RAM和Flash大小:
查看:【PLACEMENT SUMMARY】
推断:P1部分是Flash内存的具体使用情况
P2部分是RAM内存的具体使用情况
2、数据内存(RAM):
RAM(随机存取存储器):可读写数据内存(也称为RAM)
RAM是微控制器用于存储运行时数据的内存区域。与程序代码存储在闪存或EEPROM不同,RAM用于存储变量、数据结构、堆栈等,还有系统的全局变量(尤其是数组最占内存),
(1)、RAM的内存段(Memory Sections):
(2)、内存区域的起始地址和大小:
(3)、符号表(Symbol Table)
MAP文件中的符号表部分会列出所有符号及其在内存中的地址
(4)、示例:
3、数据内存(Flash):
主要就分为两个段:rodata(只读数据)、text
4、具体解析:
(1)、A0:
A0数据段解析:
(2)、P1:
可以查看的大小和地址
.rodata 一般都是一些常量
.text一般是只读的代码
可以看到每个文件的占用内存的大小
P1(Flash)数据段解释:
(3)、P2-1:
这里的数据段是已初始化的数据
P2-1数据段(.data)解释:
(4)、P2-2:
P2-2数据段(.bss)解释:
(5)、P2-3:
堆栈区域解释:
(6)、未使用的范围:
Map表再下面的的信息我也没有看过了,有兴趣的可以去研究研究,不过看到这里我们大致也知道内存的一个使用情况,如果内存不够了也可以大概知道哪里占用的最多,对应的去优化一下内存、代码。例如RAM不够大,一般可以去减少一下全局变量、减小数组。
二、单片机的变量存储区域
1、全局变量存储在以下区域:(生命周期是整个运行期间)
.data
段中。.bss
段中。2、局部变量存储在栈区(CSTACK
)中。它们的生命周期仅限于函数调用期间。
(栈区用于管理函数调用时的局部变量和函数执行上下文)
3、const
定义的全局变量和局部变量的存储位置如下:
const
变量:存储在只读数据段(.rodata
)中。const
变量:存储在栈区(CSTACK
)中,类似于其他局部变量。4、volatile
关键字的变量存储位置通常与其作用域相关:
volatile
变量:通常存储在 .data
或 .bss
段中,具体取决于是否初始化。volatile
变量:存储在栈区(CSTACK
)中,类似于其他局部变量。5、static
关键字用于声明静态变量,其存储位置取决于变量的作用域:
-
静态全局变量(
static
全局变量): - 存储位置:通常存储在
.data
或.bss
段中,具体取决于变量是否被初始化。 - 已初始化的静态全局变量:存储在
.data
段中。 - 未初始化的静态全局变量:存储在
.bss
段中。 -
静态局部变量(
static
局部变量): - 存储位置:存储在
.data
或.bss
段中,与静态全局变量类似。 - 已初始化的静态局部变量:存储在
.data
段中。 - 未初始化的静态局部变量:存储在
.bss
段中。
这些静态变量在程序的整个运行周期内都保持其值。
6、#define
宏定义在编译时由预处理器处理,宏本身并不占用存储空间。宏定义是代码中的文本替换指令,它们在预处理阶段被展开为实际的代码。
存储细节
.data
或 .bss
段,局部变量在栈区)。总之,#define
本身不占用存储空间,它仅在编译阶段影响代码的生成。
三、内存优化
1、RAM内存的优化:
-
内存优化:
- 减少全局变量:尽量减少全局变量和静态变量的使用,因为它们会占用数据内存。
- 使用局部变量:局部变量只在函数调用时占用内存,有助于节省内存。
- 数据结构优化:使用合适的数据结构来节省内存。例如,使用
uint8_t
代替int
以节省空间。 -
堆栈和堆的管理:
- 确保你的堆栈和堆大小设置合适,避免栈溢出和内存碎片化。
- 使用工具来分析内存使用情况,帮助你优化堆和栈的使用。
-
内存调试工具:
- 内存分析工具:使用调试工具或分析工具来监控实时内存使用情况,帮助发现内存泄漏或不足。
- MAP 文件分析:分析 MAP 文件以确定各个内存段的使用情况,确保没有过度使用数据内存。
-
硬件限制:
- 如果你发现内存不足,考虑是否可以使用更高规格的微控制器,或者使用外部内存(如外部 RAM)来扩展内存容量。
通过合理管理和优化你的内存使用,可以确保你的应用在资源有限的单片机上稳定运行。
2、Flash内存优化:
编译器等级开到最大,………
作者:All right 1