新聞中心

51單片機RAM的使用

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


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

評論


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

關(guān)閉