新聞中心

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://butianyuan.cn/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)閉