文章

顯示從 7月, 2021 起發佈的文章

[筆記] ESP32 apptrace logging 方便於除錯

圖片
        開發設計任何系統,日誌 logging 是很重要的基礎工作。少了日誌,系統出錯將不容易除錯、分析、解決問題,所以第一步要先學會如何產生日誌。在開發 ESP32 / Arduino 這類系統時,一般常見產生日誌的方法是呼叫 printf 函數將想要紀錄的內容傳到 UART 介面,再從電腦的 COM port 上來查看。         採用 printf 將日誌輸出到 COM port 雖然簡單方便,但是呼叫過多的 printf 會影響運算的 timing,也不適合輸出大量數據到日誌。還有,當遇到系統崩潰的問題時,COM port 方式是很難幫我們解決這類棘手問題的。因此,ESP-IDF 提供另一種方式 apptrace 應用層追蹤函數庫 [2],日誌資料先存放到記憶體,再透過 OpenOCD 傳送到 PC 端。底下,我們以 blink 範例說明產生 apptrace 日誌的步驟。         首先,在 VS Code 的項目中打開 SDK 配置,如圖一所示。左下角的圖示按下,出現 SDK 配置後,找到 " Application Level Tracking " 選項,將選單設為 Trace memory ,儲存後再編譯 blink 範例。 圖一:開啟日誌系統的配置         第二步,在程式碼中,我們可以設定日誌輸出到 COM port 或者輸出到 OpenOCD 的電腦端。如圖二所示,當呼叫 esp_log_set_vprintf ( esp_apptrace_vprintf ) 時,代表之後的日誌都會輸出到 OpenOCD,所以紅色標示的日誌資料會輸出到電腦端。程式碼需要定期再加呼叫 esp_apptrace_flash 才能將日誌輸出。         當呼叫 esp_log_set_vprintf ( vprintf ) 時,代表之後的日誌輸出到 COM port,我們在電腦端直接打開終端機連線(115200bps 8-N-1)就能看到日誌,下圖所示。 圖二:在程式碼新增日誌         程式碼已經調用了 apptrace 函數庫,但是還沒真正讀取到日誌資料或開啟日誌。我們必須在電腦端打開 telnet 連線到 OpenOCD,連線參數:telnet localhost 4444 。連線成功後,輸入