ESP32如何使用PSRAM

ESP32的内部RAM的设计做了内存扩展。您可以通过寻址高达4MB的外部SPI RAM内存来进一步扩展它。在本文中,探讨如何在项目中使用PSRAM,针对ESP32-WROVER模块进行特别的讨论。

关键问题:

  1. 如何确保PSRAM在应用程序代码中可用?
  2. 如何分配PSRAM内存?
  3. ESP32的PSRAM容量限制为4MB,即使某些模块带有8MB芯片。

    ESP-WROVER:8MB PSRAM?

    ESP32的制造商Espressif销售一个名为ESP-WROVER的模块,它的数据手册中标明有8MB的PSRAM。PSRAM代表伪静态RAM。该模块可能配有一个8MB的外部PSRAM芯片,但事实上,您(目前?)只能在应用程序中使用较低的4MB。实事求是来讲,4MB RAM对于微控制器来说确实是够大的,但8MB的广告有点误导。也许硬件有8MB,但是软件只能利用4MB.

    如果我们相信:Espressif对外部PSRAM的4MB限制是基于硬件限制而不是ESP-IDF框架中的软件限制。虽然有些应用需要大量的内存,但是ESP32最多可以使用4 MB的外部SPI RAM内存。这听起来更像是一个硬件限制,而不是一个修改SDK软件就能突破的限制。

    ESP-WROVER:8MB PSRAM?

    那么,如何使用这个外部RAM?在开始之前,让我们确保我们的ESP32模块有这个外部PSRAM,并且可以从我们的代码中寻址。ESP32/Arduino平台提供了两种方法来确定您总共有多少RAM以及可以使用多少RAM。

    #include <Arduino.h>void setup() {log_d("Total heap: %d", ESP.getHeapSize());log_d("Free heap: %d", ESP.getFreeHeap());log_d("Total PSRAM: %d", ESP.getPsramSize());log_d("Free PSRAM: %d", ESP.getFreePsram());
    }void loop() {}

    请注意,我使用日志记录宏日志_(..)这允许我们稍后禁用日志输出。如果我们在Arduino IDE中使用工具菜单中的以下设置运行此代码。特别要确保将“核心调试级别”设置为“详细”。

    运行代码会在串行监控信息如下:

    [D][esp32-hal-psram.c:47] psramInit(): PSRAM enabled 
    [D][PSRAMTestArduino.ino:4] setup(): Total heap: 393356 
    [D][PSRAMTestArduino.ino:5] setup(): Free heap: 367948 
    [D][PSRAMTestArduino.ino:6] setup(): Total PSRAM: 4194252 
    [D][PSRAMTestArduino.ino:7] setup(): Free PSRAM: 4194252

    结果符合预期!日志输出告诉我们PSRAM已激活,并且有4MB的PSRAM可用。如果我们在Platformio IDE中运行相同的代码,我们会得到以下结果:

    [D][main.cpp:4] setup(): Total heap: 390484 
    [D][main.cpp:5] setup(): Free heap: 365140 
    [D][main.cpp:6] setup(): Total PSRAM: 0 
    [D][main.cpp:7] setup(): Free PSRAM: 0

    嗯,奇怪,不是吗?也许选错了开发板类型。这在platformio.ini中配置:

    [env:esp-wrover-kit] 
    platform = espressif32 
    board = esp-wrover-kit 
    framework = arduino 
    monitor_speed = 115200 
    upload_speed = 921600 
    build_flags = -DCORE_DEBUG_LEVEL=5

    请注意,最后一行需要查看日志_(..)输出。但为什么我们没有看到PSRAM?事实证明,我们需要手动启用PSRAM配置。我们必须通过向platformio.ini添加构建标志来实现这一点:

    build_flags =   -DCORE_DEBUG_LEVEL=5 -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue

    -DBOARD_HAS_PSRAM启用PSRAM支持和-mfix-esp32-psram-cache-issue是一种解决方案,用于在启用PSRAM时可能导致板崩溃的代码序列。阅读有关此的更多信息在这里.

    如何使用PSRAM?

    在最后一段中,我们看到了如何确保PSRAM可用。现在我们要看看如何使用它。根据浓缩咖啡手册,有四种使用PSRAM的方法。在这篇博客文章中,我们只看一种。

    内部RAM已经相当大了。因此,您很可能会使用外部内存来分配相对较大的缓冲区。为此,我们可以使用ps_malloc()和free()释放内存。下面的代码是内存分配演示:

    #include <Arduino.h> 
    void logMemory() 
    { log_d("Used PSRAM: %d", ESP.getPsramSize() - ESP.getFreePsram()); 
    } 
    void setup() 
    { logMemory(); byte* psdRamBuffer = (byte*)ps_malloc(500000); logMemory(); free(psdRamBuffer); logMemory(); 
    } 
    void loop(){}

    运行代码会在串行控制台上显示以下内容:

    [D][esp32-hal-psram.c:47] psramInit(): PSRAM enabled 
    [D][main.cpp:4] logMemory(): Used PSRAM: 0 
    [D][main.cpp:4] logMemory(): Used PSRAM: 500000 
    [D][main.cpp:4] logMemory(): Used PSRAM: 0

    恭喜,您刚刚成功地在外部PSRAM中分配了内存!

    关于PSRAM的更多信息

    如果您想了解更多有关PSRAM的信息,打开ESP32/Arduino平台下的esp32-hal-psram.c文件。在这个文件里,可以看到下面的函数:

    bool psramFound(); 
    void *ps_malloc(size_t size); 
    void *ps_calloc(size_t n, size_t size); 
    void *ps_realloc(void *ptr, size_t size);

    实际应用中,可以使用psramFound()检查伪ram是否可用,而不是检查可用外部内存的大小。

  4. 参考原文:ESP32 - How To Use PSRAM • ThingPulse

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

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

相关文章

HOOPS Visualize:工业级3D可视化SDK,打造移动端和PC端工程应用程序

HOOPS Visualize是一种高性能的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;旨在帮助开发人员轻松构建和集成高质量的3D可视化功能。这是一种全功能的&#xff0c;以工程为重点的场景图技术&#xff0c;我们称为Core Graphics。Core Graphics可集成到一个框架中&…

uniapp高性能图片裁剪插件,可添加水印

效果图&#xff1a; 插件地址&#xff1a;高性能图片裁剪&#xff0c;裁剪图片后自动添加水印 - DCloud 插件市场 示例&#xff1a; <template> <view><button click"select">选择图片</button><image mode"widthFix" :src&qu…

鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main ()

这应该是系列篇最难写的一篇&#xff0c;全是汇编代码&#xff0c;需大量的底层知识&#xff0c;涉及协处理器&#xff0c;内核镜像重定位&#xff0c;创建内核映射表&#xff0c;初始化 CPU 模式栈&#xff0c;热启动&#xff0c;到最后熟悉的 main() 。 内核入口 在链接文件…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

LQ杯当时的WP

RC4 32位程序用IDA打开看看 进行反汇编 RC4提示&#xff0c;就是一个加密 在sub_401005函数中找到输出的变量&#xff0c;并且立下断点 动调 Packet 字符串搜索flag 看到是给192.168.11.128发送了cat flag的命令 看到它回传 Base64加密了 解一下密码就可以 CC 密码这…

2024年【电工(高级)】考试题及电工(高级)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;高级&#xff09;考试题是安全生产模拟考试一点通总题库中生成的一套电工&#xff08;高级&#xff09;考试报名&#xff0c;安全生产模拟考试一点通上电工&#xff08;高级&#xff09;作业手机同步…

如何快速在线做视频二维码?在线视频生码的3步操作技巧

现在很多人会选择生成二维码的方式来查看视频内容&#xff0c;将视频生成二维码后分享给其他人在手机扫码查看&#xff0c;有利于提升视频内容传播的速度&#xff0c;提高用户获取视频的便捷性。视频二维码有很多的用途可以使用&#xff0c;比如使用教程、个人展示、产品介绍、…

漫谈AI时代的手机

以chatGPT 为代表的大语言的横空出世使人们感受到AI 时代的到来&#xff0c;大语言模型技术的最大特点是机器能”懂人话“&#xff0c;”说人话“了。如同历史上任何一个革命性工具的出现一样&#xff0c;它必将对人类生活和工作产生巨大的影响。 在这里。我们不妨畅想一下啊AI…

【C++语言】动态内存管理

文章目录 前言内存管理数据存储位置C语言动态内存管理方式C动态内存管理方式&#xff1a;new/deleteoperator new与operator delete函数new和delete的实现原理定位new表达式&#xff08;了解&#xff09;常见面试题 总结C语言系列学习目录 前言 本章要介绍的是动态内存管理&am…

网络工程师----第二十七天

计算机基 第四章&#xff1a;网络层 网络层提供服务的特点&#xff1a;网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务&#xff0c;不保证可靠通信。 网际协议IP&#xff1a; *地址解析协议ARP(Address Resolution Protocol) *网际控制报文协议ICMP(Inter…

Android 集成Bugly完成线上的异常Exception收集及处理

文章目录 &#xff08;一&#xff09;添加产品APP&#xff08;二&#xff09;集成SDK&#xff08;三&#xff09;参数配置权限混淆 &#xff08;四&#xff09;初始化 &#xff08;一&#xff09;添加产品APP 一&#xff09;在个人头像 -> 我的头像 -> 新建产品 二&…

【Pytorch】7.使用Module模块搭建简易神经网络

什么是Moudel模块 torch.nn中的module是PyTorch中用于构建神经网络模型的基本单元。它包含了各种神经网络层、激活函数、损失函数等&#xff0c;可以通过组合不同的module来构建复杂的神经网络模型。每个module都包含了参数和方法&#xff0c;可以进行前向传播和反向传播等操作…