fix(ble): 释放 27 KB DRAM 给 BT controller, 修复手机搜不到 BLE 信号
============ 问题现象 ============
烧录 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) <noreply@anthropic.com>
This commit is contained in:
parent
f5a2777abf
commit
2b4cf82f0c
@ -1284,6 +1284,7 @@ CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y
|
|||||||
# Common ESP-related
|
# Common ESP-related
|
||||||
#
|
#
|
||||||
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
|
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
|
||||||
|
CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
|
||||||
# end of Common ESP-related
|
# end of Common ESP-related
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1648,7 +1649,6 @@ CONFIG_SPIRAM_SPEED=80
|
|||||||
# CONFIG_SPIRAM_ECC_ENABLE is not set
|
# CONFIG_SPIRAM_ECC_ENABLE is not set
|
||||||
CONFIG_SPIRAM_BOOT_INIT=y
|
CONFIG_SPIRAM_BOOT_INIT=y
|
||||||
CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=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_MEMMAP is not set
|
||||||
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
|
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
|
||||||
CONFIG_SPIRAM_USE_MALLOC=y
|
CONFIG_SPIRAM_USE_MALLOC=y
|
||||||
@ -1656,8 +1656,8 @@ CONFIG_SPIRAM_USE_MALLOC=y
|
|||||||
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
|
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
|
||||||
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
||||||
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
|
||||||
# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set
|
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
|
||||||
# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set
|
CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y
|
||||||
# end of SPI RAM config
|
# end of SPI RAM config
|
||||||
# end of ESP PSRAM
|
# end of ESP PSRAM
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,8 @@ CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
|
|||||||
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
||||||
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
|
||||||
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y
|
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_SPIRAM_MEMTEST=n
|
||||||
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
|
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user