標籤:style blog http color 使用 資料
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GROUP_
LENGTH: 0020H
Program Size: data=134.3 xdata=226 code=3544
- 問題描述:Data資料區段的地址空間溢出,從描述可以知道編譯器儲存了三塊資訊: 134位元組的資料區段,226位元組的擴充資料區段和3544位元組的程式碼片段。
當前我所使用的晶片是STC的STC15W408AS。
- 問題原因:查詢STC15W408AS的資料手冊不難知道,其儲存空間包括256位元組的idata和256位元組的xdata(內部擴充,非外部擴充)。4k以上的flash用以儲存代碼。
而256byte的idata又可以劃分為:1.低128byte的idata為傳統的8051ram區
2.高128byte的idata為8052擴充的ram區
低128byte又可劃分為工作寄存器區,可位定址區,使用者ram區和堆棧區。
Keil C編譯器一般情況下優先將變數儲存在位址範圍為30H-7FH的使用者ram區。但是當工程中主函數在進行函數調用時,會將當前所使用
的變數暫存到堆棧區以在函數返回的時候正常恢複程式的上下文。如果需要暫存的資料量太大,會導致30H到7FH段的儲存空間不夠用。
- 解決方案:C51編譯器支援Linker Location Controls來實現絕對儲存位置的指定,這樣可以人為指定變數的儲存位置。編譯器根據關鍵字將變數劃分到指定的
儲存位置。方法見MDK的help手冊。
struct alarm_st { unsigned int alarm_number; unsigned char enable flag; unsigned int time_delay; unsigned char status; };xdata struct alarm_st alarm_control;
xdata指定該變數儲存在內部擴充ram區,idata指定該變數儲存在內部ram的高128byte區。這樣可以保證堆棧區有足夠的空間來實現程式內容相關的切換。