解决ESP32内部RAM内存不足的问题

news2024/7/4 5:24:18


一,为什么需要外部RAM
ESP32有520kB的内部RAM空间可以使用,这对于一般的情况是够用的,但是如果设备需要涉及音频或者显示图像等处理时,需要更大的内存空间来处理这些数据。ESP32支持扩展外部RAM,其实乐鑫已经在其ESP32 WROVER系列模组中集成了一个4M大小的外部PSRAM。乐鑫官网文档对外部RAM作了详解:片外RAM

乐鑫对于ESP32 WROVER的介绍也是:

ESP32-WROVER 系列模组基于 ESP32-D0WD 双核芯片设计,其强大的双核性能适用于对内存需求大的应用场景,例如多样的 AIoT 应用和网关应用。

如果你的设备需要使用大内存,例如wifi与ble并存,音频处理和图像显示功能,推荐使用这个模组。

二 快速上手外部RAM
2.1 使能外部RAM
首先必须确保你的芯片是有外部RAM的。例如ESP32 WROVER模组。
进入idf.py menuconfig->component config->ESP32-specific
在下图的Support for external,SPI-connected RAM选项中按y选中,这样就使能了外部RAM。

2.2 配置外部RAM
进入下一行的SPI RAM config进行配置更多的细节。这里讲一下比较重要的配置选项。

2.2.1 第二项配置系统的动态内存分配功能
有三个选项,当选择Make RAM allocatable using heap_caps_malloc(..., M时,需要在代码中使用heap_caps_malloc()函数才能在外部RAM中分配内存。

当选择Make RAM allocatable using malloc() as well时,代码中malloc()函数会自动从外部RAM中分配内存。
当使能这个选项时,还能配置第九行 Maximum malloc() size, in bytes, to always put in internal memory,该配置设置了一个阈值,这里我设置的是1024bytes,当使用malloc()分配内存时,如果分配的内存小于1024字节,就会从内部RAM中分配,否则从外部RAM中分配。

2.2.2 将BSS段添加到外部RAM
第13行中选择Allow .bss segment placed in external memory,可以将BSS段的lwip、net80211、libpp 和 bluedroid ESP-IDF 库中零初始化的数据存入外部RAM。此外全局变量,静态变量也可以放到外部RAM中,只需要在变量声明的地方加上宏EXT_RAM_ATTR,并将变量初始化为0。

EXT_RAM_ATTR static int num[1024]={0};


 
2.2.3 其他可放入外部RAM的数据
第十行Try to allocate memories of WiFi and LWIP in SPIRAM firstly. If failed, allocate inter会尝试优先使用外部RAM给wifi与lwip协议栈分配内存,如果失败则会使用内部RAM分配。

2.2.4 创建静态任务
xTaskCreate()会使用内部RAM给任务分配任务堆栈。而使用xTaskCreateStatic()系统会检查传入的buff数组是否是属于内部RAM的。

但对于不以任何方式直接或间接调用 ROM 中代码的任务,选项 Allow external memory as an argument to xTaskCreateStatic 将解除 xTaskCreateStatic 中的检查,从而允许任务堆栈存储在外部 RAM 中。但是,不建议使用此方法。

实际使用过程中我也发现使用该函数创建任务会出现assert error的错误,不知道具体的原因是什么,希望了解的大佬解答一下。

2.2.5 修改分区表
由于使用了外部RAM会使partitionstable.bin增加,0x8000的偏移地址会出现覆盖,所以需要修改分区表和partitionstable.bin的偏移地址:
idf.py menuconfig->Partition Table修改成0x10000
如果使用本地的分区表,还需要将分区表修改如下

这是由于partitionstable.bin默认是起始地址0x8000修改成0x10000后,由于其占用0xc00大小的空间,而nvs要实现内存对齐,至少要在0x11000处开始.

# Espressif ESP32 Partition Table
# Name,   Type, SubType, Offset,  Size
nvs,      data, nvs,     0x11000,  0x4000,
phy_init, data, phy,     0x15000,  0x1000,
factory,  app,  factory, 0x20000, 0x300000,
flash_tone,data, 0x04,   0x320000,  50k,


三 深度解放内部RAM
IRAM是内部RAM,当我使用wifi+ble+ASR组成的一个工程时,编译后出现Section .iram0.text will not fit in region iram0_0_seg的错误,原因是IRAM的内存空间仍然不够,这是因为任务堆栈等数据是不能存放在外部RAM中的,所以IRAM中的内存依然紧张。

解决办法是参考 https://github.com/espressif/esp-idf/issues/2566

原理就是关闭一些网络功能的优化来减少IRAM的使用:
按照这位老哥的说法,将wifi,lwip的优化功能关闭,以减少IRAM的占用,这样下来能省出大约37KB的内存。这样就能正常的编译运行了。

具体步骤如下:
idf.py menuconfig->component config->Wi-Fi,将箭头所指的两项按n取消选择

lwip部分同理:进入idf.py menuconfig->component config->LWIP,取消箭头所指。

四 使用效果
使用外部RAM前,可用的内存只有几十K,开启外部RAM后,可用的内存增加了几十倍,我使用内存获取函数,打印出内存的使用情况:

下图表示SPI RAM初始化成功。


下图信息说明,外部RAM可用的内存为4049k bytes,当freertos开始运行,进入main函数后,esp_get_free_heap_size()获取到的可用内存为4253k bytes,这是由内部RAM和外部RAM的所有可用的内存的总和,大概可知道可用的内部RAM只有约200k bytes。可见外部RAM极大的扩展了可用内存。

五,小结
由于外部RAM足足有4M 大小,使得esp32在应对语音,图像时依然能应对,对于一个使用了wifi,ble,lwip或者语音识别的程序来说,这4M的内存是必须的。
————————————————
版权声明:本文为CSDN博主「killer-p」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44821644/article/details/109207305

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1238955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA设计时序约束九、others类约束之Group Path

目录 一、序言 二、Group Path 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考文件 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序路径分…

轻量级压测工具Apache Bench实战

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

【考研数学】数学一“背诵”手册(一)| 高数部分(2)

文章目录 引言一、高数级数空间解析几何球坐标变换公式零碎公式 写在最后 引言 高数一篇文章还是写不太下,再分一些到这里来吧 一、高数 级数 阿贝尔定理:若级数 ∑ a n x n \sum a_nx^n ∑an​xn 当 x x 0 xx_0 xx0​ 时收敛,则适合不…

HCIA-Datacom跟官方路线学习

通过两次更换策略。最后找到最终的学习方案,华为ICT官网有对这个路线的学习,hcia基础有这个学习路线,hcip也有目录路线。所以,最后制定学习路线,是根据这个认证的路线进行学习了: 官网课程:课程…

马斯克震撼演讲:我想创立一个新世界

目录 1拼多多杀入大模型领域:年薪百万招聘人才 2马斯克震撼演讲:我想创立一个新世界 3文心4.0上线首交答卷:百度2023Q3成色如何 1拼多多杀入大模型领域:年薪百万招聘人才 快科技11月22日消息,据国内媒体报道&#x…

阿里云跨账号建立局域网

最近有活动,和好友一并薅了下阿里云的羊毛。琢磨着两台机器组一个局域网,于是有了这个需求,把步骤记录一下: 假设两台机器叫A和B,我们开始进行建立和组网 1. 建立ECS 把A机器公共环境装好,然后使用《实例与…

OceanBase:集群常见操作

目录 1.查看 OBD 管理的集群列表 2.查看某个集群状态 3.启动 OceanBase 集群 4.连接 OceanBase 集群 5.停止运行中的集群 6.销毁已部署的集群 7.查看集群配置项 8.修改集群配置项 1.查看 OBD 管理的集群列表 obd cluster list 2.查看某个集群状态 obd cluster displa…

【喜报】云贝学员顺利通过OceanBase 数据库上机实验,OBCP证书到手了!!!

恭喜LIU同学历经2月,经过郭老师考前辅导顺利拿下OBCP证书! 考试形式 OBCP V3.0考试分为笔试考试和实验考试两部分。 笔试考试: 考试形式:线下考点考试(官网预约) 考试时长: 90分钟 题目一共66道题(从题库中随机抽取&#xff…

Instant Web API .Net Core Crack

Instant Web API .Net Core 是立即构建即时数据库 Web API,无需编码。在几分钟内生成您的 Web API,以更快地构建应用程序。使用 VS 2022 和 Entity Framework Core 为任何 MS SQL 数据库生成 Web API。 新功能 - 使用 Visual Studio 2022 为 PostgreSQL …

算法刷题-动态规划-1

算法刷题-动态规划-1 不同路径不同路径||方法一:方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二:(大佬讲解) 不同路径 //机器人不同的路径进入到指定的地点 publ…

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法,求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径(即列出从根节点到该叶子节点的节点序列),若这样…

【JavaEE】Spring更简单的存储和获取对象(类注解、方法注解、属性注入、Setter注入、构造方法注入)

一、存储Bean对象 在这篇文章中我介绍了Spring最简单的创建和使用:Spring的创建和使用 其中存储Bean对象是这样的: 1.1 配置扫描路径 想要成功把对象存到Spring中,我们需要配置对象的扫描包路径 这样的话,就只有被配置了的包…

STM32F103C8T6第5天:独立看门狗、窗口看门狗、dma实验

1. 独立看门狗IWDG介绍(341.45) 什么是看门狗? 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断&#…

引爆关注,聚焦上海新闻媒体邀请

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 上海拥有众多的新闻媒体机构,包括报纸、电视、广播和网络媒体等。这些媒体在报道国内外新闻、传播信息等方面发挥着重要作用。 其中,上海电视台是上海最大的电视…

使用VSCode+PlatformIO搭建ESP32开发环境

Arduino IDE本来就是为创客们开发的,虽然没代码提示功能,文件的关系也不清晰,函数不能跳转,头文件也打不开,但人家的初衷就是为了简单而生的;但还是有一些同学喜欢高级点的IDE,也没问题&#xf…

详解Python中哈希表的使用。站在开发者角度,与大家一起探究哈希的世界。

文章目录 1. 前言2. 哈希表2.1 哈希函数2.2 哈希算法2.3 常见哈希算法2.4 哈希冲突 3.总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面…

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法(二) 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间: 子集树排列树 …

2024贵州大学计算机考研分析

24计算机考研|上岸指南 贵州大学 贵州大学计算机科学与技术学院(贵州大学省级示范性软件学院)位于贵州省贵阳市花溪区贵州大学东校区。 计算机科学与技术学院(软件学院)自1972年创办计算机软件本科专业开始,至今已有…

sso 四种授权模式

单点登录 单点登录,英文是 Single Sign On(缩写为 SSO)。即多个站点共用一台认证授权服务器,用户在站点登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。例如: …

aspera替代方案,镭速大文件传输解决方案替代

相信不少的互联网用户对于传输软件aspera并不陌生,但是市面上有没有哪一些aspera替代方案,aspera替代方案是否比aspera更加能够解决数据传输的需求,是一个值得思考的事情,那么我们先来了解一下aspera以及aspera替代方案。 了解Asp…