打印
[APM32F4]

浅谈内存编译信息

[复制链接]
292|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


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

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

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

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

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

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





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝