ESP32-C3 BLE Mesh快速配网重启后反复复位问题求助
ESP32-C3 BLE Mesh 持久化配置复位崩溃问题
环境
- 硬件:ESP32-C3芯片、esp32-c3-devkitm-1开发板
- 软件:ESP-IDF 4.4.2
- 项目:基于BLE Mesh快速配网服务器示例,新增NVS闪存持久化存储BLE Mesh入网配置功能
问题现象
- 节点通过nRF Mesh移动App成功入网后功能正常
- 复位ESP32后尝试重新连接,设备立即崩溃复位,无法再次通过nRF Mesh App完成配网
- 仅能通过按键触发
esp_ble_mesh_node_local_reset()清除NVS闪存中的配置,才能重新执行配网流程
关键错误日志
E (404909) BT_OSI: osi_alarm_new alarm_cbs exhausted assert failed: hash_map_set hash_map.c:129 (data != NULL) Core 0 register dump: MEPC : 0x403816be RA : 0x40389470 SP : 0x3fcb3490 GP : 0x3fc91000 TP : 0x3fc80d9c T0 : 0x37363534 T1 : 0x7271706f T2 : 0x33323130 S0/FP : 0x0000008e S1 : 0x00000001 A0 : 0x3fcb34cc A1 : 0x3fc928c1 A2 : 0x00000001 A3 : 0x00000029 A4 : 0x00000001 A5 : 0x3fc9a000 A6 : 0x7a797877 A7 : 0x76757473 S2 : 0x00000009 S3 : 0x3fcb35d9 S4 : 0x3fc928c0 S5 : 0x3fcb38bc S6 : 0x00000000 S7 : 0x00000000 S8 : 0x00000000 S9 : 0x00000000 S10 : 0x00000000 S11 : 0x00000000 T3 : 0x6e6d6c6b T4 : 0x6a696867 T5 : 0x66656463 T6 : 0x62613938 MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000 MHARTID : 0x00000000 Stack memory: 3fcb3490: 0x00000000 0x3fcb38bc 0x3c0f6780 0x4038f1e2 0x3fc93118 0x3c0f6780 0x3fc933d4 0x3c0f6802 3fcb34b0: 0x3fc93128 0x3fcb34c4 0x3fc9312c 0x3c0e4028 0x3fc928c0 0x00393231 0x3fc9dce4 0x65737361 3fcb34d0: 0x66207472 0x656c6961 0x68203a64 0x5f687361 0x5f70616d 0x20746573 0x68736168 0x70616d5f ... ELF file SHA256: 19cc199fd03b8d83 Rebooting... ESP-ROM:esp32c3-api1-20210207 Build:Feb 7 2021 rst:0x3 (RTC_SW_SYS_RST),boot:0xe (SPI_FAST_FLASH_BOOT) Saved PC:0x403812e0 SPIWP:0xee mode:DIO, clock div:1 load:0x3fcd5810,len:0x16b4 load:0x403cc710,len:0x930 load:0x403ce710,len:0x2d28 entry 0x403cc710 I (35) boot: ESP-IDF 4.4.2 2nd stage bootloader ... I (909) Mesh: init Bluetooth Mesh. W (1639) BLE_MESH: bt_mesh_proxy_server_prov_disable, Already I (1649) Mesh Prov: ESP_BLE_MESH_NODE_PROV_COMPLETE_EVT I (1649) Prov cmplt: net_index: 0x0000, addr: 0x007e I (1649) Prov cmplt: flags: 0x0000, iv_index: 0x00000000 I (1659) Mesh Prov: ESP_BLE_MESH_PROV_REGISTER_COMP_EVT, Error Code: 0 I (1669) Mesh Prov: ESP_BLE_MESH_NODE_SET_UNPROV_DEV_NAME_COMP_EVT, Error Code: 0 E (1679) BT_OSI: osi_alarm_new alarm_cbs exhausted E (1679) BLE_MESH: Alarm not created W (1689) BLE_MESH: bt_mesh_prov_enable, Already I (1689) Mesh Prov: ESP_BLE_MESH_NODE_PROV_ENABLE_COMP_EVT, Error Code: -120
问题分析与解决建议
核心问题定位
日志中osi_alarm_new alarm_cbs exhausted和hash_map_set断言失败是关键,说明从NVS加载配置后,BLE Mesh栈初始化时耗尽了OSI Alarm资源,导致哈希表操作异常,最终触发设备复位。
解决方向
校验NVS存储的配置完整性
- 确保存储到NVS的Mesh配置包含所有必要参数(网络索引、节点地址、IV索引、网络密钥、应用密钥等),避免加载不完整数据导致栈初始化异常
- 仅在配网完成事件(
ESP_BLE_MESH_NODE_PROV_COMPLETE_EVT)触发后,确认Mesh状态稳定时,才将配置写入NVS
调整Mesh初始化与配置加载顺序
- 先完成BLE Mesh栈的基础初始化,再从NVS加载配置,避免未初始化的栈加载配置导致资源泄漏
- 加载配置后,判断设备是否已处于配网状态,若已配网则跳过配网使能流程(日志中
bt_mesh_prov_enable, Already说明重复触发了配网使能)
修复OSI Alarm资源泄漏
- ESP-IDF 4.4.2存在BLE Mesh栈OSI Alarm资源未正确释放的已知问题,建议升级到ESP-IDF v4.4.5或更高补丁版本
- 检查自定义NVS存储逻辑,避免重复注册Alarm或未正确释放相关资源
优化配网状态判断逻辑
- 复位后加载NVS配置成功后,直接进入已配网节点的正常运行模式,无需再次启用配网代理,避免配网逻辑冲突
内容的提问来源于stack exchange,提问作者M_1993
相关产品推荐
相关产品推荐

