一、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内存优化:
编译器等级开到最大,.........
973

被折叠的 条评论
为什么被折叠?



