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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 51單片機RAM的使用

          51單片機RAM的使用

          作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
          今天還是一個人加班,梳理一下之前一直疑惑的幾個小問題吧。以一款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è)置
          好,到此為止,大家應該明白了,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)閉
          看屁屁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); })();