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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Keil Memory Model的選擇問題

          Keil Memory Model的選擇問題

          作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          Memory Model:用鼠標(biāo)點(diǎn)擊Memory Model的下拉箭頭,會(huì)有3個(gè)選項(xiàng):

             Small:變量存儲(chǔ)在內(nèi)部RAM里;

          本文引用地址:http://www.ex-cimer.com/article/201611/316953.htm

             Compact:變量存儲(chǔ)在外部RAM里,使用頁8位間接尋址;

             Large:變量存儲(chǔ)在外部RAM里,使用16位間接尋址;

            我們一般使用Small來存儲(chǔ)變量,就是說單片機(jī)優(yōu)先把變量存儲(chǔ)在內(nèi)部RAM里,如果內(nèi)部RAM不夠了,才會(huì)存到外部去。

          Compact的方式要自己通過程序來指定頁的高位地址,編程比較復(fù)雜,如果外部RAM很少,只有256個(gè)字節(jié),那么對(duì)該256個(gè)字節(jié)的讀取就比較快,用MOVX @Ri,A 或MOVX A,@Ri指令。如果超過256字節(jié),那么要不斷地進(jìn)行切換的話,就比較麻煩。Compact模式適用于比較少的外部RAM的情況。

          Large模式,是指變量會(huì)優(yōu)先分配到外部RAM里,用MOVX A,@DPTR或MOVX @DPTR,A來讀取。

          要注意的是,3種存儲(chǔ)方式都支持內(nèi)部256字節(jié)和外部64k字節(jié)的RAM。區(qū)別是變量的優(yōu)先(或默認(rèn))存儲(chǔ)在哪里的區(qū)別。除非你不想把變量存儲(chǔ)在內(nèi)部RAM,才使用后面的Compact,Large模式。因?yàn)樽兞看鎯?chǔ)在內(nèi)部RAM里,運(yùn)算速度比存儲(chǔ)在外部RAM要快的多,大部分的應(yīng)用都是選擇Small的模式。

          使用Small的模式:也不是說變量就不可以存儲(chǔ)在外部,一樣可以存儲(chǔ)在外部,只是你要指定,比如:

          unsigned char xdata a; 那么變量a就存儲(chǔ)在外部的RAM。

          unsigned char a; 變量存儲(chǔ)在內(nèi)部RAM。

          使用Large的模式:

          unsigned char xdata a; 那么變量a就存儲(chǔ)在外部的RAM。

          unsigned char a;變量存儲(chǔ)在外部RAM。

            這就是區(qū)別,就是說這幾個(gè)選項(xiàng)只是影響沒有特別指定變量的存儲(chǔ)空間的時(shí)候,默認(rèn)存儲(chǔ)在哪里,比如上面的變量定義unsigned char a。


          KEIL編譯出錯(cuò)和Memory Model選擇
          在輸出設(shè)置里面target--->memorymodel選擇如圖所示
          Build target Target 1
          compiling main.c...
          linking...
          *** ERROR L107: ADDRESS SPACE OVERFLOW
          SPACE: DATA
          SEGMENT: ?DT?MAIN
          LENGTH: 0024H
          *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
          SYMBOL: RECEIVEDFLAG
          SEGMENT: ?DT?MAIN
          *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
          SYMBOL: DISPBUF
          SEGMENT: ?DT?MAIN
          *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
          SYMBOL: CHULI
          SEGMENT: ?DT?MAIN
          *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
          SYMBOL: UCRECEIVEDINDEX
          SEGMENT: ?DT?MAIN
          Program Size: data=106.1 xdata=0 code=4870
          Target not created
          CPU是STC89C52,編譯出錯(cuò)怎么解決。
          還有我應(yīng)該寫好程序后應(yīng)該怎么樣處理Memory Model這個(gè)選項(xiàng)卡?
          因?yàn)槲以赟mall模式下面編譯成功了以后,我在里面加了一些程序,空間不夠了提示,我就把它改為了PDATA,然后編譯通過,但是程序就出錯(cuò)了,一直在主函數(shù)的while(flag)里面循環(huán),即使我沒有給flag設(shè)置成1,他照樣能進(jìn)去,而且還循環(huán)了??ㄔ谠诶锩媪?。
          我不明白我應(yīng)該怎么樣解決這個(gè)問題,請(qǐng)教!
          改成XDATA,外部存儲(chǔ)區(qū)。
          ERROR L107: ADDRESS SPACE OVERFLOW
          是地址空間溢出
          PDATA也沒多少,因?yàn)樘厥夤δ馨雲(yún)^(qū)里很多是不能占用的。
          沒必要的不要設(shè)置成靜態(tài)變量
          追問改成XDATA是能編譯通過,不過我聽別人說一般這個(gè)都是默認(rèn)的么,改這個(gè)對(duì)CPU有沒有要求啊,
          回答 外部存儲(chǔ)區(qū),AT的片子得加存儲(chǔ)片子,STC的直接做到芯片里了??茨阗I的什么芯片。
          KEIL 沒破解有2K限制,你程序超過2048了,看是不是這個(gè)原因。
          追問你是指code=4870吧?這個(gè)沒有問題。



          關(guān)鍵詞: KeilMemoryMode

          評(píng)論


          技術(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); })();