51單片機RAM的使用
先說(shuō)說(shuō)自己之前的誤區,以前提到片內RAM和片外RAM的時(shí)候,總是以為片內RAM就是52單片機512字節的RAM,片外RAM的擴展是很多經(jīng)典單片機教材里都講述的,P0口是地址低八位兼數據總線(xiàn),P2是地址高八位,當擴展RAM的時(shí)候,WR,RD,ALE,P0,P2怎么怎么接,巴拉巴拉。。。但在此處,512字節的RAM并不是我原來(lái)認為的那樣全部是內部RAM,事實(shí)上,它的前256Byte是真正的片內RAM,而后256Byte是集成的片外RAM。注意,它倆的訪(fǎng)問(wèn)方式是有區別的。下面進(jìn)行說(shuō)明:
typedef unsigned char uchar;
typedef unsigned int uint;
uchar i = 0;
uint j = 0;
uchar code table[] = {.....};
當時(shí)定義數據類(lèi)型的時(shí)候,從來(lái)沒(méi)想到過(guò)idata,bdata,pdata,xdata這些關(guān)鍵字是干什么的。

這也就導致了每次編譯完,總是會(huì )出現 xdata = 0 的字樣,當時(shí)自己竟然沒(méi)有深究它們是干什么的,更別說(shuō)去看M51文件了。
另外,在keil的option->target的選項中,有一項Memory Model中有如下圖2的三種模式,也是自己沒(méi)注意過(guò)的。當然,這里也是與今天講的主題相關(guān)的。

好,到此為止,大家應該明白了,idata,bdata,data,xdata,pdata這些關(guān)鍵字 以及編譯器的相關(guān)選項都是與變量在內存中的分配有關(guān)系的。
1.片內256字節RAM已經(jīng)足夠容納我們定義的所有變量,
一、當Memory Model選為small模式,這時(shí),定義變量時(shí),加不加idata,data這兩個(gè)關(guān)鍵字,都不影響變量存儲的位置(均存放在前256字節中)。但若這樣使用:
uchar xdata i = 0;
或
uchar pdata i = 0;
那么這個(gè) i 便存放在了集成片外RAM中,xdata pdata存在讀取速度上的差別。
二、當Memory Model選為compact或large模式, 這時(shí)定義變量時(shí),如果不加關(guān)鍵詞,即
uchar i = 0;
uint j = 0;
那么,i 與 j 是存放在集成片外RAM中的。此時(shí),如果要將變量搬移到片內RAM,則要加關(guān)鍵字:
uchar idata i = 0;
uint idata j = 0;
或者
uchar data i = 0;
uint data j = 0; //bdata支持位操作同時(shí)也將變量放在片內RAM
2.片內256字節RAM不夠用時(shí),一般我們就直接使用compact 或 large 內存模式了。
此時(shí),我們首先使用 bdata idata data這些關(guān)鍵字,將大部分變量放在片內RAM區,剩下的變量無(wú)論是否使用xdata pdata關(guān)鍵字,他們都會(huì )放入集成片外256字節的RAM中。
那讀者可能要問(wèn)了,片內不夠用了,如果我還是將Memory Model定義為small模式呢? 是啊,這時(shí)會(huì )出現什么情況呢。這時(shí),如果合理使用bdata idata data xdata pdata這些關(guān)鍵字,也是可以按你的想法將變量分別放入片內RAM 和集成片外RAM的。 有一個(gè)問(wèn)題,當前256字節夠用 且選擇small模式時(shí),若沒(méi)對定義的變量進(jìn)行初始化,則他們默認為零。但在這里,如果還不進(jìn)行初始化,那么變量的值是隨機的,所以必須初始化。
最后,如果我有理解不對的地方,歡迎大家對以上提到的內容進(jìn)行批評指正,大家交流中共同進(jìn)步。
評論