<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
          今天還是一個(gè)人加班,梳理一下之前一直疑惑的幾個(gè)小問(wèn)題吧。以一款51內(nèi)核的STC89C52單片機(jī)作為說(shuō)明,STC89C52具有8K字節(jié)Flash,512字節(jié)RAM,看門(mén)狗定時(shí)器等,其他資源不在今天討論主題之內(nèi),不再贅述。
          先說(shuō)說(shuō)自己之前的誤區(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并不是我原來(lái)認(rèn)為的那樣全部是內(nèi)部RAM,事實(shí)上,它的前256Byte是真正的片內(nèi)RAM,而后256Byte是集成的片外RAM。注意,它倆的訪問(wèn)方式是有區(qū)別的。下面進(jìn)行說(shuō)明:
          typedef unsigned char uchar;
          typedef unsigned int uint;
          uchar i = 0;
          uint j = 0;
          uchar code table[] = {.....};
          當(dāng)時(shí)定義數(shù)據(jù)類(lèi)型的時(shí)候,從來(lái)沒(méi)想到過(guò)idata,bdata,pdata,xdata這些關(guān)鍵字是干什么的。
          圖1.keil編譯結(jié)果
          這也就導(dǎo)致了每次編譯完,總是會(huì)出現(xiàn) xdata = 0 的字樣,當(dāng)時(shí)自己竟然沒(méi)有深究它們是干什么的,更別說(shuō)去看M51文件了。
          另外,在keil的option->target的選項(xiàng)中,有一項(xiàng)Memory Model中有如下圖2的三種模式,也是自己沒(méi)注意過(guò)的。當(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ū),剩下的變量無(wú)論是否使用xdata pdata關(guān)鍵字,他們都會(huì)放入集成片外256字節(jié)的RAM中。
          那讀者可能要問(wèn)了,片內(nèi)不夠用了,如果我還是將Memory Model定義為small模式呢? 是啊,這時(shí)會(huì)出現(xiàn)什么情況呢。這時(shí),如果合理使用bdata idata data xdata pdata這些關(guān)鍵字,也是可以按你的想法將變量分別放入片內(nèi)RAM 和集成片外RAM的。 有一個(gè)問(wèn)題,當(dāng)前256字節(jié)夠用 且選擇small模式時(shí),若沒(méi)對(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ù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();