一、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大小