ESP32 OTA: Update.begin() приводит к бесконечным перезагрузкам

Я изучаю здесь обновление прошивки OTA для ESP32. Для моего приложения я не могу использовать веб-сервер для загрузки прошивки, но я собираюсь настроить внешний сервер для предоставления FTP или других методов загрузки.

Поэтому я пытаюсь понять, как работает библиотека обновлений. Я добавил в свое приложение всего две строки кода:

    #include <Update.h>
    
    void setup()
    {
      Serial.begin(115200);
      Serial.println(Update.begin());
      ...
    }

но когда я запускаю этот код на своей плате ESP32, я получаю бесконечные циклы перезагрузок:

rst:0x1 (POWERON_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:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:5828
entry 0x400806a8
/home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/queue.c:621 (xQueueTakeMutexRecursive)- assert failed!
abort() was called at PC 0x40089d67 on core 0

ELF file SHA256: 0000000000000000

Backtrace: 0x40088c68:0x3ffe39d0 0x40088ee5:0x3ffe39f0 0x40089d67:0x3ffe3a10 0x4011e97d:0x3ffe3a30 0x400848bc:0x3ffe3a50 0x4008436f:0x3ffe3a70 0x4011e4fd:0x3ffe3a90 0x40113432:0x3ffe3ab0 0x401134a6:0x3ffe3ad0 0x400d777c:0x3ffe3af0 0x400d3632:0x3ffe3b20 0x400d250e:0x3ffe3b40 0x400d4c82:0x3ffe3b90 0x400f5847:0x3ffe3bb0 0x40082989:0x3ffe3bd0 0x40082bb8:0x3ffe3c20 0x40079247:0x3ffe3c40 0x400792ad:0x3ffe3c70 0x400792b8:0x3ffe3ca0 0x40079465:0x3ffe3cc0 0x400806da:0x3ffe3df0 0x40007c31:0x3ffe3eb0 0x4000073d:0x3ffe3f20

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_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:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:5828
entry 0x400806a8
/home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/queue.c:621 (xQueueTakeMutexRecursive)- assert failed!
abort() was called at PC 0x40089d67 on core 0

ELF file SHA256: 0000000000000000

Backtrace: 0x40088c68:0x3ffe39d0 0x40088ee5:0x3ffe39f0 0x40089d67:0x3ffe3a10 0x4011e97d:0x3ffe3a30 0x400848bc:0x3ffe3a50 0x4008436f:0x3ffe3a70 0x4011e4fd:0x3ffe3a90 0x40113432:0x3ffe3ab0 0x401134a6:0x3ffe3ad0 0x400d777c:0x3ffe3af0 0x400d3632:0x3ffe3b20 0x400d250e:0x3ffe3b40 0x400d4c82:0x3ffe3b90 0x400f5847:0x3ffe3bb0 0x40082989:0x3ffe3bd0 0x40082bb8:0x3ffe3c20 0x40079247:0x3ffe3c40 0x400792ad:0x3ffe3c70 0x400792b8:0x3ffe3ca0 0x40079465:0x3ffe3cc0 0x400806da:0x3ffe3df0 0x40007c31:0x3ffe3eb0 0x4000073d:0x3ffe3f20

Rebooting...

Глядя на код функции begin (), он должен вернуть сообщение об ошибке, если что-то пойдет не так.

Есть ли что-нибудь, что я пропустил перед использованием этой функции?

, 👍0

Обсуждение

'Update.begin()` следует запускать при запуске обновления, а не в начале скетча..., @Majenko

Я знаю это, но комментарии в заголовке говорят: "Позвоните, чтобы проверить пространство, необходимое для обновления. Вернет false, если не хватает места"., @Mark

Затем вы должны передать ему размер обновления, который вы не можете знать, пока не начнете обновление. Вы должны разобрать исходный код библиотеки ArduinoOTA, чтобы увидеть, как он это делает., @Majenko

@Majenko, я извиняюсь, но объявление функции: bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL); таким образом, значение size определяется по умолчанию, а также пример ArduinoOTA использует то же самое значение UPDATE_SIZE_UNKNOWN при вызове этой функции., @Mark