對于函數(shù)的自變量、局部變量和全局變量聲明如果沒有指定內(nèi)存類型,則內(nèi)存模式將成為內(nèi)定的內(nèi)存類型。如果
指定了內(nèi)存類型的變量,則不理會內(nèi)存模式,完全有所指定的內(nèi)存類型為主。
SMALL模式:小模式
所有的變量,局部變量或全局變量都指定存在內(nèi)部RAM的 0—0x7F 的地址范圍,此模式如同將所有的
變量都定義成 data 類型的內(nèi)存。
COMPACT模式:壓縮模式
所有的變量將被指定到其地址范圍為 0—0xFF 的外部數(shù)據(jù)存儲器,此模式如同將所有的變量都定義
成 pdata 類型的內(nèi)存。
LARGE模式:大模式
所有的變量將被指定到其地址范圍為 0—0xFFFF 的外部數(shù)據(jù)存儲器,此模式如同將所有的變量都定義
成 xdata 類型的內(nèi)存。
Re: Bank Switch無法編譯後的訊息
[QUOTE]原發(fā)表者是 Vic
1.*** WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?SD_INITIALIZE?DRVSD
CALLER1: ?C_C51STARTUP
CALLER2: ?PR?TIMER0_ISR?INTERRUPT
這表示SD_INITIALIZE這個函式被C_C51STARTUP和中斷服務(wù)函式
TIMER0_ISR呼叫到。
這樣會有什麼問題?
若是SD_INITIALIZE被呼叫時,TIMER0_ISR中斷發(fā)生而再呼叫
SD_INITIALIZE就會有reentrant(重入)的問題。
Keil C51 一般的函式的區(qū)域變數(shù)是放在同一個地方的,所以不能被
重入。如果程式保證這樣的情況不會發(fā)生(例如呼叫之前先disable
interrupt)可以不理會這個警告。
2.*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: XDATA
SEGMENT: ?XD?DRVMS
LENGTH: 0515H
XDATA 使用過量囉!減減肥吧!
3.*** WARNING L17: INTERRUPT FUNCTION IN BANKS NOT ALLOWED
SYMBOL: INT0_ISR
SPACE: BANK0
不可以把中斷函式放在 bank area
4.*** WARNING L4: DATA SPACE MEMORY OVERLAP
FROM: 003FH
TO: 0050H
某些data區(qū)被兩個器共用
5.*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
SYMBOL: MEM_POOL
SEGMENT: ?XD?MTM808
6.*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: SYSTEM_MODE
MODULE: .debugmtm808.obj (MTM808)
ADDRESS: 3A7CH
7.*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: ADPCM_STATE
MODULE: .debugSystemManager.obj (SYSTEMMANAGER)
ADDRESS: 358FH
參照到一個無法使用的記憶段(可為前面之over fllow錯誤引起)
13.*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: DATEI
MODULE: .mtm809.LIB (CMDIF)
找不到external symbol的實體,所以無法連結(jié)