Обнуление PSRAM, очевидно, потребляет всю памятьC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обнуление PSRAM, очевидно, потребляет всю память

Сообщение Anonymous »

Я борюсь с библиотекой ESP32.
Предполагаю, что модуль ESP32, который я использую, имеет встроенную PSRAM объемом 2 МБ.
Я написал тестовый код, чтобы проверить его работу:< /p>
void setup()
{
Serial.begin(115200);
while (!Serial);

log_i("Available PSRAM: %lu bytes", (long unsigned int)ESP.getFreePsram());
uint8_t *b = (uint8_t*)ps_calloc(655350, sizeof(uint8_t));
log_i("Available PSRAM: %lu bytes, %p", (long unsigned int)ESP.getFreePsram(), b);
}

вот результат:
[ 314][main.cpp:98] setup(): Available PSRAM: 2095103 bytes
[ 365][main.cpp:100] setup(): Available PSRAM: 1439735 bytes, 0x3f800800

Затем выделяется память (даже с добавлением 18 байт, я думаю, из-за некоторых накладных расходов).
В библиотеке есть тот же самый код, строка № 43:
р>
size_t AudioBuffer::init() {
if(m_buffer) free(m_buffer);
m_buffer = NULL;
if(psramInit() && m_buffSizePSRAM > 0) { // PSRAM found, AudioBuffer will be allocated in PSRAM
m_f_psram = true;
m_buffSize = m_buffSizePSRAM;
m_buffer = (uint8_t*)ps_calloc(m_buffSize, sizeof(uint8_t));
m_buffSize = m_buffSizePSRAM - m_resBuffSizePSRAM;
}
if(m_buffer == NULL) { // PSRAM not found, not configured or not enough available
m_f_psram = false;
m_buffer = (uint8_t*)heap_caps_calloc(m_buffSizeRAM, sizeof(uint8_t), MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
m_buffSize = m_buffSizeRAM - m_resBuffSizeRAM;
}
if(!m_buffer) return 0;
m_f_init = true;
resetBuffer();
return m_buffSize;
}

где m_buffSize на самом деле равно 655350 (я проверил это во время выполнения).
Я немного изменил код следующим образом:
if(psramInit() && m_buffSizePSRAM > 0) { // PSRAM found, AudioBuffer will be allocated in PSRAM
m_f_psram = true;
m_buffSize = m_buffSizePSRAM;
log_i("Available PSRAM: %lu bytes", (long unsigned int)ESP.getFreePsram());
m_buffer = (uint8_t*)ps_calloc(m_buffSize, sizeof(uint8_t));
log_i("Available PSRAM: %lu bytes %p", (long unsigned int)ESP.getFreePsram(), m_buffer);
m_buffSize = m_buffSizePSRAM - m_resBuffSizePSRAM;
}

и вот результат:
[ 343][Audio.cpp:43] init(): Available PSRAM: 2040835 bytes
[ 351][Audio.cpp:45] init(): Available PSRAM: 0 bytes 0x3f80dbfc

Я также пытался использовать malloc вместо calloc, чтобы выделенная область не обнулялась. В этом случае он возвращает правильный доступный размер, но, конечно, код больше не будет работать. Если я обнулю память после:
m_buffer = (uint8_t*)ps_malloc(m_buffSize);
memset(m_buffer, 0, m_buffSize);
log_i("Available PSRAM: %lu bytes, %p", (long unsigned int)ESP.getFreePsram(), m_buffer);

он ​​возвращается к прежнему поведению:
[ 351][Audio.cpp:45] init(): Available PSRAM: 0 bytes 0x3f80dbfc

Моя среда разработки:
  • Ubuntu 24.10
  • Visual Studio Code 1.95.3
  • PlatformIO 6.1.16
  • Espressif 32 (6.9.0)
  • Аппаратное обеспечение: DFRobot Firebeetle 2 ESP32-E N16R2
  • Компилятор:toolchain-xtensa-esp32 8.4.0

Что может вызвать такое странное поведение?
Вот мой полный тестовый код:
#include
#include
#include
#include

#include "Audio.h"

#define PIN_SPI_SCK 18
#define PIN_SPI_MISO 19
#define PIN_SPI_MOSI 23
#define PIN_SD_CS 2

#define PIN_I2S_BCLK 25
#define PIN_I2S_LRC 26
#define PIN_I2S_DOUT 9

Audio audio;

void audio_process_i2s(int16_t *outBuff, uint16_t validSamples, uint8_t bitsPerSample, uint8_t channels, bool *continueI2S)
{
log_i("%d", validSamples);
*continueI2S = false;
}

void audio_info(const char *info)
{
log_i("%s", info);
}

void setup()
{
Serial.begin(115200);
while (!Serial);

uint32_t flashSize = ESP.getFlashChipSize();
Serial.printf("Flash Size: %u bytes\n", flashSize);
uint32_t psramSize = ESP.getPsramSize();
Serial.printf("PSRAM Size: %u bytes\n", psramSize);
uint32_t freeMemory = ESP.getFreeHeap();
Serial.printf("Free Memory: %u bytes\n", freeMemory);
uint32_t Totalheap = ESP.getHeapSize();
Serial.printf("Total heap: %u bytes\n", Totalheap);
uint32_t FreePSRAM = ESP.getFreePsram();
Serial.printf("Free PSRAM: %u bytes\n", FreePSRAM);

SPI.setFrequency(1000000);
SPI.begin(PIN_SPI_SCK, PIN_SPI_MISO, PIN_SPI_MOSI, PIN_SD_CS);
if (SD.begin(PIN_SD_CS)) Serial.println("SD card mounted!");
else Serial.println("Failed to mount SD card");

File root = SD.open("/");
audio.setPinout(PIN_I2S_BCLK, PIN_I2S_LRC, PIN_I2S_DOUT);
audio.setVolume(15);
audio.connecttoFS(SD, "songs/bach.mp3");
}

void loop()
{
audio.loop();
vTaskDelay(1);
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... all-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»