前邊介紹微控制器資源的時候,我們提到過 stc89c52 共有 512 位元組的 ram,是用來儲存資料的,比如我們定義的變數都是直接存在 ram 裡邊的。但是微控制器的這 512 位元組的 ram在地位上並不都是平等的,而是分塊的,塊與塊之間在物理結構和用法上都是有區別的,因此我們在使用的時候,也要注意一些問題。
51 微控制器的 ram 分為兩個部分,一塊是片內 ram,一塊是片外 ram。標準 51 的片內 ram 位址從 0x00h~0x7f 共 128 個位元組,而現在我們用的 51 系列的微控制器都是帶擴充套件片內 ram 的,即 ram 是從 0x00~0xff 共 256 個位元組。片外 ram 最大可以擴充套件到 0x0000~0xffff 共 64k 位元組。這裡有一點大家要明白,片內 ram 和片外 ram 的位址不是連起來的,片內是從 0x00 開始,片外也是從 0x0000 開始的。還有一點,片內和片外這兩個名詞來自於早期的 51 微控制器,分別指在晶元內部和晶元外部,但現在幾乎所有的 51 微控制器晶元內部都是整合了片外 ram 的,而真正的晶元外擴充套件則很少用到了,雖然它還叫片外 ram,但實際上它現在也是在微控制器晶元內部的,我們的 stc89c52 就是這樣。以下是幾個 keil c51 語言中的關鍵字,代表了 ram 不同區域的劃分,大家先記一下。
data:片內 ram 從 0x00~0x7f
idata:片內 ram 從 0x00~0xff
pdata:片外 ram 從 0x00~0xff
xdata:片外 ram 從 0x0000~0xffff
大家可以看出來,data 是 idata 的一部分,pdata 是 xdata 的一部分。為什麼還這樣去區分呢?因為 ram 分塊的訪問方式主要和彙編指令有關,因此這塊內容大家了解一下即可,只需要記住如何訪問速度更快就行了。
我們定義乙個變數 a,可以這樣:unsigned char data a=0,而我們前邊定義變數時都沒有加 data 這個關鍵字,是因為在 keil 預設設定下,data 是可以省略的,即什麼都不加的時候變數就是定義到 data 區域中的。data 區域 ram 的訪問在組合語言中用的是直接定址,執行速度是最快的。如果你定義成 idata,不僅僅可以訪問 data 區域,還可以訪問 0x80h~0xff 的範圍,但加了 idata 關鍵字後,訪問的時候 51 微控制器用的是通用暫存器間接定址,速度較 data會慢一些,而且我們平時大多數情況下不太希望訪問到 0x80h~0xff,因為這塊通常用於中斷與函式呼叫的堆疊,所以在絕大多數情況下,我們使用內部 ram 的時候,只用 data 就可以了。
對於外部 ram 來說,使用 pdata 定義的變數存到了外部 ram 的 0x00~0xff 的位址範圍內,這塊位址的訪問和 idata 類似,都是用通用暫存器間接定址,而如果你定義成 xdata,可以訪問的範圍更廣泛,從 0 到 64k 的位址都可以訪問到,但是它需要使用 2 個位元組暫存器dptrh 和 dptrl 來進行間接定址,速度是最慢的。
我們的 stc89c52 共有 512 位元組的 ram,分為 256 位元組的片內 ram 和 256 位元組的片外ram。一般情況下,我們是使用 data 區域,data 不夠用了,我們就用 xdata,如果希望程式執行效率盡量高一點,就使用 pdata 關鍵字來定義。其它型號有更大的 ram 的 51 系列微控制器,如果要使用更大的 ram,就必須得用 xdata 來訪問了。
微控制器的ROM與RAM
rom read only memory 程式儲存器 在微控制器中用來儲存程式資料及常量資料或變數資料,凡是c檔案及h檔案中所有 全域性變數 區域性變數 const 限定符定義的常量資料 startup.asm檔案中的 類似arm中的bootloader或者x86中的bios,一些低端的微控制器是沒...
微控制器中ROM和RAM
在微控制器中用來儲存程式資料及常量資料或變數資料,凡是c檔案及h檔案中所有 全域性變數 區域性變數 const 限定符定義的常量資料 startup.asm檔案中的 類似arm中的bootloader或者x86中的bios,一些低端的微控制器是沒有這個的 通通都儲存在rom中。ram randoma...
51微控制器 RAM 資料儲存區
ram 是程式執行中存放隨機變數的資料空間。在 keil 中編寫程式,如果當前模式為small模式,如果總的變數大小未超過128b 則未初始化的變數的初值預設為 0.如果所有的變數超過微控制器small模式下的128b 大小,則必須對變數進行初始化,否則超過 ram大小變數的值是不確定的,在smal...