[APM32F4] 浅谈内存编译信息

[复制链接]
544|0
 楼主| lzh12a3nf 发表于 2023-12-25 20:51 | 显示全部楼层 |阅读模式
本帖最后由 lzh12a3nf 于 2023-12-25 20:51 编辑

1.前言
    最近在学习过程中,涉及到了RAM内存区域的重新分配及堆栈区域大小的分配,对此,我做出了自己的学习总结及分享,欢迎大家指出问题。

2.相关知识介绍
2.1. Code、RO-data、RW-data、ZI-data

内存信息2.png

在编译完一个工程中,对应的map文件下都会出现下面三个区域的大小,这三个区域大小所涉及的内容(个人理解)含义如下:

  1. Code:执行的代码,即程序中的所有函数,又称.text段
  2. RO Data:即Read Only,是指程序中的常量大小,如const型
  1. RW Data:即Read and Write,是指可读可写的初始化的变量和静态变量
上述中,Code和RO Data存储在Flash区域,RW Data及ZI Data存储在RAM区域。

2.2 STACK_Size、Heap_Size
  1. 栈区:系统自动分配,函数结束时自动释放。
  2. 存放内容:局部变量、局部常量、函数参数。
  1. 堆区:动态分配,即malloc()\new()申请分配。
  2. 特点:自行手动分配、手动释放。
堆栈均存放于RAM区域,而我们可以看到启动文件中的开头部分,对堆栈区域进行了一个分配,如下:
内存信息4.png

2.3 bss段和data段
  1. .bss段:存储初始化的全局变量、初始化的静态变量
  2. .data段:存储未初始化的全局变量、未初始化的静态变量
调用函数结束后,其二者不会被销毁、.bss[color=rgba(0, 0, 0, 0.75)]会在程序执行前,将内容全部置为0,所以未初始化的全局变量和静态变量的值都为0。

3.结合代码简单分析
  1. int a = 0;                  //全局初始化区  
  2. char *temp1;                   //全局未初始化区
  3. int multiply(int a,int b)
  4. {
  5.     int ans = 0;            //栈
  6.     static temp;            //全局(静态)未始化区  
  7.     ans = a*b;
  8.     return ans;
  9. }
  10. int main()
  11. {     
  12.     int b;                  //栈     
  13.     char sta[] = "abc";       //栈   
  14.     char *temp2;               //栈      
  15.     char *temp3 = "111111";    //111111\0在常量区,p3在栈上     
  16.     static int c = 0;       //全局(静态)初始化区     
  17.     temp1 = (char *)malloc(10);     
  18.     temp2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区     
  19.     strcpy(temp1, "222222");    //222222\0放在常量区, 编译器可能会将它与p3所指向的"111111"优化成一块   
  20.     return 0;
  21. }

4.此处分享到此结束,因开发板有些许问题,后续补上程序问题分析,本文章如有问题,大家评论区一起讨论,谢谢!





您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部