我正在对我的固件(全新但接近开发完成)内存管理进行故障排除:它在带有 WROVER 模块的定制 PCB 上运行。
我想利用额外的 PSRAM/SPIRAM,以便库自动使用 PSRAM。
但我怀疑这是否按我的预期工作。
因此,我想确保以下功能确实被触发,正如我从 platformio.ini 中询问的那样:
[更新]
根据 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
是多余的);我可以从我的固件中运行任何代码吗?
非常欢迎有关 PSRAM 使用的任何提示。
根据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());
}
请注意,单次分配应该优先选择外部内存时存在一个阈值,当分配的大小小于阈值时,分配器将首先尝试内部内存。阅读文档了解更多详细信息。