控制/MCU
编排 | strongerHuang 看到有小伙伴在讨论关于单片机内存的话题,今天就结合STM32给大家描述一下常见的划分区域。
在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。
总的分布如下所示:
内存高地址 | 栈区 |
堆区 | |
.bss段 | |
.data段 | |
常量区 | |
内存低地址 | 代码区 |
一、栈区(stack)
临时创建的局部变量存放在栈区。
函数调用时,其入口参数存放在栈区。
函数返回时,其返回值存放在栈区。
const定义的局部变量存放在栈区。
2、堆区(heap)
堆区用于存放程序运行中被动态分布的内存段,可增可减。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
3、全局区(静态区)
全局区有.bss段和.data段组成,可读可写。
4、.bss段
未初始化的全局变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容有操作系统初始化。
5、.data段
已经初始化的全局变量存放在.data段。
静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
const定义的全局变量存放在.rodata段。
6、常量区
字符串存放在常量区。 常量区的内容不可以被修改。
7、代码区
程序执行代码存放在代码区。 字符串常量也有可能存放在代码区。
通过上面的介绍,可能你对各个数据的存储位置还是很模糊,下面通过一个简单的程序,再来体会理解一下。
通过上面的介绍,可能你对各个数据的存储位置还是很模糊,下面通过一个简单的程序,再来体会理解一下
【多余一段】
#include上面我们已经对堆、栈、全局区、常量区、代码区进行了全面的分析,也举例进行了说明。static unsigned int val1 = 1; //val1存放在.data段 unsigned int val2 = 1; //初始化的全局变量存放在.data段 unsigned int val3 ; //未初始化的全局变量存放在.bss段 const unsigned int val4 = 1; //val4存放在.rodata(只读数据段) unsigned char Demo(unsigned int num) //num 存放在栈区 { char var = "123456"; //var存放在栈区,"123456"存放在常量区 unsigned int num1 = 1 ; //num1存放在栈区 static unsigned int num2 = 0; //num2存放在.data段 const unsigned int num3 = 7; //num3存放在栈区 void *p; p = malloc(8); //p存放在堆区 free(p); return 1; } void main() { unsigned int num = 0 ; num = Demo(num); //Demo()函数的返回值存放在栈区。 }
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !