我们在使用Keil编译程序成功后会,有一行各部分占用内存的提示信息,如下
Program Size:Code=7492 RO-data=556 Rw-data=72 ZI-data=11688,这是stm32代码编译后的提示
我们分析一下这个编译输出:
- Code: 7492字节 -> 代码部分(存放在Flash)
- RO-data: 556字节 -> 只读数据(存放在Flash)
- RW-data: 72字节 -> 已初始化的读写数据(在Flash中存储初始值,运行时拷贝到RAM)
- ZI-data: 11688字节 -> 未初始化的数据(运行时在RAM中初始化为零)
所以,占用Flash的空间为:Code + RO-data + RW-data(因为RW-data的初始值需要存储在Flash中) 即:7492 + 556 + 72 = 8120字节 ,但是注意,ZI-data不占用Flash空间,因为它只需要在程序运行时在RAM中分配并初始化为零。
因此,这个程序占用的Flash空间为8120字节。 另外,程序运行时占用的RAM空间为:RW-data + ZI-data = 72 + 11688 = 11760字节。
总结:
Flash占用:8120字节 约7.93KB
RAM占用:11760字节 约11.48kB
并且我们在购买单片机的时候会经常看到一下字样,Flash ,RAM等今天我们将解密他们究竟是什么
简单来说:
Flash大小:决定了你的程序代码能写多大,以及能存储多少常量数据(如图片、字体等)。如果你的程序很大,就要选Flash大的型号。
RAM大小:决定了你的程序运行时能同时使用多少变量和数据。如果你的程序需要处理大量数据、有很多全局变量、或者使用了复杂的算法和递归,就需要更大的RAM。RAM不足是导致程序莫名崩溃的常见原因。
要想深入了解这些东西 需要我们对STM32存储器划分结构有一定了解
STM32的存储器结构采用了哈佛架构(Harvard Architecture),这意味着程序存储器(Flash)和数据存储器(RAM)在物理上是分开的,并且有独立的地址总线和数据通路,这使得CPU可以同时取指和访问数据,提高了执行效率。
地址划分 | |||
Flash (ROM) | 0x0800 0000- | 程序存储器 | 存储C语言编译之后的代码 |
0x1FFF F000- | 系统存储器 | 存储BootLoader,用于串口下载 | |
0x1FFF F800- | 选项字节 | 存储一些独立于代码的配置参数 | |
RAM | 0x2000 0000- | 运行内存SRAM | 存储运行中的临时变量 |
0x4000 0000- | 外设寄存器 | 存储各个外设的配置参数 | |
0xE000 0000- | 内核外设寄存器 | 存储内核各个外设的配置参数 |
当芯片手册上标称 “64KB Flash” 时,这个总容量通常包含了主Flash、系统存储器和选项字节等所有部分。需要查阅芯片的内存映射图来了解具体是如何划分的。例如,一颗62KB Flash的STM32芯片,其内存映射可能是:62KB的主Flash + 2KB的系统存储器 + 一小部分(如16字节)的选项字节。
什么是Flash和RAM?
1.Flash (闪存)
它是什么:是一种非易失性存储器。意思是即使断电,里面存储的数据也不会丢失。
在办公室比喻中:它就是你的文件柜。你把不经常用但很重要的东西(比如项目文档、参考资料、年度报告)长期存放在这里。
在单片机中的作用:
存储程序代码:你编写好的程序,经过编译后生成的机器码,就永久地烧录(存储)在Flash中。单片机一上电,就从这里读取指令来执行。
存储常量数据:比如固定的字体、图片、音乐数据、配置参数等只读不写的数据。
特点:速度较慢(相比RAM)、容量较大(相比RAM)、断电数据不丢失、可擦写(但次数有限,通常10万次以上)。
简单记:Flash是放程序的地方,断电还在。
2. RAM (随机存取存储器)
它是什么:是一种易失性存储器。意思是只有在通电时才能保持数据,一旦断电,里面的所有数据都会丢失。
在办公室比喻中:它就是你的办公桌面。你正在处理的文件、临时记下的笔记、计算中的草稿纸都放在桌面上。这些东西只是暂时用一下,工作结束就收走或扔掉。
在单片机中的作用:
存储变量:程序运行中产生的临时变量、中间计算结果、函数调用的堆栈等都放在RAM里。
动态内存分配:像
malloc()
或new
申请的内存空间,也位于RAM中。
特点:速度极快、容量较小(在单片机里通常是KB级别)、断电数据丢失、可无限次读写。
简单记:RAM是程序运行时的临时工作区,断电就清空。
了解完什么是Flash我们来看看STM32的Flash划分了那几部分
1. 主Flash存储器 (Main Flash Memory)
位置:Flash的绝大部分区域。
功能:这就是我们通常说的“Flash”,用来存储你编写的应用程序代码和常量数据。
权限:用户程序可以自由地读取这里的数据。在允许自我编程(IAP)的单片机上,用户程序也可以擦写这个区域(比如用于固件升级)。
比喻:大楼里开放的办公区域,员工可以自由进出和使用。
2. 系统存储器 (System Memory)
位置:Flash中一段固定的、出厂前预设好的区域。
功能:里面存储的是芯片制造商预先烧录好的Bootloader程序。这个Bootloader通常是用于通过某种串行接口(如USART, USB, CAN等)来下载用户程序到主Flash存储器。最常见的例子就是STM32的USB DFU或UART烧录功能。你选择从“系统存储器启动”时,芯片就会运行这里的程序。
权限:这段区域是只读的。用户无法修改或擦除这里的内容,这是芯片厂商写死的,为了防止用户误操作导致芯片“变砖”。
比喻:大楼里一个上了锁的机房,里面放着大楼的基础控制系统(如消防、供电)。只有大楼管理员(芯片厂商)有钥匙,普通员工(用户)只能使用它提供的功能(比如通过它来部署新程序),但不能改动里面的设备。
3. 选项字节 (Option Bytes)
位置:Flash中一个非常小但极其重要的特殊区域。
功能:它不是用来存储程序或数据的,而是用来配置单片机的硬件特性的,可以看作是芯片的“配置开关”。常见的配置包括:
读写保护:给主Flash上锁,防止别人通过调试器读取或抄袭你的程序代码。
写保护:保护Flash的某些扇区不被意外擦写。
硬件看门狗:配置看门狗是硬件开启还是软件开启。
复位级别:配置NRST引脚是作为复位引脚还是普通IO。
启动配置:决定芯片上电后从主Flash、系统存储器还是RAM启动。
权限:用户可以通过特定的编程流程(通常需要先解锁)来修改选项字节。修改后需要触发一个系统复位才能生效。
比喻:大楼总电箱里的那些开关和保险丝。它们不参与日常办公,但决定了整个大楼的用电安全、照明方式等基础设置。改动它们需要谨慎并有特定权限。
4. Bootloader (引导加载程序)
概念:这是一个程序,而不是一个存储区域。它是一段特殊的代码,负责在单片机正式运行用户主程序之前,完成一些初始化工作,或者决定从哪里、如何加载主程序。
存放位置:它可能存放在两个地方:
系统存储器:即芯片厂商自带的,如上所述。
主Flash存储器:用户自己编写的Bootloader。比如你想通过网络来升级固件,你就可以自己写一个更强大的Bootloader,把它放在主Flash的开头部分。芯片上电后先运行你的Bootloader,你的Bootloader再决定是跳转到主应用程序,还是进入升级模式。
比喻:大楼的前台接待员或门卫。每天早上(上电后),他先到岗,检查今天有没有新的快递(新的固件包)要接收,或者决定是让员工直接进入办公区(跳转到主程序),还是先组织一个安全会议(系统配置)。
RAM内存布局示例