VSCode 平台的 ESP32 SPIRAM / PSRAM 管理

问题描述 投票:0回答:1

我正在对我的固件(全新但接近开发完成)内存管理进行故障排除:它在带有 WROVER 模块的定制 PCB 上运行。

我想利用额外的 PSRAM/SPIRAM,以便库自动使用 PSRAM。

但我怀疑这是否按我的预期工作。

因此,我想确保以下功能确实被触发,正如我从 platformio.ini 中询问的那样:

  • 考虑SPIRAM;
  • 所有库都利用它。

[更新]

根据 Espressif 文档 (https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/external-ram.html#external-ram-config-malloc),这应该是默认行为(通过 malloc() 提供外部 RAM(默认)

这是我的

platformio.ini

[env:esp32dev]
platform = espressif32
board = esp-wrover-kit
;esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = 
    adafruit/Adafruit NeoPixel@^1.10.0
    plerup/EspSoftwareSerial@^6.13.2
    lbernstone/Tone32@^1.0.0
    miwagner/ESP32CAN@^0.0.1


board_build.partitions = huge_app.csv
;no_ota.csv
extra_scripts = pre:build_script_versioning.py

build_flags = 
    -DBOARD_HAS_PSRAM
    -mfix-esp32-psram-cache-issue
    -DCONFIG_MBEDTLS_DYNAMIC_BUFFER=1
    -DCONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=1
    -DCONFIG_SPIRAM_CACHE_WORKAROUND=1

以及与我的 ESP32 WROVER 相关的信息:

b1453|—|🌩 nano: Firmware v0.1 (build 1453) by Sdl
b1453|—|🌩 nano: -- only suited for PCB REV 3 --
b1453|—|🌩 nano: Free heap size: 212076
b1453|—|🌩 nano: Min free heap size: 206600
b1453|—|🌩 nano: Max alloc heap size: 113792
b1453|—|🌩 nano: PsRam size: 4194252
b1453|—|🌩 nano: Runing on chip:
b1453|—|🌩 nano: - model 1 (1 is ESP32)
b1453|—|🌩 nano: - rev. 1
b1453|—|🌩 nano: Chip has the following features:
b1453|—|🌩 nano: - has flash. 0
b1453|—|🌩 nano: - has 2.4GHz. 1
b1453|—|🌩 nano: - has BLE. 1
b1453|—|🌩 nano: - has BT classic. 1

[更新]

正如您在我的 platformIo ini 文件中看到的,我使用以下标志:

  • -mfix-esp32-psram-cache-issue
    :传递给gcc类似于
    CONFIG_SPIRAM_CACHE_WORKAROUND=1
  • -DCONFIG_MBEDTLS_DYNAMIC_BUFFER=1
    :这应该告诉 mbedTLS 使用 malloc 分配缓冲区,因此使用我的 PSRAM;
  • -DCONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=1
    :这应该让蓝牙使用 PSRAM 进行自己的分配;
  • -DCONFIG_SPIRAM_CACHE_WORKAROUND=1
    :这与第一点类似(因此可能与
    -mfix-esp32-psram-cache-issue
    是多余的);
  1. 我如何确保考虑到上述每个标志。
  2. 此外,例如,我如何确保iot模块实际上从PSRAM分配TLS?

我可以从我的固件中运行任何代码吗?

非常欢迎有关 PSRAM 使用的任何提示。

esp32 arduino-esp32 psram
1个回答
3
投票

根据Espressif文档,有四种使用PSRAM的方法。如果你想显式地使用 PSRAM 来存储某些内容,则需要使用

ps_malloc()
来分配内存。这个简单的草图将显示 PSRAM 内存分配之前、之后以及释放内存之后从 PSRAM 分配内存的情况。

void setup() {
  log_d("Used PSRAM: %d", ESP.getPsramSize() - ESP.getFreePsram());  
  byte* psdRamBuffer = (byte*)ps_malloc(500000);
  log_d("Used PSRAM: %d", ESP.getPsramSize() - ESP.getFreePsram());
  free(psdRamBuffer);
  log_d("Used PSRAM: %d", ESP.getPsramSize() - ESP.getFreePsram());
}

请注意,单次分配应该优先选择外部内存时存在一个阈值,当分配的大小小于阈值时,分配器将首先尝试内部内存。阅读文档了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.