| ESP-IDF OTA, Warning: Checksum mismatch between flashed and built applications |
|
| Добавил(а) microsin | |||||||||
|
После успешной перепрошивки OTA и перезагрузки в логе появляется сообщение о несовпадении контрольных сумм загруженной и только что скомпилированной прошивки: SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce2820,len:0x15a0
load:0x403c8700,len:0x4
load:0x403c8704,len:0xc80
load:0x403cb700,len:0x2f64
entry 0x403c8914
I (26) boot: ESP-IDF v5.4.1-dirty 2nd stage bootloader
I (26) boot: compile time Jul 28 2026 06:30:07
I (26) boot: Multicore bootloader
I (27) boot: chip revision: v0.2
I (27) boot: efuse block revision: v1.3
I (27) boot.esp32s3: Boot SPI Speed : 80MHz
I (27) boot.esp32s3: SPI Mode : DIO
I (27) boot.esp32s3: SPI Flash Size : 16MB
I (27) boot: Enabling RNG early entropy source...
I (28) boot: Partition Table:
I (28) boot: ## Label Usage Type ST Offset Length
I (28) boot: 0 nvs WiFi data 01 02 00009000 00004000
I (29) boot: 1 otadata OTA data 01 00 0000d000 00002000
I (29) boot: 2 phy_init RF data 01 01 0000f000 00001000
I (29) boot: 3 ota_0 OTA app 00 10 00010000 00300000
I (30) boot: 4 ota_1 OTA app 00 11 00310000 00300000
I (30) boot: 5 www Unknown data 01 82 00610000 00200000
I (31) boot: 6 options Unknown data 01 82 00810000 00001000
I (31) boot: 7 blob Unknown data 01 99 00811000 00080000
I (31) boot: End of partition table
I (74) esp_image: segment 0: paddr=00310020 vaddr=3c0f0020 size=4e868h (321640) map
I (132) esp_image: segment 1: paddr=0035e890 vaddr=3fc9b700 size=01788h ( 6024) load
I (134) esp_image: segment 2: paddr=00360020 vaddr=42000020 size=ea544h (959812) map
I (304) esp_image: segment 3: paddr=0044a56c vaddr=3fc9ce88 size=0341ch ( 13340) load
I (307) esp_image: segment 4: paddr=0044d990 vaddr=40374000 size=176e0h ( 95968) load
I (328) esp_image: segment 5: paddr=00465078 vaddr=600fe100 size=0001ch ( 28) load
I (338) boot: Loaded app from partition at offset 0x310000
I (338) boot: Disabling RNG early entropy source...
I (339) cpu_start: Multicore app
I (348) cpu_start: Pro cpu start user code
I (348) cpu_start: cpu freq: 160000000 Hz
I (348) app_init: Application information:
I (348) app_init: Project name: nsu
I (349) app_init: App version: c8dae39-dirty
I (349) app_init: Compile time: Jul 28 2026 06:29:54
I (349) app_init: ELF file SHA256: 9e9904d50...
Предупреждающее сообщение генерируется не на устройстве, а хост-инструментом ESP-IDF Monitor. Происходит следующее: ┌─────────────────────────────────────────────────────────────────────┐ │ Хост (ESP-IDF Monitor / idf.py monitor) │ │ │ │ 1. Читает из COM-порта: │ │ I (349) app_init: ELF file SHA256: 9e9904d50... │ │ ↑ Это устройство (печатает встроенный в прошивку хеш) │ │ │ │ 2. Парсит SHA256 из строки → "flashed_sha256" │ │ │ │ 3. Считывает ELF из build/nsu.elf → вычисляет SHA256 │ │ → "built_sha256" = 865014ea12208ae02e46fd1375c12bec... │ │ │ │ 4. Сравнивает: │ │ flashed_sha256 (с устройства) == built_sha256 (из build dir)? │ │ 9e9904d50... ≠ 865014ea... → ❌ MISMATCH │ │ │ │ 5. Печатает хост-сообщение (--- = host output): │ │ --- Warning: Checksum mismatch between flashed and built │ │ applications. Checksum of built application is 865014ea... │ └─────────────────────────────────────────────────────────────────────┘ Источник — esp_idf_monitor/base/serial_handler.py, строки 259–283: def get_flashed_sha256(self, line: str) -> Optional[str]: # Парсит из строки устройства "ELF file SHA256: Почему хеши различаются:
Прошивки различаются, потому что: ● OTA обновляет прошивку, в ней свой хеш. Вывод: это не ошибка, а предупреждение от монитора. Оно означает: «Прошивка, запущенная на устройстве, не совпадает с последним ELF-файлом, который собирается на этом хосте». После OTA это абсолютно нормально и ожидаемо. Сообщение можно игнорировать — оно появляется только в режиме монитора и не влияет на работу устройства. [Как убрать предупреждение] Такое сообщение часто возникает в процессе разработки приложения, и на него не стоит обращать внимания. Однако если вы по какой-то причине хотите избежать этих сообщений, есть два пути: ● Вариант A — перепрошить устройство по USB (тогда хеши совпадут): idf.py -p /dev/ttyUSB0 flash monitor ● Вариант B — отключить проверку в ESP-IDF Monitor. В sdkconfig.defaults: CONFIG_APP_RETRIEVE_LEN_ELF_SHA=0 Это уберёт встраивание ELF SHA256 в прошивку, как следствие Монитор не сможет провести сравнение. Но тогда пропадёт и строка ELF file SHA256 в логе загрузки. [Ссылки] 1. ESP-IDF FAQ. |