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:
Rdzleo 2026-05-21 16:03:32 +08:00
parent f5a2777abf
commit 2b4cf82f0c
2 changed files with 5 additions and 3 deletions

View File

@ -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

View File

@ -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