KEIL C51中的data、idata、xdata、code詳解
51微控制器採用哈佛結構。記憶體空間編址有重疊。可以在不同總線上定義不同的變數。在KEIL C51中定義了xdata、idata、xdata、code幾種域修飾符。這些修飾符決定了變數訪問方式。
data:固定指前面0x00-0x7F的128個RAM,可以用acc直接讀寫,速度最快,生成的程式碼也最小。
idata:固定指前面0x00-0xFF的256個RAM,其中前128和data的128完全相同,只是訪問的方式不同。
xdata:外部擴充套件RAM。
code:ROM。
指標型別和儲存區的關係
對變數進行宣告時可以指定變數的儲存型別如:
uchar data x和data uchar x相等,都是在RAM區分配一個位元組的空間。
同樣對於指標變數的宣告,因涉及到指標變數本身的儲存位置和指標所指向的儲存位置不同而進行相應的儲存區型別關鍵字的宣告。如:
uchar xdata * data pstr;
是指在RAM區分配一個指標變數(“*”號後的關鍵字的作用),而且這個指標本身指向xdata區(“*”前xdata關鍵字的作用)
uchar xdata tmp[10]; //在外RAM區開闢10個位元組的記憶體空間
第1種情況:
uchar data * data pstr;
pstr = tmp;
這種情況不能正確的訪問到tmp空間,本來訪問外RAM需要2Byte來定址64K空間,但因為使用data關鍵字(“*”號前的那個),keilC51編譯環境就把他編譯成指向內RAM的指標變量了。
第2種情況:
uchar xdata * data pstr;
pstr = tmp;
這種使用方法是正確的,是指在內RAM分配一個指標變數(“*”號後的data關鍵字的作用),而且這個指標本身指向xdata區(“*”前xdata關鍵字的作用)。這種情況是效率最高的方法。
第3種情況:
uchar xdata * data pstr;
pstr = tmp;
這種情況是對的,但效率不如第2種情況。
第4種情況:
uchar data * xdata pstr;
pstr = tmp;
這種情況也是錯誤的。