乐鑫技术交流
直播中

王强

7年用户 1320经验值
私信 关注
[问答]

调用esp_mesh_lite_try_sending_msg后free heap越来越少怎么解决?

最近基于esp-mesh-lit>examples>no_router的demo改写了一个从串口接收数据,然后广播到组网设备的功能。
验证功能过程中发现,每次调用esp_mesh_lite_try_sending_msg,可用的free heap就越来越少,多次调用后,系统因为heap不够奔溃了。
起初是以为cJSON的item没有释放掉,但查到后面发现只要注释掉esp_mesh_lite_try_sending_msg这个api,heap就正常,大伙有碰到过类似的问题么?
使用的硬件是esp32-c3-mini-1开发板
各依赖组件版本如下:
[1/5] espressif/cmake_utilities (0.5.3)
[2/5] espressif/esp_modem (1.1.0)
[3/5] espressif/iot_bridge (0.11.0)
[4/5] espressif/mesh_lite (0.10.0)
[5/5] idf (5.1.2)
下面是部分log,
I (561116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -14, free heap: 167884
I (571116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 167884
I (581116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 167884
I (591116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 167884
I (601116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -14, free heap: 167752
I (604216) uart_port: uart1 recv, count: 0, len: 4
I (605076) uart_port: uart1 recv, count: 1, len: 4
I (605596) uart_port: uart1 recv, count: 2, len: 4
I (605856) uart_port: uart1 recv, count: 3, len: 4
I (611116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 167380
I (613746) uart_port: uart1 recv, count: 4, len: 4
I (613926) uart_port: uart1 recv, count: 5, len: 4
I (614136) uart_port: uart1 recv, count: 6, len: 4
I (614346) uart_port: uart1 recv, count: 7, len: 4
I (621116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 167036
I (623196) uart_port: uart1 recv, count: 8, len: 4
I (623416) uart_port: uart1 recv, count: 9, len: 4
I (623586) uart_port: uart1 recv, count: 10, len: 4
I (623816) uart_port: uart1 recv, count: 11, len: 4
I (631116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -14, free heap: 166688
I (631856) uart_port: uart1 recv, count: 12, len: 4
I (632036) uart_port: uart1 recv, count: 13, len: 4
I (632226) uart_port: uart1 recv, count: 14, len: 4
I (632436) uart_port: uart1 recv, count: 15, len: 4
I (641116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 166348
I (642306) uart_port: uart1 recv, count: 16, len: 4
I (642476) uart_port: uart1 recv, count: 17, len: 4
I (642666) uart_port: uart1 recv, count: 18, len: 4
I (642896) uart_port: uart1 recv, count: 19, len: 4
I (651116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 166004
I (661116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 166004
I (671116) no_router: sys info, channel: 11, layer: 2, self mac: 68:67:25:e6:a9:38, parent bssid: 10:91:a8:21:5c:e5, parent rssi: -15, free heap: 166004
                                                                                                      

回帖(1)

杨海清

2024-7-1 15:28:42
从您的描述来看,问题可能出在调用 `esp_mesh_lite_try_sending_msg` 函数时,内存泄漏或者没有正确释放内存。以下是一些建议来解决这个问题:

1. **检查内存分配和释放**:确保在发送消息之前,所有分配的内存在使用完毕后都已经被释放。使用 `malloc` 和 `free` 时,要确保每次分配的内存都被释放。

2. **使用内存分析工具**:使用 ESP-IDF 的内存分析工具,如 `esp_heap_caps_dump()` 和 `esp_heap_task_info()`,来检查内存使用情况和潜在的内存泄漏。

3. **优化数据结构**:检查您的数据结构,确保没有不必要的内存分配。例如,使用更小的数据类型,或者减少不必要的数据复制。

4. **减少消息发送频率**:如果可能,尝试减少调用 `esp_mesh_lite_try_sending_msg` 的频率。这可以降低内存消耗,从而避免系统崩溃。

5. **检查 cJSON 库**:虽然您提到已经排除了 cJSON 库的问题,但仍然建议您检查 cJSON 的使用,确保在使用后正确释放内存。

6. **更新依赖组件**:检查您使用的依赖组件版本是否为最新版本,以确保没有已知的内存泄漏问题。您提供的组件版本可能不是最新的,尝试更新到最新版本。

7. **查看 ESP-Mesh 源代码**:检查 ESP-Mesh 源代码,看看是否有已知的内存泄漏问题或者可以优化的地方。

8. **增加堆大小**:如果以上方法都无法解决问题,您可以尝试增加 ESP32 的堆大小。在 `menuconfig` 中,选择 `Component config > ESP32-specific > Min. free heap size`,然后设置一个更大的值。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分