单片机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 关键字用于声明静态变量,其存储位置取决于变量的作用域:

  1. 静态全局变量(static 全局变量)

    • 存储位置:通常存储在 .data 或 .bss 段中,具体取决于变量是否被初始化。
      • 已初始化的静态全局变量:存储在 .data 段中。
      • 未初始化的静态全局变量:存储在 .bss 段中。
  2. 静态局部变量(static 局部变量)

    • 存储位置:存储在 .data 或 .bss 段中,与静态全局变量类似。
      • 已初始化的静态局部变量:存储在 .data 段中。
      • 未初始化的静态局部变量:存储在 .bss 段中。

这些静态变量在程序的整个运行周期内都保持其值。

6、#define 宏定义在编译时由预处理器处理,宏本身并不占用存储空间。宏定义是代码中的文本替换指令,它们在预处理阶段被展开为实际的代码。

存储细节

  • 宏定义:在源代码中,它们仅是文本替换,没有直接的内存存储。预处理器在编译之前会用宏定义的内容替换所有的宏调用。
  • 展开后的代码:宏展开后的代码会按照其类型存储。例如,宏定义展开为全局或局部变量时,这些变量会存储在相应的内存区域(如全局变量在 .data 或 .bss 段,局部变量在栈区)。

总之,#define 本身不占用存储空间,它仅在编译阶段影响代码的生成。

三、内存优化

1、RAM内存的优化:

  1. 内存优化:

    • 减少全局变量:尽量减少全局变量和静态变量的使用,因为它们会占用数据内存。
    • 使用局部变量:局部变量只在函数调用时占用内存,有助于节省内存。
    • 数据结构优化:使用合适的数据结构来节省内存。例如,使用 uint8_t 代替 int 以节省空间。
  2. 堆栈和堆的管理:

    • 确保你的堆栈和堆大小设置合适,避免栈溢出和内存碎片化。
    • 使用工具来分析内存使用情况,帮助你优化堆和栈的使用。
  3. 内存调试工具:

    • 内存分析工具:使用调试工具或分析工具来监控实时内存使用情况,帮助发现内存泄漏或不足。
    • MAP 文件分析:分析 MAP 文件以确定各个内存段的使用情况,确保没有过度使用数据内存。
  4. 硬件限制:

    • 如果你发现内存不足,考虑是否可以使用更高规格的微控制器,或者使用外部内存(如外部 RAM)来扩展内存容量。

通过合理管理和优化你的内存使用,可以确保你的应用在资源有限的单片机上稳定运行。

2、Flash内存优化:

编译器等级开到最大,.........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值