Я борюсь с библиотекой ESP32.
Предполагаю, что модуль ESP32, который я использую, имеет встроенную PSRAM объемом 2 МБ.
Я написал тестовый код, чтобы проверить его работу:< /p>
void setup()
{
Serial.begin(115200);
while (!Serial);
вот результат:
[ 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
Я борюсь с библиотекой ESP32. Предполагаю, что модуль ESP32, который я использую, имеет встроенную PSRAM объемом 2 МБ. Я написал тестовый код, чтобы проверить его работу:< /p> void setup() { Serial.begin(115200); while (!Serial);
вот результат: [ 314][I][main.cpp:98] setup(): Available PSRAM: 2095103 bytes [ 365][I][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][I][Audio.cpp:43] init(): Available PSRAM: 2040835 bytes [ 351][I][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][I][Audio.cpp:45] init(): Available PSRAM: 0 bytes 0x3f80dbfc
Моя среда разработки: [list] [*]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 [/list] Что может вызвать такое странное поведение? Вот мой полный тестовый код: #include #include #include #include