stm32的代码和内存管理(SRAM空间)

南北湖创客3个月前代码基础11



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



释放内存 的含义:
释放内存意味着内存 的使用权将移交给系统。
释放内存并不会改变指针的指向。
释放内存并不意味着内存的数据会被清除



图片.png

相关文章

延时函数(阻塞式,非阻塞式)

常规阻塞式延时:void delay_1ms(uint32_t count){    delay = count;    delay--;&...

DSP的三角函数(\Embedded Workbench 9.0\arm\CMSIS\DSP)

1、主要代码在BasicMathFunctions文件夹2、主要例子在arm_sin_cos_example文件夹3、arm_sin_cos_example_f32文件4、先总结网上的DSP说法FPU...

make及makefile,编译原理

1、出现*** No rule to make target ` ‘, needed by xxx. Stop.时,基本都是属于找不到所依赖的文件所导致的,查看.pro文件是否有问题。使用Eclips...

HAL_TIM_Base_Start_IT

HAL_TIM_Base_Start_IT这两个中断开启函数使用时会立即进入一次中断回调HAL_TIM_Base_Start_IT(&htim2);//即使下一行加上HAL_TIM_Base_...

保存现场

以下是一个简单的示例,演示了如何在函数调用过程中保存和恢复寄存器的值:#include <stdio.h>// 定义一个全局变量,用于存储寄存器的值int global_var = 0;/...

二人接力队列

二人接力队列

一般循环队列的属性如下:    elements\textit{elements}elements:一个固定大小的数组,用于保存循环队列的元素。  &...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。