本篇文章主要介紹處理器中存儲器:ROM和RAM以及數據在內存中的存儲順序:大/小端(Little/Big Endian)。
只讀存儲器(ROM)
ROM(Read Only Memory)用來存儲和保存數據。ROM數據不能隨意更新,但是在任何時候都可以讀取。即使是斷電,ROM也能夠保留數據。此內存主要用來放置使用者所開發之程序,eg. Bios,boot,而其性質乃屬于不常更動或永不變動之資料,微控制器之動作便是依據儲存于此區之程序指令運作。
ROM有很多種,例如PROM,EPROM,EEPROM,具體可百度。
隨機存取存儲器(RAM)
RAM(Read-Write Memory)亦稱為讀/寫內存,是與CPU直接交換數據的內部存儲器,也叫內存。它可以隨時讀寫,而且速度很快,通常作為操作系統或其他正在運行中的程序的臨時數據存儲媒介, 當電源關閉時RAM不能保留數據。
RAM 可以進一步分為靜態RAM(SRAM)和動態內存(DRAM)兩大類。靜態RAM(Static RAM/SRAM):SRAM速度非常快,不需要刷新電路即能保存數據,是目前讀寫最快的存儲設備了,但是集成度較低,多用于CPU的一級緩存,二級緩存(L1/L2 Cache);動態RAM(Dynamic RAM/DRAM),DRAM保留數據的時間很短(需要內存刷新電路,每隔一段時間,刷新充電一次,否則數據會消失),速度也比SRAM慢,不過它還是比任何的ROM都要快.
若其地址總線位32位,則RAM大小為2^32bits。
大/小端模式
存儲器中對數據的存儲是以字節(Byte)為基本單位的,因此,字(Word)和半字(Half-Word)在存儲器中就有兩種次序,分別稱為:大端模式(Big Endian)和小端模式(Little Endian)。
大段模式:低地址存放高字節數據。
小端模式:低地址存放低字節數據。
例如一個 int 型變量中存放一個數值是 0x12345678的數據:
大端模式:

小端模式:

一般地,ARM處理器均默認為小端模式。
知道了大小端模式的概念,怎樣用C語言寫段代碼判斷一個CPU是大端模式還是小端模式應當如何做呢 ?要用C語言實現就要用到聯合體(union)。聯合體union中的存放順序是所有成員都從低地址開始存放,利用該特性可獲得處理器對內存采用Little Endian還是Big Endian模式的讀寫。
采用union來判斷,具體代碼如下:
int CheckEndian(void){union check{int word;char half;} Endian;Endian.Word=1;if(1 == Endian.half)return Little_Endian;else return Big_Endian;
}
另外關于共用體與結構體:
結構體和共用體的區別在于結構體的各個成員會占用不同的內存,互相之間沒有影響;而共用體的所有成員占用同一段內存,修改一個成員會影響其余所有成員。
結構體占用的內存大于等于所有成員占用的內存的總和(成員之間可能會存在縫隙),共用體占用的內存等于最長的成員占用的內存。共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。