单片机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 全局变量)

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

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

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

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

    存储细节

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

    三、内存优化

    1、RAM内存的优化:

    1. 内存优化:

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

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

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

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

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

    2、Flash内存优化:

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

    作者:All right 1

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机Map表详解与变量存储区域分布解析

    发表评论