From 2b4cf82f0cf52e489165c3d454ebf085b6b0049e Mon Sep 17 00:00:00 2001 From: Rdzleo Date: Thu, 21 May 2026 16:03:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(ble):=20=E9=87=8A=E6=94=BE=2027=20KB=20DRAM?= =?UTF-8?q?=20=E7=BB=99=20BT=20controller,=20=E4=BF=AE=E5=A4=8D=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E6=90=9C=E4=B8=8D=E5=88=B0=20BLE=20=E4=BF=A1=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ============ 问题现象 ============ 烧录 f5a2777 (A+B+C 三件套 + BT_ALLOCATION_FROM_SPIRAM_FIRST) 后: ✅ BOOT 按键可正常进入配网模式 (不再 future_new abort) ❌ 手机搜不到 Kapi 蓝牙信号 日志: E (2240) BLE_INIT: Malloc failed E (2240) BT_HCI: CC evt: op=0x2008, status=0x7 (HCI_BLE_WRITE_ADV_DATA) 代码层 "广播启动成功" 但 ADV_DATA 实际为空, 手机不可见 ============ 根因 ============ CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST 只影响 Bluedroid host 层动态分配, 不影响 BT controller. 上一次提交修了 host (future_new 不再 NULL), 但 controller 自己分配 advertising buffer 仍然失败 → ADV_DATA op=0x2008 malloc fail → 广播空数据. size 对比 (Kapi vs Baji 已修好版本): Kapi DIRAM .bss = 51152 字节 (54.25%, 剩余 156 KB) Baji DIRAM .bss = 23536 字节 (50.58%, 剩余 169 KB) 差异定位 (per-archive .bss): libbt.a : Kapi 12450 / Baji 0 (Baji 已挪 PSRAM) libnet80211.a : Kapi 7570 / Baji 0 (Baji 已挪 PSRAM) liblwip.a : Kapi 4691 / Baji 0 (Baji 已挪 PSRAM) libwpa.a : Kapi 1326 / Baji 0 (Baji 已挪 PSRAM) libpp.a : Kapi 1177 / Baji 0 (Baji 已挪 PSRAM) 合计 27214 字节 (~27 KB) 都在 Kapi 内部 SRAM, 不在 Baji. ============ 修复 ============ sdkconfig + sdkconfig.defaults.esp32s3: +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y 作用: 允许 ESP-IDF linker 把 BT/WiFi/LWIP 等核心库的 .bss 段整体 搬到 PSRAM, 释放等量内部 SRAM 给 BT controller 启动时分配 ADV_DATA / SCAN_RSP_DATA / connection state buffer. ============ 验证 (用户实测 2026-05-21) ============ ✅ BOOT 按键进入配网模式, 蓝牙配网音效正常播放 ✅ 手机扫描可见 Kapi 蓝牙信号 ✅ 蓝牙连接 + WiFi 配置 + 设备重启后自动连 WiFi 成功 size 实测 (修复后): DIRAM .bss: 51152 → 23816 (-27336 字节, -27 KB) DIRAM 总占: 185410 → 158114 (54.25% → 46.26%) 剩余 DIRAM: 156350 → 183646 (+27 KB) Flash Data 多出 27 KB .bss (实际放 PSRAM). ============ 移植说明 ============ 本修复需与上次 commit f5a2777 (A+B+C 三件套 + BT_ALLOCATION_FROM_SPIRAM_FIRST) 搭配使用, 缺一不可: - f5a2777 修 host: future_new 不 abort, 可进入配网模式 - 本次 修 controller: ADV_DATA buffer 可分配, 手机搜得到 - 加 A方案 LWIP_MAX_SOCKETS=20: 修 RTC 偶发连接失败 - 加 B方案 ForceRebuildEngine: 兜底 SDK 状态污染 - 加 C方案 DIAG_RTC_BIND_ENABLE: 一键诊断埋点 关联文档: 全局 CLAUDE.md "BLE 配网 DRAM 紧张完整排查流程" 项目记忆 project_ble_provisioning_issues.md Baji commit bffd316 (相同思路在 Baji 验证有效) Co-Authored-By: Claude Opus 4.7 (1M context) --- sdkconfig | 6 +++--- sdkconfig.defaults.esp32s3 | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sdkconfig b/sdkconfig index f695839..b63f081 100644 --- a/sdkconfig +++ b/sdkconfig @@ -1284,6 +1284,7 @@ CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y # Common ESP-related # CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y # end of Common ESP-related # @@ -1648,7 +1649,6 @@ CONFIG_SPIRAM_SPEED=80 # CONFIG_SPIRAM_ECC_ENABLE is not set CONFIG_SPIRAM_BOOT_INIT=y CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y -# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set # CONFIG_SPIRAM_USE_MEMMAP is not set # CONFIG_SPIRAM_USE_CAPS_ALLOC is not set CONFIG_SPIRAM_USE_MALLOC=y @@ -1656,8 +1656,8 @@ CONFIG_SPIRAM_USE_MALLOC=y CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192 CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536 -# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set -# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y # end of SPI RAM config # end of ESP PSRAM diff --git a/sdkconfig.defaults.esp32s3 b/sdkconfig.defaults.esp32s3 index 606a2bd..f732059 100644 --- a/sdkconfig.defaults.esp32s3 +++ b/sdkconfig.defaults.esp32s3 @@ -11,6 +11,8 @@ CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192 CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536 CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y CONFIG_SPIRAM_MEMTEST=n CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y