Ошибка выполнения ESP32 в массиве 2d

Я пытаюсь последовательно вывести значение b[0][0].

Должен быть равен нулю, но это не работает!

Вот код

void setup() {
  Serial.begin(115200);
  byte b[321][241];
  Serial.println(b[0][0]);
}

void loop() {

}

Если массив небольшой, как b[2][2], он не работает

Теоретически esp32 имеет оперативную память объемом 520 КБ SRAM, так что может ли это быть проблемой?

Вот код ошибки

rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8

Код соответствует требованиям, но возникает ошибка при запуске esp32

версия esp32 для arduino — 1.0.4

, 👍0

Обсуждение

как насчет b[2][241] или b[321][2] ?, @jsotola

Размер стека обычно намного меньше оперативной памяти, особенно если он работает под RTOS, поэтому я ожидаю проблем с ним., @KIIV

@jsotola для b[321][2] я получаю значение 165 в качестве вывода, разве оно не должно быть равно нулю, также для b[2][241] равно 165, @Avon97


2 ответа


Лучший ответ:

2

В ESP32 для запуска всего используется FreeRTOS, в том числе API Arduino. Ваш код выполняется в собственном потоке ("loopTask"), и этой задаче по умолчанию выделено 8192 байта стека.

xTaskCreateUniversal(loopTask, "loopTask", 8192, NULL, 1, &loopTaskHandle, CONFIG_ARDUINO_RUNNING_CORE);

Вы не можете создавать локальные переменные и другие данные стека, которые в сумме превышают 8192 байта.

Вместо этого вам придется либо использовать переменную как глобальную переменную (или статическую локальную), чтобы она размещалась в глобальном сегменте данных, либо использовать new или malloc чтобы создать его в куче (и не забудьте соответствующий вызов delete или free, когда закончите с этим).

,

создание переменной как глобальной, кажется, решает проблему., @Avon97


-1

Это может быть связано с размером последовательного буфера. ESP32 может записывать новые данные до завершения предыдущей передачи. Добавьте задержку после строки печати и посмотрите.

,

нет, это не сработало, @Avon97