一般的編譯器將函數中的區域變數動態配置在 stack,等函數結束空間就釋放出來。因為51內部RAM很少,所以編譯器為了折衷變數該配置成固定位址(靜態)還是防止佔用空間很久(動態),採用了data overlaying 技術
data overlaying 是指沒有呼叫關係的函數,它們的區域變數區可以重疊在一起(共用一塊記憶體)。Keil C51
會分析程式中函數間呼叫的關係,產生一個呼叫樹。它就根據這個呼叫樹來決定那些函數的區域變數區可以 overlaying
在一起。一種情況是是編譯器發現某一個函數(不是 main)沒有被別的函數呼叫,這會造成編譯器的困惑。一個正常的程式,除了 main
之外,除非是垃圾程式碼(沒呼叫但沒有刪除),否則所有的函數應該是至少會被一個其它函數呼叫的。
編譯器在安全至上的原則下,會認定它的分析無法正確的辨識這個函數呼叫關係,所以對這個函數的區域變數就會獨立配置,不會重疊配置。這樣有沒有問題?邏輯上當然不會有問題,但沒
overlaying 就是會浪費RAM,而且也會一直產生 *** WARNING L16: UNCALLED SEGMENT, IGNORED
FOR OVERLAY PROCESS 的警告。
經由以上解釋,您需要看看您的Code各函數的呼叫關係,如果有無用的函數,comment掉再進行編譯即可