STM32F103的内存分布简化视图

STM32F103的内存分布简化视图

在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量去、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。总的分布如下图所示

内存高地址 栈区
  堆区
.bss段
.data段
常量区
内存低地址 代码区

栈区(stack)
临时创建的局部变量存放在栈区。
函数调用时,其入口参数存放在栈区。
函数返回时,其返回值存放在栈区。
const定义的局部变量存放在栈区。
堆区(heap)
堆区用于存放程序运行中被动态分布的内存段,可增可减。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
全局区(静态区)
全局区有.bss段和.data段组成,可读可写。

.bss段
未初始化的全局变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容有操作系统初始化。
.data段
已经初始化的全局变量存放在.data段。
静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
const定义的全局变量存放在.rodata段。
常量区
字符串存放在常量区。
常量区的内容不可以被修改。
代码区
程序执行代码存放在代码区。
字符串常量也有可能存放在代码区。
通过上面的介绍,可能你对各个数据的存储位置还是很模糊,下面通过一个简单的程序,再来体会理解一下。

#include <stdio.h>
 
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()函数的返回值存放在栈区。
}


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/lin_duo/article/details/103019390

 

栈指针(SP)是向数据段和BSS段的方向增长的,也就是向内存的低地址方向。

posted @   流水江湖  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-01-16 网分阻抗格式变换
2021-01-16 RF电源(偏压)走线和电源去耦
2021-01-16 RF传输线弯角补偿
点击右上角即可分享
微信分享提示