Keil 【警告+錯誤】提示彙總

【錯誤】

 

1 ***ERROR 107:ADDESS SPACE OVERFLOW

SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H

說明 data 存儲空間的地址範圍爲 0~0x7F,當公用變量數目和函數裏的局部變量 如果存儲模式設爲SMALL 則局部變量先使用工作寄存器R2~R7作暫存 當存儲器不夠用時則會以 data型別的空間作暫存的個數超過 0x7f 時就會出現地址不夠的現象
解決方法:將以 data 型別定義的公共變量修改爲 idata型別的定義

 2 Error:318:can’t open file ‘beep.h’

  Compling :C:\8051\MANN.C
  Error:318:can’t open file ‘beep.h’
  說明 在編譯 C:\8051\MANN.C 程序過程中 由於 main.c 用了指令#include “beep.h”,但卻找不到所致
  解決方法: 編寫一個 beep.h 的包含檔並存入到 c:\8051 的工作目錄中

3 Error 237:’LedOn’:function already has a body

  Compling:C:\8051\LED.C
  Error 237:’LedOn’:function already has a body
  說明 LedOn( )函數名稱重複定義 即有兩個以上一樣的函數名稱
  解決方法: 修正其中的一個函數名稱 使得函數名稱都是獨立的

 

【警告】

 

1 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL      

 ——所使用變量找不到,一般是未將文件添加到項目中

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL       

——所引用函數找不到,一般是未將文件添加到項目中

說明程序中有調用某個函數但未將該函數的源文件加入到工程檔Prj 中編譯和連接
 解決方法:將文件添加到項目中

2 ***Warning 280:’i’:unreferenced local variable

說明 局部變量 i 在函數中未作任何的存取操作
解決方法:消除函數中 i變量的宣告


3 Warning 206:’Fun’:missing function-prototype


說明 Fun()函數未作聲明, 或未作外部聲明, 所以無法給其他函數調用
解決方法: 將敘述void Music3(void)寫在程序的最前端作聲明


4 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS

SEGMENT: ?PR?_DELAYNMS?DELAY
說明 DelayX1ms( )函數未被其它函數調用 也會佔用程序記憶體空間
解決方法: 去掉 DelayNms( )函數, 或利用條件編譯#if …..#endif,可保留該函數並不編譯


5 ***WARNING L15: MULTIPLE CALL TO SEGMENT


SEGMENT: ?PR?_SPI_SEND_WORD?D_SPI
CALLER1: ?PR?VSYNC_INTERRUPT?MAIN
CALLER2: ?C_C51STARTUP

        該警告表示連接器發現有一個函數可能會被主函數和一箇中斷服務程序(或者調用中斷服務程序的函數)同時調用,或者同時被多箇中斷服務程序調用。
出現這種問題的原因之一是這個函數是不可重入性函數,當該函數運行時它可能會被一箇中斷打斷,從而使得結果發生變化並可能會引起一些變量形式的衝突(即引起函數內一些數據的丟失,可重入性函數在任何時候都可以被ISR 打斷,一段時間後又可以運行,但是相應數據不會丟失)。
        原因之二是用於局部變量和變量(暫且這樣翻譯,arguments,[自變量,變元一數值,用於確定程序或子程序的值])的內存區被其他函數的內存區所覆蓋,如果該函數被中斷,則它的內存區就會被使用,這將導致其他函數的內存衝突。
        例如,第一個警告中函數WRITE_GMVLX1_REG 在D_GMVLX1.C 或者D_GMVLX1.A51 被定義,它被一箇中斷服務程序或者一個調用了中斷服務程序的函數調用了,調用它的函數是VSYNC_INTERRUPT,在MAIN.C 中。
解決方法:
        如果你確定兩個函數決不會在同一時間執行(該函數被主程序調用並且中斷被禁止),並且該函數不佔用內存(假設只使用寄存器),則你可以完全忽略這種警告。
如果該函數佔用了內存,則應該使用連接器(linker)OVERLAY 指令將函數從覆蓋分析(overlay analysis)中除去,例如:
OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
        上面的指令防止了該函數使用的內存區被其他函數覆蓋。如果該函數中調用了其他函數,而這些被調用在程序中其他地方也被調用,你可能會需要也將這些函數排除在覆蓋分析(overlay analysis)之外。這種OVERLAY 指令能使編譯器除去上述警告信息。
        如果函數可以在其執行時被調用,則情況會變得更復雜一些。這時可以採用以下幾種方法:
1.主程序調用該函數時禁止中斷,可以在該函數被調用時用#pragma disable 語句來實現禁止中斷的目的。必須使用OVERLAY 指令將該函數從覆蓋分析中除去。
2.複製兩份該函數的代碼,一份到主程序中,另一份複製到中斷服務程序中。
3.將該函數設爲重入型。例如:
              void myfunc(void) reentrant {...……}
        這種設置將會產生一個可重入堆棧,該堆棧被被用於存儲函數值和局部變量,用這種方法時重入堆棧必須在STARTUP.A51 文件中配置。
        這種方法消耗更多的RAM 並會降低重入函數的執行速度。

6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP

FROM : 0025H
TO:   0025H
說明 外部資料ROM 的 0025H重複定義地址
解決方法: 外部資料 ROM的定義如下
Pdata unsigned char XFR_ADC _at_0x25 其中 XFR_ADC 變量的名稱爲0x25,請檢查是否有其它的變量名稱也是定義在 0x25 處並修正它

 

【C編譯器錯誤信息中文翻譯】

 

Ambiguous operators need parentheses      不明確的運算需要用括號括起
Ambiguous symbol ``xxx``    不明確的符號
Argument list syntax error      參數表語法錯誤
Array bounds missing      丟失數組界限符
Array size toolarge      數組尺寸太大
Bad character in paramenters      參數中有不適當的字符
Bad file name format in include directive      包含命令中文件名格式不正確
Bad ifdef directive synatax      編譯預處理ifdef 有語法錯
Bad undef directive syntax      編譯預處理undef 有語法錯
Bit field too large      位字段太長
Call of non-function      調用未定義的函數
Call to function with no prototype      調用函數時沒有函數的說明
Cannot modify a const object      不允許修改常量對象
Case outside of switch      漏掉了case 語句
Case syntax error      Case 語法錯誤
Code has no effect      代碼不可述不可能執行到
Compound statement missing{      分程序漏掉"{"
Conflicting type modifiers      不明確的類型說明符
Constant expression_r required      要求常量表達式
Constant out of range in comparison      在比較中常量超出範圍
Conversion may lose significant digits      轉換時會丟失意義的數字
Conversion of near pointer not allowed      不允許轉換近指針
Could not find file ``xxx``      找不到XXX 文件
Declaration missing ;      說明缺少";"
Declaration syntax error      說明中出現語法錯誤
Default outside of switch      Default 出現在switch 語句之外
Define directive needs an identifier      定義編譯預處理需要標識符
Division by zero      用零作除數
Do statement must have while      Do-while 語句中缺少while 部分
Enum syntax error      枚舉類型語法錯誤
Enumeration constant syntax error      枚舉常數語法錯誤
Error directive :xxx      錯誤的編譯預處理命令
Error writing output file      寫輸出文件錯誤
expression_r syntax error      表達式語法錯誤
Extra parameter in call      調用時出現多餘錯誤
File name too long      文件名太長
Function call missing )      函數調用缺少右括號
Fuction definition out of place      函數定義位置錯誤
Fuction should return a value      函數必需返回一個值
Goto statement missing label      Goto 語句沒有標號
Hexadecimal or octal constant  too large      16 進制或8 進制常數太大
Illegal character ``x``      非法字符x
Illegal initialization      非法的初始化
Illegal octal digit      非法的8 進制數字
Illegal pointer subtraction      非法的指針相減
Illegal structure operation      非法的結構體操作
Illegal use of floating point      非法的浮點運算
Illegal use of pointer      指針使用非法
Improper use of a typedefsymbol      類型定義符號使用不恰當
In-line assembly not allowed      不允許使用行間彙編
Incompatible storage class      存儲類別不相容
Incompatible type conversion      不相容的類型轉換
Incorrect number format      錯誤的數據格式
Incorrect use of default      Default 使用不當
Invalid indirection      無效的間接運算
Invalid pointer addition      指針相加無效
Irreducible expression_r tree      無法執行的表達式運算
Lvalue required      需要邏輯值0 或非0 值
Macro argument syntax error      宏參數語法錯誤
Macro expansion too long           宏的擴展以後太長
Mismatched number of parameters in definition      定義中參數個數不匹配
Misplaced break          此處不應出現break 語句
Misplaced continue      此處不應出現continue 語句
Misplaced decimal point      此處不應出現小數點
Misplaced elif directive       不應編譯預處理elif
Misplaced else            此處不應出現else
Misplaced else directive       此處不應出現編譯預處理else
Misplaced endif directive      此處不應出現編譯預處理endif
Must be addressable            必須是可以編址的
Must take address of memory location      必須存儲定位的地址
No declaration for function ``xxx``      沒有函數xxx 的說明
No stack      缺少堆棧
No type information       沒有類型信息
Non-portable pointer assignment       不可移動的指針(地址常數)賦
Non-portable pointer comparison       不可移動的指針(地址常數)比
Non-portable pointer conversion        不可移動的指針(地址常數)轉
Not a valid expression_r format type      不合法的表達式格式
Not an allowed type            不允許使用的類型
Numeric constant too large            數值常太大
Out of memory            內存不夠用
Parameter ``xxx`` is never used                 能數xxx 沒有用到
Pointer required on left side of ->               符號->的左邊必須是指針
Possible use of ``xxx`` before definition      在定義之前就使用了xxx(警告)
Possibly incorrect assignment      賦值可能不正確
Redeclaration of ``xxx``        重複定義了xxx
Redefinition of ``xxx`` is not identical        xxx 的兩次定義不一致
Register allocation failure        寄存器定址失敗
Repeat count needs an lvalue        重複計數需要邏輯值
Size of structure or array not known        結構體或數給大小不確定
Statement missing ;         語句後缺少";"
Structure or union syntax error      結構體或聯合體語法錯誤
Structure size too large       結構體尺寸太大
Sub scripting missing ]        下標缺少右方括號
Superfluous & with function or array      函數或數組中有多餘的"&"
Suspicious pointer conversion      可疑的指針轉換
Symbol limit exceeded           符號超限
Too few parameters in call      函數調用時的實參少於函數的參數不
Too many default cases          Default 太多(switch 語句中一個)
Too many error or warning messages      錯誤或警告信息太多
Too many type in declaration                說明中類型太多
Too much auto memory in function       函數用到的局部存儲太多
Too much global data defined in file      文件中全局數據太多
Two consecutive dots            兩個連續的句點
Type mismatch in parameter xxx        參數xxx 類型不匹配
Type mismatch in redeclaration of ``xxx``      xxx 重定義的類型不匹配
Unable to create output file ``xxx``      無法建立輸出文件xxx
Unable to open include file ``xxx``       無法打開被包含的文件xxx
Unable to open input file ``xxx``          無法打開輸入文件xxx
Undefined label ``xxx``               沒有定義的標號xxx
Undefined structure ``xxx``         沒有定義的結構xxx
Undefined symbol ``xxx``            沒有定義的符號xxx
Unexpected end of file in comment started on line xxx      從xxx 行開始的註解尚未結束文件不能結束
Unexpected end of file in conditional started on line xxx      從xxx 開始的條件語句尚未結束文件不能結束
Unknown assemble instruction      未知的彙編結構
Unknown option            未知的操作
Unknown preprocessor directive: ``xxx``      不認識的預處理命令xxx
Unreachable code            無路可達的代碼
Unterminated string or character constant      字符串缺少引號
User break            用戶強行中斷了程序
Void functions may not return a value      Void 類型的函數不應有返回值
Wrong number of arguments            調用函數的參數數目錯
``xxx`` not an argument            xxx 不是參數
``xxx`` not part of structure      xxx 不是結構體的一部分
xxx statement missing (            xxx 語句缺少左括號
xxx statement missing )            xxx 語句缺少右括號
xxx statement missing ;            xxx 缺少分號
xxx`` declared but never used            說明了xxx 但沒有使用
xxx`` is assigned a value which is never used            給xxx 賦了值但未用過
Zero length structure            結構體的長度爲零

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章