色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

          51單片機RAM的使用

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


          關鍵詞: 51單片機RA

          評論


          技術專區(qū)

          關閉