2016年12月12日 星期一

ESP8266 Arduino IDE 開發問與答 Q&A ( 3 )

網頁最後修改時間:2016/12/12 


雖然我們都會在程式裡面加上  Serial.print("錯誤發生") 來輸出訊息以提供程式在哪裡出現問題的提示,但是對於在 Arduino 上撰寫 ESP8266 程式時,似乎不是那麼的方便與容易 ! 應該要提示的訊息總是擦肩而過,而且一點消息都沒有 !

這種情況最常出現的是程式執行當中突然因為某原因造成重新開機的時候,只要不是單獨只輸出亂碼,那麼出現錯誤時的訊息與接之而來的開機訊息,就能作為接下來分析系統崩潰 (Crash) 的原因 !
  • 【ESP8266 崩潰 (Crash) 的時候 !】2016/12/12
這陣子一直使用 Arduino ESP8266 Core 撰寫 SPI Flash 讀寫操作的程式,為了是要儲存一堆 MP3 串流電台的資料。一開始,並不如想像中的順利,常會存取錯誤的位址造成 ESP8266 Crash ,又或是接收的串流資料太多沒有處理造成 ESP8266 接收緩衝區溢出... 等情況,通常系統會輸出一堆 stack 的東西,然後直接重新開機重新運行;又或是一直重複開機,永無止境 !

如網頁一開頭說的,如果系統在 Crash 當下有交代遺言 (就是有輸出一些文字),那麼就可以根據下面的方式進行 Debug;但若是一開機就是亂碼,絕大部分是燒錄出問題,重新燒錄試試成功上傳就會正常了。

【ESP8266 崩潰 (Crash) 的時候 !】
當程式執行的時候出現錯誤,從 Serial Monitor 上可以看到類似下圖右方的輸出訊息(下面是一個執行出現錯誤時的實際輸出訊息)
舉例說明,ESP8266 crash 的輸出訊息
上圖右邊的輸出訊息可以用顏色區分為三個部分:
  • Exception Code
  • Stack Trace
  • Restart Log
輸出訊息區分
Exception Code 是造成程式崩潰的識別號碼 (以範例來說就是 28,代表 "訪問非法地址" ),比較常遇到的有
常遇到的 Exception Code
詳細的編號可查閱下表
Exception Code for Arduino ESP8266 Core
根據資料手冊上面的說明,在 Exception Code 下面的訊息可用來查閱程式碼中 Exception 發生的位址,但這是使用 ESP8266 SDK 編譯所得到的檔案才行
Exception (28):
epc1=0x402159d2 epc2=0x00000000 epc3=0x00000000 excvaddr=0x000000fe depc=0x000000
對於上面的這些輸出,只要知道 Exception code 所對應造成的原因就好,而實際發生的程式碼位址在哪裡,可由 [Stack Trace] 所輸出的資料做分析,而這在 Arduino IDE 有工具可以用。

要分析 [Stack Trace],Arduino IDE 必須先安裝 "Arduino ESP8266/ESP32 Exception Stack Trace Decoder" 這個工具,安裝好之後就會在 Arduino IDE 的 "Tools" 選單下面看到出現新的欄位
安裝好 "Arduino ESP8266/ESP32 Exception Stack Trace Decoder" 工具之後,在 "Tools" 選單下面新增的項目
複製 [Exception Code][Stack Trace] 這兩個部分的輸出訊息  (或是像畫面中全部複製) 到 ESP Exception Decoder 上方欄位中,下方欄位就會輸出相對應的訊息出來,這些訊息就可以幫助你 (妳) 找出造成 crash 的程式位置。
Exception Decoder 除錯
最後,剩下的部分就是開機訊息:[Restart Log],這是每一次重新上電啟動的時候會顯示出來的資料,這些資料有什麼用呢 ? 由這些資料可以知道此次重新啟動的原因,也就是 rst cause: 後面顯示的 2,表示這次重新啟動的原因是因為 Fatal Exception,完整的列表如下:
造成此次重新啟動的原因
因此當 ESP8266 crash 時,利用 EXP Exception Decoder 就可以可能的找出程式碼中造成崩潰的地方進行修正,不會再找不到頭緒了 !

參考資料:ESP8266 重啟原因以及常見 Fatal Exception 原因
參考網頁:My ESP crashes running some code. How to troubleshoot it?

<< 相關網頁與連結 >>

沒有留言:

張貼留言