|
После успешной перепрошивки 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 в логе загрузки.
[Ссылки]
1. ESP-IDF FAQ. |