设计与开发

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

小编 2024-10-08 设计与开发 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单片机的上电内存读取过程,如果搞明白了这块收获会是非常大的。后面有机会我也会对这块进行深入的总结,并整理成文章发出来,与大家一起分享。

为什么单片机内部RAM这么少?

也许大家都注意到了,在过去的 20 多年的时间里,微控制器(MCU)经历了跨越式的发展,这反映在很多方面,比如更高的系统时钟、更多的外设模块、更加便利的调试手段、32 位的内核等等。但 MCU 内部的数据内存空间则始终在十几 K(16~32KB)的左右徘徊,虽然有些基于 Cortex M4 核单片机有多达 265kBRAM的型号,但是在众多单片机型号阵列中,它们是寥寥无几。

那么,究竟什么原因使得单片机很容易拥有多达数 MB 的程序 Flash 空间,而数据内存只有那么小呢?

△ 小型封装的 MCU

在所有影响单片机内 RAM 增加的原因中,一个基础的问题就是 RAM 会占用很多硅片面积,这也会直接引起芯片价格的增加。这是因为在同样的硅片上,占用硅片面积大会使得 MCU 数量就会减少,特别是在晶圆片的边界部分造成更大的浪费。祸不单行,面积大的 IC 也更会产生缺陷,使得成品率下降。

第二个原因就是制作 RAM 的工序复杂。可以通过不同手段优化 RAM 生产工艺,但在制作 MCU 过程中, 同一芯片不可能经历过多的工序。有一些芯片加工服务厂商专门生产 DRAM,这是利用特殊的半导体电容技术来极大减少 RAM 所占用的硅片面积。但 DRAM 需要通过不停刷新来维持其内部数据。为了延迟 DRAM 单元保持数据的能力,就要求晶体管漏电流小,这也会造成晶体管的运行速度降低。这需要在速度和数量之间做折中,但这种折中工艺不利于制作高速逻辑电路。

△ IC 和晶片

此外,大容量 RAM 电路在后期的测试阶段也会消耗大量的时间,从而增加生产的时间成本。所以,经济原因造成生产 RAM 的专门厂商兴起。

功耗是另外一个限制因素。单片机系统通常对功耗有限制,很多情况下,单片机通过进入睡眠状态来减少耗电量。普通的 SRAM 耗电量很小,通过备用电池往往可以工作很多年。但 DRAM 则需要通过不断刷新来维持存储的数据。一旦停止刷新,由于漏电流的存在,DRAM 的内容在不到一秒钟的时间内就会消失。所以,单片机中不能够使用 DRAM 而只能使用占用硅片面积更大的 SRAM。

在现代 CPU 技术中,往往在新品中保留数量较少的 SRAM 作为缓存(Cache),而将大容量的 DRAM 作为 CPU 外部的数据存储空间。

有一些非常酷的手段可以将不同生产工艺的 RAM 和 MCU 制作工艺融合在一起,例如多芯片封装技术(Multi-Chip Package),将 RAM 新品放在 MCU 芯片上面堆叠一起进行封装,这比在电路板上将 RAM 与 MCU 集成更加节省系统体积,也提高数据传输速率。

△ AMD 的带有堆叠封装的 MCU

最后一个原因,那就是在绝大多数单片机应用的场合所需要的 RAM 的容量都比较少。比如在嵌入式控制领域,很多很多传感器信息都可以用极少字节的数据来表示,用于控制的参数和控制逻辑占用数据空间也很少。

所以当需要大量 RAM 的应用出现的时候,往往就会直接采用集成有大容量 DRAM 的电路板来工作。通过外部集成大容量 RAM 芯片要远比 MCU 内部集成的 RAM 更加经济。

除了前面的原因之外,单片机指令集也会限制 RAM 访问空间。比如 Microchip 公司的单片机,PIC10LF320,是 12bit 的指令,它只能够范围 128 字节的 RAM 空间。对于 8031 单片机,直接寻址的 RAM 空间也只有 128 字节。如果访问更大的外部存储空间,则需要借助于执行效率更低的间接指令。

单片机总线结构分为 Harvard 结构和 Von Neumann 结构,后者中,程序和数据存储空间是在同一个访问空间中。如果单片机中集成了大量的 Flash 区,那么留给数据 RAM 空间访问地址就少了。

此外,高效的 C 语言编译器,可以有效重复应用有限的 RAM 空间完成所需要的任务。在复杂的应用中,往往会采用多个单片机协同完成,这大大提高系统实时特性。巧妙的设计方案会避免嵌入式系统对大容量 RAM 的需求。所以,有人认为,正是由于没有大量需要高 RAM 容量的应用要求,是造成现在单片机内部 RAM 少的真正原因。

别忘了,早期那些令我们着迷的电子游戏,虽然有着炫酷的图形界面,但它们连程序带数据总共也只有 8k 字节的存储空间,比如吃豆子游戏,太空入侵游戏等。让我们向早期的这些极简风格嵌入式编程人员致敬吧。

吃豆子游戏

参考资料

[1]Why do microcontrollers have so little RAM?: https://electronics.stackexchange.com/questions/134496/why-do-microcontrollers-have-so-little-ram

相关问答

平时说的51 单片机 片内RAM 和片外?

简单说,片内就是单片机自带的。片外,就是需要外扩的,需要焊在电路板上的ram等。ram,rom,flashrom等简单说,片内就是单片机自带的。片外,就是需要外扩的,...

单片机 如何访问片外 ram ?

单片机访问片外RAM的步骤通常包括以下几个关键步骤:首先,配置单片机的地址总线和数据总线,使其能够与片外RAM进行通信。其次,通过I/O口或者特定的控制寄存...

试写出AT89C-51 单片机片内外 Rom和 RAM 的地址空间-ZOL问答

AT89C51单片机片内Rom:4K字节;RAM:128字节。AT89C51单片机片外Rom:60K字节;RAM:64K字节。重叠的地址空间单片机是如何区分的?单片机并不认为有重叠的地址...

c51 单片机 片内RAM 容量有多少?

C51单片机的片内RAM容量为128字节。这128字节被分为两个部分,包括8字节的特殊功能寄存器区域和120字节的数据RAM空间。特殊功能寄存器用于控制和配置C51单片机...

8051 单片机片内RAM 仅128B,没有高128B,特别功能寄存器会存在...

关于51单片机内存问题,一直是个疑惑大家的问题,因为51单片机是个很另类的单片机。下面我给楼主讲解一下:51单片机之所以另类,是因为,他寻址内存的空间,不是靠...

51 单片机 访问 内RAM ,外 RAM ,ROM的用什么指令?

内RAM…………MOV外RAM…………MOVXROM…………MOVC如有:MOVA,50HMOVXA,DPTRMOVCA,@A+DPTR内RAM…………MOV外RAM…………MO...

RAM 单片机 里面的用途?

RAM在单片机里的用途,主要是存放临时数据,例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次);我们先通过传感器,放大电路,A/D转换,把温度这个...

单片机 ram 与rom的关系是什么?

首先感谢系统的邀请,关于回答单片机中RAM和ROM的关系。现在单片机种类型号非常多,最常见的是MCS51系列单片机,同时还有PIC系列单片机、AVR系列单片机、ARM系列...

51 单片机 的存储器分为存储器和存储器.MCS-51 单片机 内部 RAM ...

[最佳回答]1.0000H,07H,第0组2.程序,数据,三,SFR,21个3.没看懂你的空在哪?可以看成是数据总线,地址总线和控制总线!4.外部中断0,外部中断1,定时/计数器0...

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

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

猜你喜欢