• 浅谈RAM和ROM的各种区别


      一、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(只读存储区) 掉电不会丢失数据,EEPROM或者FLASH中
    函数代码 存放函数体的二进制代码Code(数据代码区) 因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中(Flash主要用来存储程序)

    三、堆栈注意问题

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

      怎么出现这种情况?

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

      解决方法:

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

      

      2.不能使用malloc申请内存

      解决方法: 增大Heap_Size大小

      

  • 相关阅读:
    apache配置文件参数优化
    apache 虚拟主机详细配置:http.conf配置详解
    Apache安装问题:configure: error: APR not found . Please read the documentation
    lamp安装
    Linux运维常用命令总结
    mysql主从日志的定期清理
    python写的分析mysql binlog日志工具
    mysql5.6主从参数详解
    京东MySQL监控之Zabbix优化、自动化
    CentOS 6.5 生产环境编译安装LNMP
  • 原文地址:https://www.cnblogs.com/18689400042qaz/p/13346682.html
Copyright © 2020-2023  润新知