stm32常見錯誤分析

2021-07-11 02:22:11 字數 3067 閱讀 8109

原文:

1.warning:  #550-d: variable "d" was set but never used

描述:變數'd'定義但從未使用,或者是,雖然這個變數你使用了,但編譯器認為變數d所在的語句沒有意義,編譯器把它優化了.

解決:仔細衡量所定義的變數d是否有用,若是認定變數d所在語句有意義,那麼嘗試用volatile關鍵字修飾變數d,若是真的沒有用,那麼刪除掉以釋放可能的記憶體.

2.warning:  #1-d: last line of file ends without a newline

描述:檔案最後一行不是新的一行.編譯器要求程式檔案的最後一行必須是空行,想了半天沒想通為什麼要這樣.

解決:可以不理會.若是覺得出現警告不爽,那麼在出現警告的檔案的最後一行敲個回車,空出一行.

3. warning:  #111-d: statement is unreachable

描述:宣告不可能到達.多出現在這種場合:

int main(void)

return 0; //這句宣告在正常情況下不可能執行到,編譯器發出警告

}解決:不理會.

4. warning: c3017w: data may be used before being set

描述:變數'data'在使用前沒有明確的賦值.如:

uint8 i,data;  //定義變數i和data,二者都沒有明確賦值

for ( i = 0; i < 8; i++) //變數'i'在語句中被賦值0

解決:應仔細衡量該變數的初始值是否為0,若是,可以不理會這個警告,因為mdk編譯器在程式執行前,會將使用到的資料區初始化為0,但若是該變數的初始值不應該是0,忽略這個警告可能會引起致命錯誤.這個警告應引起足夠重視.應養成變數賦初值的習慣,好在有編譯器給把關.

5. warning:  #177-d: variable "temp" was declared but never referenced

描述:變數'temp'進行了宣告但沒有引用.多出現在宣告了乙個變數,但卻沒有使用它,它和warning:  #550-d: variable "temp" was set but never used不同之處在於temp從沒有使用過.

解決:若是定義的變數確實沒有用,刪除掉;若是有用,則在程式中使用.

與該警告類似的還有 warning:  #177-d: function "macprocessbeacon" was declared but never referenced

6. warning:  #940-d: missing return statement at end of non-void function "dealwithinspect2"

描述:返回非空的函式"dealwithinspect2"的最後缺少返回值宣告.如:

int dealwithinspect2(uint32 test)

7..warning:  #1295-d: deprecated declaration lcd_init - give arg types

描述:在定義函式的時候,如果你寫上函式引數,就會有這個警告,比如void timer_init(); 這裡就沒有形參,如果這樣的話,編譯器會給出警告.

1. error:  #65: expected a ";"

描述:缺少分號.大多是漏忘';'.

解決:雙擊錯誤行,在定位到錯誤點的附近找到沒加';'號的語句,加上分號.並不一定在定位到的錯誤行才卻分號,可能是這行的上一行,也可能是下一行.

3.  error: l6200e: symbol flagu multiply defined (by uart0.o and main.o).

描述:變數(也是一種符號)flagu多處定義(在uart0.c中和main.c都定義了).通常錯在全域性變數定義重複.比如:在main.c中定義全域性變數flagu:

uint8 flagu=0;

在uart0.c中也用到該變數,於是宣告此變數,我通常都是先複製定義的變數再在變數前面加關鍵字extern修飾:

extern uint8 flagu=0;

然後編譯,就會出現上面的連線錯誤,原因在於,我在uart0.c中是又定義了乙個變數,而不是宣告變數,因為我給變數賦了初值"flagu=0",這樣就重複定義了變數flag.正確的宣告方法是去掉賦值部分:

extern uint8 flagu;

解決辦法:找到重複定義的變數,看情況修改一處.

4.error:  #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)

描述:在wr_lcd函式還沒有宣告之前就已經使用了.多出現在兩種情況:第一種,wr_lcd函式體還沒有寫,就已經用到了它,這種情況多出現在寫乙個程式的大體結構中,只是簡單寫一下框架.第二種情況比較常見,函式a呼叫函式b,但函式b的函式體在函式a的下面:

void a(void) //函式a的實體

void b(void) //函式b的實體

這樣如果點編譯,就會產生error:  #159的錯誤,因為當函式a呼叫函式b時,發現在這之前都沒有函式b的任何宣告.

解決方法:在函式a呼叫函式b之前,對函式b進行宣告,如:

void b(void); //對函式b進行宣告

void a(void) //函式a的實體

void b(void) //函式b的實體

5. error:  #137: expression must be a modifiable lvalue

描述:表示式必須是乙個可以修改的左值.主要出現在這種現象:

a=num;

num是乙個數值或表示式,a為乙個變數,但a被定義為像const這種不可更改的型別,導致num不能賦值給變數a.

解決方法:要麼放棄賦值,要麼修改變數屬性.

6.error:  #18: expected a ")"

如果是出現在c檔案中, 多半是因為少了乙個")",或者錯誤行有編譯器不識別的字元

如果出現在標頭檔案中,錯誤行又是乙個函式宣告,多半是因為在函式宣告中有編譯器不認識的字元.

7.error:  #7: unrecognized token

未識別的標記,多半是切換成了中文標點。

STM32補充 五 常見錯誤

目錄 1.keil軟體的error flash download failed could not load file obj template.axf 解決思路 2.multiply defined by tab.o and lcdlib.o 3.a1023 錯誤 第乙個知識點 axf是編譯後生成...

STM32編譯錯誤

output test.axf error l6218e undefined symbol systeminit referred from startup stm32f10x hd.o not enough information to list image symbols.此問題錯誤提示已經十分...

stm32啟動檔案分析

這篇文章主要是分析stm32啟動檔案,啟動檔案是由彙編編寫的,檔名為startup stm32f40 41 s。啟動檔案最主要的功能就是初始化堆疊指標sp,執行復位程式進入c語言main函式 1.初始化堆疊空間大小,定義棧頂位置 堆起始位置等等 2.定義中斷向量表,初始化sp指標 3.reset h...