stm32的代码和内存管理(SRAM空间)
SRAM空间
1、文件中声明和定义(全局变量、静态数据和常量)
从0x20000000开始,到堆的起始地址(堆是向上的)。
2、HEAP区;(堆是向上的)
3、STACK区。(栈是向下的)
堆区(heap):一般由程序员使用malloc或new来进行分配,在适当的时候用free或delete来进行释放。
栈区(stack):由编译器自动分配和释放,程序员不做干涉。存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似
于数据结构中的栈。
(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配
方式类似于数据结构中的链表。
(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态
变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。
(4)文字常量区:常量字符串就是存放在这里的。
(5)程序代码区:存放函数体的二进制代码。
VM: Virtual Memory (虚拟内存)
PM: Physical Memory (物理内存)
虚拟内存中分为一下几个区域:
栈 ( stack )
堆 ( heap)
数据段
代码段
栈内存
什么东西被存放与栈空间:
1、环境变量
2、命令行参数
3、局部变量 (形参也是局部变量)
栈内存区有什么特性:
**栈空间非常有限.尤其在嵌入式的环境中.因此在做嵌入式开发过程中应该尽量少使用栈空间.*。
数据段
静态数据:
1、全局变量, 指的是在函数体外面定义的变量,称为全局变量
2、被static修饰的局部变量.(注意:解释如下)
数据段的分区
.bss 未初始化的静态数据 , 内容将会自动被清空为0
.data 已初始化的静态数据
.rodata 常量 100\200\ “Hello”
代码段
.text 段: 用于存放用户的代码
.init 段: 用于存放系统的初始化代码(程序运行需要提前做的准备)
相关API接口:
申请内存: malloc / calloc / realloc (注意:用的多是malloc和calloc)
释放内存: free
清空: bzero / memset
释放内存 的含义:
释放内存意味着内存 的使用权将移交给系统。
释放内存并不会改变指针的指向。
释放内存并不意味着内存的数据会被清除