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


一,为什么需要外部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.mzph.cn/news/159937.shtml

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

相关文章

接口自动化中cookies的处理技术

一,理论知识 为什么有cookie和session? 因为http协议是一种无状态的协议,即每次服务端接受到客户端的请求时都时一个全新的请求,服务器并不知道客户端的请求记录,session和cookie主要目的就是弥补http的无状态特性 …

G1垃圾收集器

G1收集器(-XX:UseG1GC) 前置文章:JVM垃圾收集器 G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。 G1将Java堆划分为多个大小相等…

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路: class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值,除数是1,返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

口碑好的猫罐头有哪些?宠物店受欢迎的5款猫罐头推荐!

快到双十二啦!铲屎官们是时候给家里猫主子囤猫罐头了。许多铲屎官看大促的各种品牌宣传,看到眼花缭乱,不知道选哪些猫罐头好,胡乱选又怕踩坑。 口碑好的猫罐头有哪些?作为一个经营宠物店7年的老板,活动期间…

二分查找——经典题目合集

文章目录 🦜69. x 的平方根🌼题目🌻算法原理🌷代码实现 🐳35. 搜索插入位置🌼题目🌻算法原理🌷代码实现 🦭852. 山脉数组的峰顶索引🌼题目🌻算法原…

python-opencv划痕检测-续

python-opencv划痕检测-续 这次划痕检测,是上一次划痕检测的续集。 处理的图像如下: 这次划痕检测,我们经过如下几步: 第一步:读取灰度图像 第二步:进行均值滤波 第三步:进行图像差分 第四步&#xff1…

java创建指定分辨率的图片或修改图片的分辨率(DPI)

因为java默认的图片像素分辨率DPI72,分辨率有点低。所以研究了一下如何创建指定DPI的方案。 DPI: 指的是每英尺的像素点(dots per inch) JPEG图片 JPEG图片的元数据定义参看oracle官网。 https://docs.oracle.com/javase/8/docs/api/javax/imageio/me…

VulnHub DC-9

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

2011-2022年地级市互联网普及率数据

2011-2022年地级市互联网普及率数据 1、时间:2011-2022年 2、指标:行政区划代码、年份、地区、互联网宽带接入用户_千户、常住人口数_千人、户籍人口数_千人、每百人互联网宽带用户_常住人口口径、每百人互联网宽带用户_户籍人口口径 3、来源&#xf…

c语言编程(模考2)

简答题1 从键盘输入10个数&#xff0c;统计非正数的个数&#xff0c;并且计算非正数的和 #include<stdio.h> int main() {int i,n0,sum0;int a[10];printf("请输入10个数&#xff1a;");for(i0;i<10;i){scanf("%d",&a[i]);}for(i0;i<10…

【C++】类型转换

文章目录 C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_cast RTTI常见面试题 C语言中的类型转换 在C语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值…

12英寸双轴半自动划片机:颠覆传统划切工艺的五大优势

随着科技的飞速发展&#xff0c;半导体行业对精密划切设备的需求日益增长。在这篇文章中&#xff0c;我们将深入探讨12英寸双轴半自动划片机的优势&#xff0c;这种划片机在半导体制造过程中扮演着至关重要的角色。以下是这种划片机的五大优势。 一、高精度划切 12英寸双轴半自…

【数据结构初阶】栈和队列

栈和队列 1.栈1.1栈的概念和结构1.2栈的实现 2.队列2.1队列的概念和结构2.2队列的实现 1.栈 1.1栈的概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。…

OSG文字-HUD显示汉字示例(3)

显示文字是一种非常实用的技术&#xff0c;可以用来把一些重要的文字始终显示在屏幕上。HUD的全称是HeadsUpDisplay&#xff0c;即抬头显示&#xff0c;这种技术最早应用在军事战斗机上。 创建HUD显示的基本步骤如下: <1> 创建一个osg::Camera对象&#xff0c;设置视图、…

kubernetes学习-概念3

工作负载资源 Kubernetes 提供了几个内置的 API 来声明式管理工作负载及其组件。 最终&#xff0c;你的应用以容器的形式在 Pods 中运行&#xff1b; 但是&#xff0c;直接管理单个 Pod 的工作量将会非常繁琐。例如&#xff0c;如果一个 Pod 失败了&#xff0c;你可能希望运行…

lombok 引入

lombok 依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

ARCGIS网络分析

一、实验名称&#xff1a; 网络分析 二、实验目的&#xff1a; 通过本实验练习&#xff0c;掌握空间数据网络分析的基本方法。 三、实验内容和要求&#xff1a; 实验内容&#xff1a; 利用ARCGIS软件网络分析工具及相关空间数据&#xff0c;查找距离“名人故居”、“博物…

Linux-进程替换

进程程序替换目的 首先我们要知道&#xff0c;创建子进程的目的是什么&#xff1f; 想让子进程执行父进程代码的一部分想让子进程执行一个全新的代码 我们之前所写的程序&#xff0c;子进程都是在执行父进程代码的一部分&#xff0c;而要想让子进程执行全新的代码&#xff0…

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址&#xff1a;MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包&#xff0c;仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…

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

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