淺談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大小

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM