当前位置: 首页 > news >正文

ESP-Bluedroid这个在C5上能不能用Psram内存

可以。ESP32-C5 上的 ESP-Bluedroid 可以使用 PSRAM,但不是 100% 全部蓝牙内存都能搬到 PSRAM。正确说法是:Bluedroid 的一部分动态内存、部分 BSS 静态内存可以放到 PSRAM,蓝牙控制器、DMA、任务栈、时序敏感内存仍然会占用内部 RAM

ESP-IDF 的 ESP32-C5 配置里有专门选项:CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST,说明是BT/BLE 优先从 PSRAM malloc 内存;还有CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY,用于让 Bluedroid 的 BLE 环境内存改为动态分配。(Espressif Systems)

建议配置

idf.py menuconfig里这样开:

Component config → ESP PSRAM → Support for external SPI RAM → SPI RAM config → Make RAM allocatable using malloc() as well → Allow .bss segment to be placed in external memory

ESP32-C5 官方文档说明,PSRAM 可以加入 capability allocator,用heap_caps_malloc(..., MALLOC_CAP_SPIRAM)分配;也可以配置为普通malloc()可用,这是默认推荐方式。(Espressif Systems)

然后再开 Bluedroid 相关配置:

Component config → Bluetooth → Bluetooth Host → Bluedroid Component config → Bluetooth → Bluedroid Options → BT/BLE will first malloc the memory from the PSRAM → Use dynamic memory allocation in BT/BLE stack

对应配置大概是:

CONFIG_BT_ENABLED=y CONFIG_BT_BLUEDROID_ENABLED=y CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=y CONFIG_SPIRAM=y CONFIG_SPIRAM_USE_MALLOC=y CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y

如果你的menuconfig里看不到SPI RAM选项,需要在组件依赖里加esp_psram,因为 ESP32-C5 的官方文档说明,只有工程包含esp_psram组件时,SPI RAM 配置项才会出现。(Espressif Systems)

main/CMakeLists.txt示例:

idf_component_register( SRCS "main.c" INCLUDE_DIRS "." REQUIRES esp_psram bt )

Bluedroid 哪些能放 PSRAM

可以优化的主要是这几类:

1. Bluedroid 的部分动态 malloc 内存 2. BLE 环境内存 3. Bluedroid 库里的部分 .bss 静态区 4. 你自己应用层的大 buffer、队列、缓存

ESP32-C5 外部 RAM 文档明确写到,打开CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY后,lwIP、net80211、libpp、wpa_supplicant 和bluedroid这些 ESP-IDF 库的零初始化 BSS 数据可以放到外部 RAM。(Espressif Systems)

但这些一般还会留在内部 RAM:

1. Bluetooth Controller 关键内存 2. HCI / Controller 相关低层 buffer 3. ISR / DMA / cache 敏感内存 4. 默认 FreeRTOS 任务栈 5. 需要 MALLOC_CAP_INTERNAL 的分配

ESP32-C5 官方文档也提醒,PSRAM 在 flash cache disabled 时不可访问,默认情况下任务栈也不会放到外部 RAM。(Espressif Systems)

验证是否真的省了内部 RAM

你可以在蓝牙初始化前后打印内部 RAM 和 PSRAM:

#include "esp_log.h" #include "esp_heap_caps.h" #include "esp_psram.h" static const char *TAG = "mem"; static void print_mem(const char *stage) { ESP_LOGI(TAG, "[%s] internal free: %u", stage, (unsigned)heap_caps_get_free_size(MALLOC_CAP_INTERNAL)); ESP_LOGI(TAG, "[%s] psram free: %u", stage, (unsigned)heap_caps_get_free_size(MALLOC_CAP_SPIRAM)); ESP_LOGI(TAG, "[%s] psram size: %u", stage, (unsigned)esp_psram_get_size()); }

调用位置:

print_mem("before bt init"); /* esp_bt_controller_init() esp_bt_controller_enable() esp_bluedroid_init() esp_bluedroid_enable() */ print_mem("after bluedroid enable");

如果配置有效,你会看到:

内部 RAM 下降减少 PSRAM 下降增加

但不要期待内部 RAM 完全不掉。

关键结论

ESP32-C5 + ESP-Bluedroid 可以用 PSRAM,建议至少打开:

CONFIG_SPIRAM_USE_MALLOC CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY

不过如果你们是C5 上 Wi-Fi + BLE + Matter/Thread/应用业务一起跑,内部 RAM 仍然会比较紧。新项目如果没有 Bluedroid 历史包袱,NimBLE 通常比 Bluedroid 更适合 C5,因为 ESP-IDF 官方说明 NimBLE 是 BLE-only 的轻量 Host,更适合资源受限应用。(Espressif Systems)

http://www.jsqmd.com/news/941012/

相关文章:

  • Xilinx FPGA上可直接综合的OFDM基带通信全链路工程(含16QAM与维特比译码)
  • 新建工厂选倍速链线还是柔性生产线?
  • 保姆级教程:用Python和OpenCV搞定Cityscapes数据集预处理(从下载到512x1024裁剪)
  • PyTorch模型部署实战:用TorchScript把动态图‘冻’起来,告别Python依赖
  • 舟山家庭教育指导师报名入口:怎么报名怎么考?授权机构:中山优才教育 - 实时教育培训动态
  • 避坑指南:YOLOv5训练猫狗数据集时,为什么你的模型只识别出一种动物?(附标签检查与数据清洗实战)
  • WSL2下CUDA版本切换踩坑记:从12.0降级到11.1,成功安装diff-gaussian-rasterization
  • 金融系统真正缺的不是更多审批,而是可被约束的最终执行权
  • 设计个人四季衣物收纳轮换程序,根据季节气温自动推荐穿搭收纳方案,适配小户型。
  • 用STM32和GY39传感器做个智能气象站:串口/IIC双模式数据采集全攻略
  • pycharm可视化,中文显示方框
  • 从配置文件到爬虫数据:手把手教你用Python的ast.literal_eval处理5种奇葩字符串格式
  • LLaMA-Factory微调ChatGLM3-6B后,如何正确封装Prompt Template并用vLLM推理?
  • 保姆级教程:在Ubuntu 20.04 ROS Noetic下,用Realsense D435i搞定UR3机械臂手眼标定
  • 告别手动盘点!深入解读SAP EWM四大补货逻辑:计划、自动、订单与直接补货
  • AI工具与设计工具整合全链路拆解,从Prompt工程到交付验收的12个关键断点及修复方案
  • 告别Visual Studio的臃肿:用VSCode + .NET 8快速搭建轻量级C#开发环境(附Code Runner一键运行配置)
  • Kaizen:Windows上免装Java的Elasticsearch轻量管理工具(绿色便携)
  • 多模态推荐系统:技术演进与MUSE框架实践
  • CW32量产效率翻倍秘籍:巧用CW-Programmer自动编号与工程文件管理
  • 阿里云 AnalyticDB MySQL 免运维实践:分析型数据库不需要专人运维
  • 3分钟极速美化:让Windows拥有macOS精致鼠标指针的完整教程
  • Bili2text:一站式B站视频转文字解决方案,高效提取视频内容价值
  • C#写的Modbus RTU串口调试小工具,发指令自动加CRC校验码
  • 别只盯着PSNR!从MIMO-UNet到DeepRFT,我这样拆解和‘魔改’残差模块
  • AI生成PPT如何套用公司模板?自定义模板功能详解
  • 告别盲盒生成!用PyTorch实战cGAN/ACGAN,手把手教你生成指定数字的MNIST图片
  • 保姆级教程:在银河麒麟V10 ARM64服务器上,用yum downloadonly搞定Docker 26.1.0离线安装包
  • 亚马逊云科技全面发力 Agentic AI:从桌面助手到垂直场景,联手 OpenAI 重构企业生产力
  • Seraphine:基于LCU API的英雄联盟数据查询与智能辅助工具技术解析