产品选型

单片机ram程序 一篇文章讲透单片机的RAM和FLASH

小编 2024-10-23 产品选型 23 0

一篇文章讲透单片机的RAM和FLASH

最近在一个问答社区回答了一个问题,关于单片机存储器的,于是有了想专门写一篇关于单片机存储器的想法。作为单片机内部一个重要组成部分,存储器占有很重要的地位,今天就来聊聊我对于单片机的内部存储器RAM和FLASH的一些认识和理解。

1、先聊聊存储器

存储器是单片机结构的重要组成部分,存储器是用来存储编译好的程序代码和数据的,有了存储器单片机系统才具有记忆功能。按照存储介质的特性,可以分“易失性存储器”和“非易失性存储器”两类。易失性存储器断电后,里面存储的内容会丢失;非易失性存储器断电后,数据可以依然保持。

存储器分类

2、单片机的存储器

如下图所示是STM32F103RB系列单片机所使用的存储器大小,Flash为128KB,RAM为20KB,这里的RAM是指SRAM。

STM32F103RB内存大小

这两个存储器的寄存器输入输出端口被组织在同一个4GB的虚拟线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。Flash用来存储编译好的程序文件,SRAM用来存储运行程序时所创建的临时数据。所以如果不加入外置存储器,那么程序里的东西就会出现在这两个存储器中。

下图为STM32F103RB单片机的内存映射图(部分),可以看到画红圈的两个就是SRAM和Flash存储器。不知道大家有没有注意,当使用J-Flash软件给stm32下载bin文件的时候需要填写起始地址,那个0x08000000其实就是Flash存储器的起始地址。

STM32F103内存映射图

3、关于编译器生成的文件

如果你玩过单片机,那你应该对Keil这款软件不会感到陌生,下图是我的那款OLED时钟的软件用Keil编译后的编译信息。

KEIL编译信息

很多人并不一定知道Program Size的含义,我来给大家解释一下。

Code: 是程序中代码所占字节大小;

RO-data: 程序只读的变量,也就是带const的,和已初始化的字符串等;

RW-data: 已初始化的可读写全局/静态变量;

ZI-data: 未初始化的可读写全局/静态变量;

那么这个程序占用的Flash存储器的空间大小是多少呢?程序所占Flash空间大小=Code+RO data+RW data=生成的bin文件大小

那么这个程序占用的SRAM存储器的空间大小是多少呢?程序固定占用RAM大小=RW data+ZI data

这些信息除了在编译器下方的信息栏里面看到,也可以在项目文件里的.map文件的最下面找到,如下图:

.map文件信息

4、数据在存储器上的存储结构

程序在Flash上的存储结构如下图所示,通过阅读hex文件和MDK下调试综合提炼出来的。其中,ZI-data对应未初始化数据段,RW-data对应已初始化数据段,Code对应代码段。

STM32的Flash存储结构

数据在SRAM上的结构,如下图所示。这部分大家可以参考上面的内存映射图来理解。

STM32的SRAM存储结构

5、总结

至此我相信大家应该对stm32单片机的内部存储有了更进一步的认识。其实如果想更深入的了解单片机的运行轨迹,我建议大家来详细研究一下stm32单片机的上电内存读取过程,如果搞明白了这块收获会是非常大的。后面有机会我也会对这块进行深入的总结,并整理成文章发出来,与大家一起分享。

单片机ROM,RAM都是干啥的?

常规上ROM是用来存储固化程序的,RAM是用来存放数据的。譬如说,现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。

--ROM存放指令代码和一些固定数值,程序运行后不可改动;RAM用于程序运行中数据的随机存取,掉电后数据消失..

code就是指将数据定义在ROM区域,具只读属性,例如一些LED显示的表头数据就可以定义成code存储在ROM。

ROM:(Read Only Memory)程序存储器

在单片机中用来存储程序数据及常量数据或变量数据,凡是c文件及h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码(类似ARM中的bootloader或者X86中的BIOS,一些低端的单片机是没有这个的)通通都存储在ROM中。

RAM:(Random Access Memory)随机访问存储器

用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。

程序经过编译、汇编、链接后,生成hex文件。用专用的烧录软件,通过烧录器将hex文件烧录到ROM中(究竟是怎样将hex文件传输到mcu内部的ROM中的呢?),因此,这个时候的ROM中,包含所有的程序内容:无论是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包含在hex文件中,全部烧录到了ROM里面,此时的ROM,包含了程序的所有信息,正是由于这些信息,“指导”了CPU的所有动作。

可能有人会有疑问,既然所有的数据在ROM中,那RAM中的数据从哪里来?什么时候CPU将数据加载到RAM中?会不会是在烧录的时候,已经将需要放在RAM中数据烧录到了RAM中?

要回答这个问题,首先必须明确一条:ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存,这是条永恒的真理,始终记挂在心。

相关问答

单片机 内的ROM和 RAM 如何储存 程序 与数据?

ROM一般用户只读不存(部份FLASH单片机的ROM可以由特殊指令进行先擦除,再改写存储),ROM掉电后数据不会丢失;RAM在上电后可由用户随意存取,但掉电后数据丢失...

单片机 RAM 和ROM是什么意思?

ROM:ReadOnlyMemory(anonvolatilememory)--只读存储器(非易失存储器)永久存储重覆使用的信息,比如数据表、电子显示器的字符等。和RAM不同,ROM...

单片机 片内 ram 不够用,怎么处理-ZOL问答

优化程序,看程序中哪些固定buf大小用不了那么多的改小可以使用动态分配buf空间外接扩展ram芯片就是有16条地址线。1K*8需要8片;16K需要8*16=128片.采用译码...

ram 中知道位地址怎么求字节地址?

要求解RAM中的字节地址,需要考虑RAM的存储结构和位宽。假设RAM的位宽是N(以比特为单位),字节地址为B,位地址为A(从0开始计数)。首先,需要计算字节地址...在...

简述89S51 单片机 片内 RAM 的分配空间?

89S51单片机片内RAM的分配:00~1FH:工作寄存器区;20~2FH:位寻址区;30~7FH:通用区。89S52单片机片内RAM,还有:80~FFH:通用区,必须间接寻址。89S51单片机片内...

单片机 外部扩展 RAM 和ROM时,po口和p2口各起什么作用 - 懂得

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、...

51 单片机 是直接ROM运行 程序 ,对不对? 像手机一样有操作系统的...

像手机一样有操作系统的,装载后在RAM中运行对不对?操作系统讨论回答(4)51单片机的RAM很小只有几百字节,不能装入很多代码,单片机一般是从ROM中运行代码的,51...

80c51 单片机 ram 分为几部分?

如下几个部分工作寄存器区001fh位寻址区20-2fh剩余就是通用寄存器区51就是30-7fh52就是30-ffh如下几个部分工作寄存器区001fh位寻址区20-2fh...

8051 单片机 内部 ram 多大?

基本型8051单片机的内部RAM是256字节,单元地址是00~FF。扩展型8051单片机(例如STC系列)增加了内部扩展RAM,称为XRAM,最大的可以达到8k字节。单片机对扩展XR...

51 单片机 的寄存器和 RAM 地址?

51单片机的工作寄存器一共有32个,为RAM中的00H--1FH单元,分为4组,分别是0组:00H--07H单元、1组:08H--0FH单元、2组:10H--17H单元、3组:18H--1FH单元,....

猜你喜欢