本帖最后由 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.此处分享到此结束,因开发板有些许问题,后续补上程序问题分析,本文章如有问题,大家评论区一起讨论,谢谢!
|