今天接着寫一個單片機程序,出現這個問題,我仔細查看每一句語句,發現邏輯上沒有錯誤,但就是出現這個問題,不能生成目標文件:
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: ?DT?USART_READWRITE
LENGTH: 007AH
*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: USARTREADWAVEDATA
MODULE: .\Timer_DAC.obj (TIMER_DAC)
ADDRESS: 0367H
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
SYMBOL: USARTREADWAVEDATA
SEGMENT: ?DT?USART_READWRITE
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
SYMBOL: USARTDATACOUNT
SEGMENT: ?DT?USART_READWRITE
Program Size: data=140.3 xdata=10 code=968
Target not created
上網查了下,找到了具體的原因及其相應的解決方案:
==============================================================
出現以上錯誤的原因主要是第一個原因,第一個原因導致了它下面所有錯誤,第一個原因是:
ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: ?DT?GMNS_3V4
LENGTH: 0014H
說明data空間已經不夠用,原因是你可能有好多函數,而函數內部的局部變量又沒有定義其空間,這種情況下,系統會將變量分配到你在Otions for Target 對話框里的設置的空間。如果你在下圖所示中的 Memory Model 里設置成 Small:variables in DATA,則DATA空間很快便用完,導致data空間不夠用。解決的辦法有兩種,
一是通過更改Memory Model設置,可以設置成pdata或xdata,以便有足夠大的空間,但這又帶來新的問題,程序運行速度減慢,而且code代碼也會加大,因為如果一個局部變量被存放在了xdata空間,匯編語言訪問xdata空間的代碼大小要比訪問data空間的代碼大,變量一旦很多,程序的代碼也會逐漸增大;
二是根據自己的要求設置變量的空間。將data變量改為xdata變量,所以這涉及到代碼優化的問題,遇到具體問題時,在運行速度和代碼大小之間取得適合自己的情況。

