码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈RAM和ROM的各种区别

时间:2020-07-20 22:47:09      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:函数代码   的区别   服务器   常量   sdn   二进制   动态   运行   pac   

  一、RAM和ROM的区别

  只读存储器(Read Only Memory,ROM)。ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。ROM所存数据稳定,计算机中的ROM主要是用来存储一些系统信息,或者启动程序BIOS程序,这些都是非常重要的,只可以读一般不能修改,断电也不会消失。

   随机存取存储器(Random Access Memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。当电源关闭时RAM不能保留数据。如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。

从电脑来说一般比较好理解,RAM就是我们平时所说的运行内存,它的确是随时可读写的。因为CPU处理的数据都是以运行内存为中介的。断电后信息是不保存的。那么对于ROM来说,是不是就是硬盘呢?不是说ROM只可以读吗?硬盘却是可以修改的。的确,必须明确一点,RAM与ROM都是内存,而硬盘是外存,所以ROM不等于硬盘。只不过RAM叫随机内存,ROM叫只读内存。
  //(上面为CSDN博主「添码星空」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。//

  //原文链接:https://blog.csdn.net/tectrol/java/article/details/80638457)//

  内存(即随机存贮器RAM)可分为静态随机存储器SRAM,和动态随机存储器DRAM两种。我们经常说的“内存”是指DRAM。而SRAM大家却接触的很少。  
     SRAM其实是一种非常重要的存储器,它的用途广泛。SRAM的速度非常快,在快速读取和刷新时能够保持数据完整性。SRAM内部采用的是双稳态电路的形式来存储数据。所以SRAM的电路结构非常复杂。制造相同容量的SRAM比DRAM的成本高的多。正因为如此,才使其发展受到了限制。因此目前SRAM基本上只用于CPU内部的一级缓存以及内置的二级缓存。仅有少量的网络服务器以及路由器上能够使用SRAM。例如可以对全局变量、局部静态变量、全局静态变量等。

举例说明

  可以知道SRAM属于RAM,掉电后数据丢失;FLASH和EEPROM属于ROM,掉电后数据不丢失。

  FLASH和EEPROM的区别在于:Flash存储器,适用于速度要求高,容量要求大,掉电时要求数据不丢失的场合;EEPROM适用于速度不高,容量不大,掉电时要求数据不丢失的场合。

了解这些之后,翻看开发板的stm32f103开发手册统计一下用到了哪些内存。

1.芯片自带内存:SRAM:20K,FLASH:128K.

2.IIC实验里介绍MCU与24C02通过IIC实现通讯,24C02是一款EEPROM芯片,总容量2Kbit。

3.SPI实验里介绍MCU与W25Q128通过SPI实现通讯,W25Q128是一块外部FLASH,容量128Mb,也就是16M字节。

知道了有哪些内存,再来总结下各个内存块的用处。

在单片机中,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据。

 

二、堆栈、全局变量、全局静态变量、局部静态变量、文字常量、函数代码

 

  据我所知,单片机程序可分为 Code(数据代码区)、RO-data(只读存储区)、RW-data(可读可写存储区)、ZI-data(零初始化存储区),

其中Code(数据代码区) 和RO-data(只读存储区)存储在FLASH中,RW-data(可读可写存储区)和ZI-data(零初始化存储区)存储在SRAM中。

  那麽堆栈、全局变量、全局静态变量、局部静态变量、文字常量、函数代码分别存储在那些存储区中呢?

 

栈区(Stack) 包含在RW-data(读写数据存储区) 存放函数的参数值,局部变量的值等
堆区(Heap) 包含在单片机的sram中的(读写数据存储区) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
全局区(静态区)(static) 全局变量、全局静态变量、局部静态变量((读写数据存储区)) 这些数据也是可读可写的,和stack、heap一样,被包含在sram中。
一般未初始化的变量 ZI-data(零初始化存储区) 被包含在sram中, 掉电会丢失数据
文字常量(const) RO-data(只读存储区) 掉电不会丢失数据,Flalsh中
函数代码 存放函数体的二进制代码Code(数据代码区) 因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中

 

三、堆栈注意问题

技术图片

 

  注意1 栈(Stack)越界问题,导致程序跑飞

  怎么出现这种情况?

  stack是往下发展的,当局部变量或者函数形参过多时,超过规定的stack大小,会占用Heap区域

  解决方法:

  1.确定程序没有问题   2.增大STACK大小

  

技术图片

 

  2.不能使用malloc申请内存

  解决方法: 增大Heap_Size大小

  技术图片

 

浅谈RAM和ROM的各种区别

标签:函数代码   的区别   服务器   常量   sdn   二进制   动态   运行   pac   

原文地址:https://www.cnblogs.com/18689400042qaz/p/13346682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!