新聞中心

51單片機(jī)RAM的使用

作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
今天還是一個(gè)人加班,梳理一下之前一直疑惑的幾個(gè)小問題吧。以一款51內(nèi)核的STC89C52單片機(jī)作為說明,STC89C52具有8K字節(jié)Flash,512字節(jié)RAM,看門狗定時(shí)器等,其他資源不在今天討論主題之內(nèi),不再贅述。
先說說自己之前的誤區(qū),以前提到片內(nèi)RAM和片外RAM的時(shí)候,總是以為片內(nèi)RAM就是52單片機(jī)512字節(jié)的RAM,片外RAM的擴(kuò)展是很多經(jīng)典單片機(jī)教材里都講述的,P0口是地址低八位兼數(shù)據(jù)總線,P2是地址高八位,當(dāng)擴(kuò)展RAM的時(shí)候,WR,RD,ALE,P0,P2怎么怎么接,巴拉巴拉。。。但在此處,512字節(jié)的RAM并不是我原來認(rèn)為的那樣全部是內(nèi)部RAM,事實(shí)上,它的前256Byte是真正的片內(nèi)RAM,而后256Byte是集成的片外RAM。注意,它倆的訪問方式是有區(qū)別的。下面進(jìn)行說明:
typedef unsigned char uchar;
typedef unsigned int uint;
uchar i = 0;
uint j = 0;
uchar code table[] = {.....};
當(dāng)時(shí)定義數(shù)據(jù)類型的時(shí)候,從來沒想到過idata,bdata,pdata,xdata這些關(guān)鍵字是干什么的。
圖1.keil編譯結(jié)果
這也就導(dǎo)致了每次編譯完,總是會(huì)出現(xiàn) xdata = 0 的字樣,當(dāng)時(shí)自己竟然沒有深究它們是干什么的,更別說去看M51文件了。
另外,在keil的option->target的選項(xiàng)中,有一項(xiàng)Memory Model中有如下圖2的三種模式,也是自己沒注意過的。當(dāng)然,這里也是與今天講的主題相關(guān)的。
圖2.keil編譯器設(shè)置
好,到此為止,大家應(yīng)該明白了,idata,bdata,data,xdata,pdata這些關(guān)鍵字 以及編譯器的相關(guān)選項(xiàng)都是與變量在內(nèi)存中的分配有關(guān)系的。
1.片內(nèi)256字節(jié)RAM已經(jīng)足夠容納我們定義的所有變量,
一、當(dāng)Memory Model選為small模式,這時(shí),定義變量時(shí),加不加idata,data這兩個(gè)關(guān)鍵字,都不影響變量存儲(chǔ)的位置(均存放在前256字節(jié)中)。但若這樣使用:
uchar xdata i = 0;
uchar pdata i = 0;
那么這個(gè) i 便存放在了集成片外RAM中,xdata pdata存在讀取速度上的差別。
二、當(dāng)Memory Model選為compact或large模式, 這時(shí)定義變量時(shí),如果不加關(guān)鍵詞,即
uchar i = 0;
uint j = 0;
那么,i 與 j 是存放在集成片外RAM中的。此時(shí),如果要將變量搬移到片內(nèi)RAM,則要加關(guān)鍵字:
uchar idata i = 0;
uint idata j = 0;
或者
uchar data i = 0;
uint data j = 0; //bdata支持位操作同時(shí)也將變量放在片內(nèi)RAM
2.片內(nèi)256字節(jié)RAM不夠用時(shí),一般我們就直接使用compact 或 large 內(nèi)存模式了。
此時(shí),我們首先使用 bdata idata data這些關(guān)鍵字,將大部分變量放在片內(nèi)RAM區(qū),剩下的變量無論是否使用xdata pdata關(guān)鍵字,他們都會(huì)放入集成片外256字節(jié)的RAM中。
那讀者可能要問了,片內(nèi)不夠用了,如果我還是將Memory Model定義為small模式呢? 是啊,這時(shí)會(huì)出現(xiàn)什么情況呢。這時(shí),如果合理使用bdata idata data xdata pdata這些關(guān)鍵字,也是可以按你的想法將變量分別放入片內(nèi)RAM 和集成片外RAM的。 有一個(gè)問題,當(dāng)前256字節(jié)夠用 且選擇small模式時(shí),若沒對(duì)定義的變量進(jìn)行初始化,則他們默認(rèn)為零。但在這里,如果還不進(jìn)行初始化,那么變量的值是隨機(jī)的,所以必須初始化。
最后,如果我有理解不對(duì)的地方,歡迎大家對(duì)以上提到的內(nèi)容進(jìn)行批評(píng)指正,大家交流中共同進(jìn)步。


關(guān)鍵詞: 51單片機(jī)RA

評(píng)論


技術(shù)專區(qū)

關(guān)閉