本文是基於嵌入式的C語言 首先弄明白程式是什麼?電腦為什麼需要編程? 編寫程式的目的是為了去運行,從而得到一些結果。顧名思義電腦就是用來計算的,所以電腦的所有程式就是在計算,那麼電腦在計算什麼呢?當然是在計算數據,因此,數據是程式的重要組成。推出:電腦程式 = 代碼 + 數據。那麼程式運行 ...
本文是基於嵌入式的C語言
--------------------------------------------------
首先弄明白程式是什麼?電腦為什麼需要編程?
編寫程式的目的是為了去運行,從而得到一些結果。顧名思義電腦就是用來計算的,所以電腦的所有程式就是在計算,那麼電腦在計算什麼呢?當然是在計算數據,因此,數據是程式的重要組成。推出:電腦程式 = 代碼 + 數據。那麼程式運行後得到的結果就是:代碼 + 原始程式 = 新的數據。
從形象的巨集觀上看,代碼就是加工數據的動作,數據就是代碼所要加工的東西。
例如下麵幾行代碼(一個簡單函數):此函數(num_p)就是執行兩個數的相加代碼,它執行的動作是將兩個數據(形參int num_1 ,int num_2)相加,得到一個新的數據。
int num_p(int num_1 ,int num_2)
{
return num_1 + num_2;
}
電腦程式運行過程
電腦程式運行的過程就是多個函數相機運行的過程。程式是由多個函數組成,函數是程式的本質,函數的本質工作就是加工數據。
為什麼需要記憶體
首先要知道什麼是記憶體:(硬體和邏輯兩個角度)
從硬體角度:記憶體實際上是電腦的一個配件(一般叫記憶體條)。根據不同的硬體實現原理還可以把記憶體分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,後來的DDR1、DDR2·····、LPDDR)
從邏輯角度:記憶體是這樣一種東西,它可以隨機訪問(隨機訪問的意思是只要給一個地址,就可以訪問這個記憶體地址)、並且可以讀寫(當然了邏輯上也可以限制其為只讀或者只寫);記憶體在編程中天然是用來存放變數的(就是因為有了記憶體,所以C語言才能定義變數,C語言中的一個變數實際就對應記憶體中的一個單元)。
記憶體是用來存儲數據的,是編程和程式運行的本質需求,英文名(一般也是這樣叫)是RAM,有DRAM和SRAM之分。根據存儲方式的不同,記憶體有馮諾依曼結構和哈佛結構兩種。 馮諾依曼結構是:數據和代碼放在一起。哈佛結構是:數據和代碼分開存在。比如:在S5PV210(本人目前正在學習的晶元)中運行的linux系統上,運行應用程式時:這時候所有的應用程式的代碼和數據都在DRAM,所以這種結構就是馮諾依曼結構;在單片機中,我們把程式代碼燒寫到Flash(NorFlash)中,然後程式在Flash中原地運行,程式中所涉及到的數據(全局變數、局部變數)不能放在Flash中,必須放在RAM(SRAM)中。這種就叫哈佛結構。
單說記憶體
從邏輯角度來講,記憶體實際上是由無限多個記憶體單元格組成的,每個單元格有一個固定的地址叫記憶體地址,這個記憶體地址和這個記憶體單元格唯一對應且永久綁定。
邏輯上的記憶體就好象是一棟無限大的大樓,記憶體的單元格就好象大樓中的一個個小房間。每個記憶體單元格的地址就好象每個小房間的房間號。記憶體中存儲的內容就好象住在房間中的人一樣。
理想條件下,記憶體可以有無限大(因為數學上編號永遠可以增加,無盡頭)。但是現實中實際的記憶體大小是有限制的,譬如32位的系統(32位系統指的是32位數據線,但是一般地址線也是32位,這個地址線32位決定了記憶體地址只能有32位二進位,所以邏輯上的大小為2的32次方)記憶體限制就為4G。實際上32位的系統中可用的記憶體是小於等於4G的(譬如我32位CPU裝32位windows,但實際電腦只有512M記憶體)。
記憶體的量化
對於記憶體的量化,前人、大佬們已經訂好了規則。一般有四種:位、位元組、半字和字。有些地方會有雙字,但據我所知不常用,而且半字、字和雙字這三個單位的大小是依賴變化的。
對於任意的系統平臺來說,一位就是1bit,一個位元組就是8bit,是永遠不會變化的。
半字、字和雙字在一些系統中大小是不定的,但是有一點是不變的:雙字的大小永遠的字的大小的兩倍,字的大小永遠是半字的兩倍。
記憶體位寬(硬體和邏輯兩個角度)
從硬體角度講:硬體記憶體的實現本身是有寬度的,也就是說有些記憶體條就是8位的,而有些就是16位的。那麼需要強調的是記憶體晶元之間是可以並聯的,通過並聯後即使8位的記憶體晶元也可以做出來16位或32位的硬體記憶體。
從邏輯角度講:記憶體位寬在邏輯上是任意的,甚至邏輯上存在記憶體位寬是24位的記憶體(但是實際上這種硬體是買不到的,也沒有實際意義)。從邏輯角度來講不管記憶體位寬是多少,我就直接操作即可,對我的操作不構成影響。但是因為你的操作不是純邏輯而是需要硬體去執行的,所以不能為所欲為,所以我們實際的很多操作都是受限於硬體的特性的。譬如24位的記憶體邏輯上和32位的記憶體沒有任何區別,但實際硬體都是32位的,都要按照32位硬體的特性和限制來幹活。