esp32 是espressif設計的,在物聯網應用中非常流行的 wi-fi / bluetooth(ble) 雙模晶元,其開源idf的方式也在開發者社群(github)具有重要的影響力。對於程式設計而言,也相當友好。而記憶體洩漏作為乙個非常常見的問題被相當多的朋友遇到,它關乎**邏輯是否正確、以及最重要的——是否細心...好了,廢話不多說,本文主要介紹一種esp32提供的一種可以迅速、準確定位記憶體洩漏的方法。
在介紹定位為方法之前,首先,使用者應該正確地判斷問題是否真的是記憶體洩漏。判斷方法有兩種:
1. esp32的bug列印;(執行時根據log列印判斷)
2. 使用esp作業系統的api:
esp_get_free_heap_size()
列印出當前記憶體剩餘情況,可以在**的開始和結束兩處**分別列印,並根據**本身的功能狀況進行判斷。
printf("%s buffer get: %d\n",__func__, esp_get_free_heap_size());
經過上面的判斷,若問題真的由記憶體洩漏導致,那麼可以進行以下操作:
1. 配置heap trace:
a. 在terminal 進入配置介面: $ make menuconfig
b. 在 component -> heap memory debugging 選項如下圖進行配置:
2.在**開始處進行以下操作:
/* 需要包含的 標頭檔案 以及 巨集定義 */
#ifdef config_heap_tracing
#include #define num_records 100
static heap_trace_record_t trace_record[num_records]; // this buffer must be in internal ram
#endif
.../* **開始處 */
esp_error_check(heap_trace_init_standalone(trace_record,num_records));
esp_error_check(heap_trace_start(heap_trace_leaks));
...
在**報錯處加以下**:
/* **出錯處 */
...printf("%s buffer get: %d\n",__func__, esp_get_free_heap_size());
esp_error_check(heap_trace_stop());
heap_trace_dump();
...
在terminal內會精確到行數,並列印如下圖:![](https://pic.w3help.cc/cbb/3cd4bd81b15d482b5c55c7cbbc756.jpeg)
後續便可以根據這個backtrace列印進行**追蹤,找到記憶體洩漏的地方。
********************=the end*************************
love and share. peace.
esp32之記憶體洩漏檢測機制
在freertos嵌入式實時系統上開發,經常需要對記憶體進行優化,或者因使用不當造成記憶體洩漏 最難受的莫過於某個庫出現記憶體洩漏 人為記憶體洩漏比較容易找出來,但是函式庫存在記憶體洩漏卻是很難發現,作者在解決記憶體洩漏的過程中也遇到不少坑,難以定位問題存在。試想有一種方法可以在 開發階段實時除錯記...
ESP32模組比較
esp32系列無線ic是樂鑫espressif出品的價效比高的藍芽wifi雙模ic。官網 最詳細的手冊文件為 esp32 technical reference manual cn.pdf 將官方和一些其他方的模組列表比較,包括資源,也把晶元放進去。esp32單核晶元用的少沒有列出。可以看出,安信可...
ESP32 學習記錄
首次接觸freertos和espressif的產品,例如我,那還是要先來個整體印象,然後再逐個深化。做專案的都知道,老闆們是不允許我們四平八穩的研究完然後再開始專案。那也不妨礙咱們要有自己的節奏,既要平衡專案的進度,也要按照事情的規律來做事情 這就需要快速的準備一些預備知識,磨刀不誤砍柴功,倉促上陣...