Auf meinem ESP32 habe ich 2 Partitionen mit gültigen Firmwares darauf: app0 und app1. Meine ursprüngliche Firmware war auf app0, ich habe die neue Firmware auf app1 hochgeladen und dann das OTA-Update durchgeführt. Ich habe darauf geachtet, die neue Bootpartition mit esp_ota_set_boot_patition auf app1 zu setzen. In der Konsole sah ich, dass die Firmware geflasht wurde und dass es erfolgreich war, da der Code der neuen Firmware ausgeführt wurde. Dann schloss ich die Konsole und lud einen neuen Code in sie hoch. Als ich das tat, sah ich, dass die Boot-Partition immer noch app0 war. Warum ist das so? Ich dachte, nach esp_ota_set_boot_partition speichert die ota-Datenpartition die neue Booteinstellung und bootet danach nur noch in app1?
Vielleicht enthält der Upload rine fehlerhafte Prüfsumme. Was meldet denn der Bootloader beim Neustart?
Update to app1 complete! Switching to app1...
Switched to app1. Rebooting...
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x29 (SPI_FAST_FLASH_BOOT)
Saved PC:0x42029956
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x4bc
load:0x403c9700,len:0xbd8
load:0x403cc700,len:0x2a0c
entry 0x403c98d0
Listing directory: /
FILE: firmware.bin SIZE: 310368
Boot partition: app1
01 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 9A 98 43 47 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Ready!
Die Hex-Werte zeigen die OTA data partition an.
In der neuen Firmware gibt es einen Code, der esp_ota_mark_app_valid_cancel_rollback() aufruft und dann die aktuelle Bootpartition anzeigt (hier Boot partition: app1). Aber wenn ich dann die Konsole schließe und in Platformio auf Upload und Monitor klicke (mit neuem Code, der nur die Boot-Partition anzeigt), steht dort „Boot partition: app0“.
Das OTA-Update wird mit der Funktion PerformOTAUpdate durchgeführt. Sie verwendet eine Datei aus dem SPIFFS-Speicher und schreibt sie auf die app1-Partition. Die Funktion ruft
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
Hier der Code dieser Funktion:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
Der Code der neuen firmware ist eigentlich nur sowas wie
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
Hab die Lösung gefunden: Ich hatte immer gedacht, dass bei einem Upload nur der Code upgeloadet wird. Jedoch wird alles neu formatiert, die Firmware neu raufgespielt, etc. Dabei wird auch die OTA data partition gelöscht / neu initialisiert.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.