痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 4928|回復: 11

求助: L107 ADDRESS SPACE OVERFLOW 89S52

[複製鏈接]
發表於 2011-7-6 16:07:30 | 顯示全部樓層 |閱讀模式
各位先進們:
       最近改寫程式進階定時器,我想要把定時器作5步驟的設定,每一步驟 最多99分 繼電器可以ON/OFF 控制,用 1602顯示,編譯的時候 Keil C51 卻顯示"L107 ADDRESS SPACE OVERFLOW"
記憶體好像不足的樣子,我試著把變數內容減少是可以編譯完成,但是,我的需求就不完整了!!請問 有簡單的解決方法嗎? 還是 Keil C51的設定上沒有設好? 感謝!!
發表於 2011-7-6 17:40:45 | 顯示全部樓層
請貼一下程式, 大家比較好一起找問題.
發表於 2011-7-6 19:38:42 | 顯示全部樓層
變數過多了,
因為標準的S51或S52只有256BYTE的RAM
所以一但變數過多時,那麼C的Compiler便會跳出來這問題
解決的辦法只有重新檢視你的變數,增減或作暫存模式來作緩衝
或是換別的51系列來用
在使用組合語言時這種問題一開始就會發現
所以使用組語這類的問題很少人發生
但用C時,問題便會跑出來
尤其當你為方便把變數弄的很多時一開始都不會去想到這問題的
或許使用某一個特定變數作暫存
或是電路上如有掛上EEPROM時
去存取EEPROM當成外掛的RAM使用
也是另一種辦法.剩下的便是個人去作變化了
 樓主| 發表於 2011-7-6 20:33:11 | 顯示全部樓層
回復 legion 的帖子

LEGION大:
   您的意思是不是加掛2401這鼕鼕來解決? 至於某一個特定變數作暫存這我就沒概念了, 我剛剛想了一想 我為了把LCM 顯示方便全局變數就用掉了 32個 (char DisplayWord[16];//顯示第一行工作的狀況 char Displaychar[16];// 顯示第二行工作的狀況) 還有char StepNo;// step no.total 5 int 10min[5];//存放輸入值經過STORE確認的10分 int min[5]; //存放輸入值經過STORE確認的 分 char ONF[5]; //存放輸入值經過STORE確認的on/off 動作 就用到 16個記憶 已經48個...C寫程式好用.由奢入儉難!!!

 樓主| 發表於 2011-7-6 20:36:50 | 顯示全部樓層
回復 stevencli 的帖子

STEVENCLI大:
   我不會貼 WORD 檔案上去,上次請 LEGION大幫忙貼上去的,好像要用 壓縮檔 不知道如何壓縮.... 我可以把檔案傳給以看...
 樓主| 發表於 2011-7-6 22:41:01 | 顯示全部樓層
回復 legion 的帖子

LEGION大:
    剛剛翻了C++的書發現 一個int 變數 佔用4byte , short int 佔用 2個byte 還有我打算把 "int 10min[5]; int min[5]; ONF[5];濃縮成為 unsighed char STEPALL[5] 這樣應該可以省下 40byte... 先節省再說...
發表於 2011-7-7 23:12:27 | 顯示全部樓層
89s52的RAM有256個,可用的有2佰多個,非常夠用了,先要了解變數的屬性,還有變數宣告時除非必要時,不要將它放在外面(global變數),要放在函數裡面 {  }, 因為當程式離開函數後,所有函數內的變數都會被釋放掉!

放在函數外的變數(global變數=>永遠佔用RAM),是用來給所有函數內/外皆可用,通常用的不多,因此除非必要,否則不要亂用.
發表於 2011-7-8 00:08:24 | 顯示全部樓層
使用C的麻煩處便是在有限資源中不好去控制你的MCU資源上限
並非使用個外掛2401就能解決問題
省掉原始的一些陣列值
把2401劃定一些區塊,然後寫個副程式,
模擬把2401當成RAM來使用,
51的RAM只有256BYTE,扣除掉暫存器,STACK用的
實際能用的也不過從30FH-7FH這麼多空間
一般都會從40FH-7FH,STACK從30FH留給他用
真的不行時就換棵51,也有1KRAM和64KFLASH的MCU
但只要不先控制好,換再大可能也是沒用的

 樓主| 發表於 2011-7-8 13:46:39 | 顯示全部樓層
回復 yesjarmail 的帖子

感謝YESJARMAIL大的回覆,我發現我的LOCAL變數很少,大部分都是GLOBAL變數 23個... 可能是初學吧! 多多練習多多注意希望會改善...
 樓主| 發表於 2011-7-8 13:51:33 | 顯示全部樓層
回復 legion 的帖子

LEGION大:
       感謝指導!! 目前應該可以暫時解決這一問題,有壓力有成長!! 您建議的2401因為我還沒用過,就當作下下一個學習目標吧!(下一個目標把 I2C 的溫度搞定!)  http://blog.yam.com/antlums23/article/39453899 這是上次的 1602 計時器...
發表於 2011-7-8 21:08:02 | 顯示全部樓層
回復 antlu 的帖子

用93系列或24系列其實都沒差
主要的是如何在有限資源下去使用額外的資源來使用
多作幾次多玩幾次就會比較容易上手的
 樓主| 發表於 2011-7-8 23:10:12 | 顯示全部樓層
回復 legion 的帖子

LEGION大:
  我發現 global 變數好用的地方是不需要考慮 副程式間的傳遞問題,好像要把global 變數減少,就需要多使用副程式的變數傳遞(要多思考),難怪有人說,程式語言訓練邏輯思考...  還有現在24C02大部分都是蜈蚣腳的,好像不容易買到傳統 DIL的包裝...
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-5-7 02:30 PM , Processed in 0.437831 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.