本帖最后由 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区域,而我们可以看到启动文件中的开头部分,对堆栈区域进行了一个分配,如下:
.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.此处分享到此结束,因开发板有些许问题,后续补上程序问题分析,本文章如有问题,大家评论区一起讨论,谢谢!
|