单片机内存详解

单片机内存详解

1. 名词解释

  1. flash、ROM、RAM的区别
  • 在stm32中flash就是ROM,掉电数据还保存的;
  • (通常保存着text段、Code、Ro-data、Rw-data)
  • RAM就是运行内存,掉电数据就丢失;
  • (通常保存着堆、栈、bss段、data段、ZI-data、RW-data)

计算机系统中,变量、中间数据一般存放在 RAM 中,只有在实际使用时才将它们从 RAM 调入到 CPU 中进行运算。一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用

  • 一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在 MCU 不同的存储区。

Program Size: Code=48008 RO-data=5660 RW-data=604 ZI-data=2124

Code:代码段,存放程序的代码部分

RO-data:只读数据段,存放程序中定义的常量 .
const int a= 123;
#define ABCD (123)

RW-data:读写数据段,存放初始化为非 0 值的全局变量.
int a = 123;//非零全局变量

ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量;
int a;//未初始化全局变量
int a=0;//初始化为0变量

编译完工程会生成一个.map 的文件,该文件说明了各个函数占用的尺寸和地址
Total RO Size (Code + RO Data) 53668 ( 52.41kB)
Total RW Size (RW Data + ZI Data) 2728 ( 2.66kB)
Total ROM Size (Code + RO Data + RW Data) 53780 ( 52.52kB)

RO Size 包含了 Code 及 RO-data,表示程序占用 Flash 空间的大小
RW Size 包含了 RW-data 及 ZI-data,表示运行时占用的 RAM 的大小
ROM Size 包含了 Code、RO-data 以及 RW-data(非0),表示烧写程序所占用的 Flash 空间的大小

程序运行之前,需要有文件实体被烧录到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,该被烧录文件称为可执行映像文件。

如图是可执行映像文件烧录到 STM32 后的内存分布,它包含 RO 段和 RW 段两个部分:
其中 RO 段中保存了 Code、RO-data 的数据,
RW 段保存了 RW-data ,ZI-data的数据,
由于 ZI-data 都是 0,所以未包含在映像文件中。

STM32 在上电启动之后默认从 Flash 启动,启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中,但不会搬运 RO 段,即 CPU 的执行代码从 Flash 中读取,
另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零
在这里插入图片描述

在这里插入图片描述

添加链接描述

栈不需要程序员手动去申请,函数的局部变量、入参都占用栈空间,当函数执行结束是,栈空间会自动释放。
​ 堆需要程序员手动申请、释放。

​ 直接说明,堆和栈在 ram 中。

在启动文件有如下定义
堆区和栈区的大小在如下位置定义,可以按自己的需要修改,注意单片的RAM的大小,堆和栈不是你想改多大就多的

堆空间大小是需要自己分配的

ROM/FlashCode+RO+RW
RAMRW+ZI
RAM动态内存堆手动申请
RAM自动(局部变量,传参)

线程栈
RT-Thread 线程具有独立的栈,当进行线程切换时,会将当前线程的上下文存在栈中,当线程要恢复运行时,再从栈中读取上下文信息,进行恢复。

线程栈还用来存放函数中的局部变量:函数中的局部变量从线程栈空间中申请;函数中局部变量初始时从寄存器中分配(ARM 架构),当这个函数再调用另一个函数时,这些局部变量将放入栈中

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值