新聞中心

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

        Keil Memory Model的選擇問題

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

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

        本文引用地址:http://www.104case.com/article/201611/316953.htm

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

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

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

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

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

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

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

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

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

        使用Large的模式:

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

        unsigned char a;變量存儲在外部RAM。

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


        KEIL編譯出錯和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,編譯出錯怎么解決。
        還有我應(yīng)該寫好程序后應(yīng)該怎么樣處理Memory Model這個選項卡?
        因?yàn)槲以赟mall模式下面編譯成功了以后,我在里面加了一些程序,空間不夠了提示,我就把它改為了PDATA,然后編譯通過,但是程序就出錯了,一直在主函數(shù)的while(flag)里面循環(huán),即使我沒有給flag設(shè)置成1,他照樣能進(jìn)去,而且還循環(huán)了。卡在在里面了。
        我不明白我應(yīng)該怎么樣解決這個問題,請教!
        改成XDATA,外部存儲區(qū)。
        ERROR L107: ADDRESS SPACE OVERFLOW
        是地址空間溢出
        PDATA也沒多少,因?yàn)樘厥夤δ馨雲(yún)^(qū)里很多是不能占用的。
        沒必要的不要設(shè)置成靜態(tài)變量
        追問改成XDATA是能編譯通過,不過我聽別人說一般這個都是默認(rèn)的么,改這個對CPU有沒有要求啊,
        回答 外部存儲區(qū),AT的片子得加存儲片子,STC的直接做到芯片里了。看你買的什么芯片。
        KEIL 沒破解有2K限制,你程序超過2048了,看是不是這個原因。
        追問你是指code=4870吧?這個沒有問題。



        關(guān)鍵詞: KeilMemoryMode

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 沁源县| 彭泽县| 息烽县| 鄂托克前旗| 保山市| 化州市| 沙洋县| 扶余县| 吴川市| 沙田区| 西平县| 玛多县| 文化| 依兰县| 新野县| 炎陵县| 教育| 方城县| 望奎县| 西峡县| 蒲城县| 海南省| 赤水市| 会同县| 界首市| 章丘市| 克拉玛依市| 通许县| 嘉定区| 大荔县| 枣庄市| 广南县| 佛学| 桃源县| 大关县| 米泉市| 韶山市| 井研县| 温州市| 昆山市| 金乡县|