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...
--- Warning: Checksum mismatch between flashed and built applications. Checksum of built application is 865014ea12208ae02e46fd1375c12bec07d5c34e4b943e12c8ca9f15f6094b17
I (349) app_init: ESP-IDF: v5.4.1-dirty I (349) efuse_init: Min chip rev: v0.0 I (349) efuse_init: Max chip rev: v0.99 I (350) efuse_init: Chip rev: v0.2 I (350) heap_init: Initializing. RAM available for dynamic allocation: I (350) heap_init: At 3FCA79C0 len 00041D50 (263 KiB): RAM I (350) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM I (350) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM I (351) heap_init: At 600FE11C len 00001ECC (7 KiB): RTCRAM I (352) spi_flash: detected chip: winbond I (352) spi_flash: flash io: dio I (353) sleep_gpio: Configure to isolate all GPIO pins in sleep state I (353) sleep_gpio: Enable automatic switching of GPIO sleep configuration I (354) main_task: Started on CPU0 I (355) main_task: Calling app_main() I (1371) APP: Initializing SPIFFS filesystems... I (1490) APP: SPIFFS partition 'www' mounted at /www I (1490) APP: Partition 'www' size: total: 1920401 bytes, used: 492964 bytes (25.7%) I (1492) APP: SPIFFS partition 'options' mounted at /options I (1492) APP: Partition 'options' size: total: -3514 bytes, used: 502 bytes (0.0%) I (1492) APP: All SPIFFS partitions mounted successfully I (2243) blob_store: Found partition 'blob' at 0x811000, size 524288 bytes ...

Предупреждающее сообщение генерируется не на устройстве, а хост-инструментом 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: "
    elf_sha256_matcher = re.compile(r'ELF file SHA256:\s+(?P[a-z0-9]+)')
    file_sha256_flashed_match = re.search(elf_sha256_matcher, line)
    ...

def compare_elf_sha256(self, line): file_sha256_flashed = self.get_flashed_sha256(line) ... for elf_file in self.elf_files: file_sha256_build = get_sha256(elf_file) # ELF из build/ if file_sha256_flashed in f'{file_sha256_build}': break else: warning_print(f'Checksum mismatch between flashed and built applications. ' f'Checksum of built application is {file_sha256_build}')

Почему хеши различаются:

Шифр Значение Что это
ELF file SHA256 с устройства 9e9904d50... SHA256 ELF-файла, который был прошит на момент последнего USB-флаша
Checksum of built application (хост) 865014ea1... SHA256 текущего ELF-файла в build/nsu.elf

Прошивки различаются, потому что:

● OTA обновляет прошивку, в ней свой хеш.
● На хосте вы пересобрали проект (idf.py build) в нем собран новый файл build/nsu.elf с новым хешем, который проверяет Monitor.
● Монитор сравнивает прошивку на устройстве, которую вы прошили через 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 в логе загрузки.

[Ссылки]

1ESP-IDF FAQ.