存儲器模型
存儲器對于整個計算機系統(tǒng)來說是至關重要的:供CPU執(zhí)行的程序指令、程序運行過程中的變量和數(shù)據……,它們都要以存儲器作為載體。所以在實際的應用和開發(fā)中,人們總是希望單片機芯片的RAM和ROM容量能盡量大一些。這樣就可以存儲更多的代碼指令,運行規(guī)模更大更為復雜的程序。另外,存儲器本身的讀寫速度也就成為了CPU性能的最大瓶頸之一。更為形象的描述如圖1.9所示。
圖1.9 CPU從存儲器取指令以及進行變量、數(shù)據的存儲
ROM,即只讀存儲器,也就是說在它上面存儲的內容是無法被CPU直接修改的。(通常只能使用專用的燒錄器來修改其中的數(shù)據,不過現(xiàn)在一些新型的單片機芯片已經可以在CPU運行過程中去修改ROM數(shù)據了,這種技術被稱為“IAP”)所以,ROM通常被用來固化存儲程序指令代碼和一些無需修改的數(shù)據,比如字模字庫、常數(shù)等等。
RAM與ROM不同,它是可讀可寫的,因此被稱為隨機讀寫存儲器。CPU在運行過程中,可以對RAM中的任何數(shù)據進行讀寫修改操作。這就是C語言中賦值語句在底層得以實現(xiàn)的物理基礎,比如“int a; a=0”,就是將RAM中的某一個存儲單元寫入了一個數(shù)值0。但如果是“code int a; a=0”的話,編譯的時候就一定會報錯。(code關鍵字在51單片機C語言中是用來說明“變量”的位置在ROM中,同樣的定義在ARM上使用const)而且,RAM比ROM在讀寫速度上要快得多,所以CPU在運行程序的時候,通常都會把一些代碼指令拷貝到RAM中來,尤其是那些會被頻繁執(zhí)行的部分(這就是C語言中的.text段,即代碼段)。但是RAM通常比ROM要昂貴的多(關于這一點大家應該有宏觀的感知,一個U盤16G才10塊錢,但是電腦內存條卻要好幾百),這也就是生產廠商為什么在單片機芯片中對于RAM的配比顯得很吝嗇,而對于ROM則略顯慷慨的原因。
為了更好地講解后面的內容,對于存儲器大家必須明確一點,它也算是一個常識:它是由很多的地址連續(xù)的存儲單元構成的,如圖1.10所示。
圖1.10 存儲器是由地址連續(xù)的存儲單元構成
總體來說,存儲器就是一個指令和數(shù)據的容器,它與CPU相互依存,這才使得整個計算機系統(tǒng)得以正常運作。此時一個極其重要的問題便應運而生:CPU是如何精準地從存儲器中取出指令和數(shù)據的,又是如何將數(shù)據寫入到存儲器中的?這一問題說起來簡單,但它卻引申出了一個關鍵的技術—“總線”!