Метеостанция на ESP32 не влезла в плату на третьей итерации: к мигалке добавились дисплей, обработка датчиков и веб-страница, и лог сборки закончился строкой Sketch too big — хотя флеша на модуле четыре мегабайта, а скетчу требовалось всего два с половиной. Разгадка в разметке: из четырёх мегабайт под программу живёт не всё, и ровно сколько — решает список Partition Scheme в меню Tools.
Пакет плат и его установка были в уроке про Boards Manager, первый скетч — в уроке про мигалку на ESP32. Здесь спускаемся на этаж ниже: Tools → Partition Scheme и соседние ручки Flash Size, Upload Speed, Core Debug Level, карта четырёх мегабайт по разделам и цена каждого мегабайта кода.
Тема звучит системно-скучно, а стоит минут: одна строчка в выпадающем списке отличает «скетч не собирается» от «собрался и влез с запасом». И наоборот: выбранная без нужды Huge APP отнимает у проекта место под файлы и обновление по воздуху, о котором вы вспомните через полгода — когда перезаливать через кабель станет лень.
Почему тема живёт в разделе про среду: разметка меняется не кодом, а списком в Tools, и для большинства это первая встреча с тем, что «плата» — не монолит. На Uno такой вопрос не встаёт: флеш в 32 КБ размечен раз и навсегда, загрузчик в начале, скетч — всё остальное. У ESP32 разметка — часть сборки, и поменять её так же легко, как сменить скорость порта.
Карта четырёх мегабайт
Флеш ESP32 размечается таблицей разделов — и это не выдумка производителей, а механика обновлений: приложение занимает два слота, app0 и app1, по 1,25 МБ каждый, и при обновлении по воздуху новая прошивка пишется в свободный слот, а старая остаётся страховкой. Первые 64 КБ отведены загрузчику, самой таблице и NVS — хранилищу настроек, которое переживает перезагрузки. Всё, что осталось, по умолчанию забирает SPIFFS — файловая система для страниц веб-интерфейса, конфигов и логов.
Строку Default 4MB with spiffs расшифровывает подпись в самом списке: примерно 1,2 МБ на приложение (в двух слотах) и 1,5 МБ на файлы. Для обычного скетча с WiFi и парой датчиков этой разметки хватает с запасом — мои телеметрические проекты живут в 400–700 КБ бинарника. Задыхается разметка на проектах с дисплейными шрифтами, картинками и встроенным веб-сервером: 1,2 МБ кода кончаются быстрее, чем кажется.
Почему нельзя просто «дать больше коду»: при OTA прошивка занимает один из двух слотов, и второй обязан существовать физически. Схемы без OTA рушат эту конструкцию и отдают освободившееся коду — дальше по списку видно, чем заплатили: файлами или обновлениями.
Таблицу разделов не видно глазами, но она влезает в лог с подробным выводом сборки: среда печатает команду записи с путём к csv-файлу выбранной схемы. Эти файлы лежат в пакете ядра, и любопытный читает их как обычную таблицу: имя, тип, адрес, размер. Меня это в своё время успокоило — никакой магии, четыре мегабайта дележа, расписанные построчно.
Huge APP (3MB No OTA) — главный ход: один сплошной слот примерно на 3 МБ под код, файловой системе остаётся около 1 МБ, обновления по воздуху исчезают совсем — второго слота нет. Minimal SPIFFS (1.9MB APP with OTA) — компромисс наоборот: код растёт до 1,9 МБ, OTA сохраняется, а под файлы остаётся около 190 КБ — хватит на пару настроек и не хватит на страницу с картинками. No OTA (2MB APP/2MB SPIFFS) — честная половина: два мегабайта коду, два файлам, без обновлений.
Выбор — вопрос приоритетов, а не «какая круче»: нужны OTA и файлы — живёте в Default и ужимаете код; файлы не нужны, а код толстый — Huge APP; файлы нужны минимально, а код подрос — Minimal SPIFFS. Смена схемы — это прошивка новой таблицы разделов, и содержимое старой файловой системы после неё перестаёт читаться корректно: данные из SPIFFS перед переездом выкачивайте.
Отдельный сюжет — платы с 8 и 16 МБ: у них список схем шире, вплоть до двух слотов OTA по 3 МБ и просторной файловой системы, и делёж можно вести не считая каждый килобайт. Я как-то купил «DevKit на 16 МБ» по дешёвке, а флеш там оказался двухмегабайтный — сборка под 8 МБ прошла, а плата перезагружалась на первой записи. С тех пор маркировку чипа памяти смотрю до покупки, а не после.
Ещё одна деталь, которую видно в логе сборки: среда печатает занятые и свободные байты по разделам. Привычка читать эту строку после каждой сборки заменяет половину догадок: видно, сколько кода прибавила новая библиотека и сколько осталось до потолка текущей схемы.
| Схема (флеш 4 МБ) | Под код | Под файлы | OTA |
|---|---|---|---|
| Default 4MB with spiffs | около 1,2 МБ (два слота) | около 1,5 МБ | да |
| Huge APP (3MB No OTA) | около 3 МБ | около 1 МБ | нет |
| Minimal SPIFFS (1.9MB APP with OTA) | около 1,9 МБ | около 190 КБ | да |
| No OTA (2MB APP/2MB SPIFFS) | 2 МБ | 2 МБ | нет |
// ESP32: posle sborki sreda pechataet razmery razdelov v log,// a iz programmy vidno zamer cherez API: razmer koda i SPIFFS.#include <SPIFFS.h> void setup() { Serial.begin(115200); if (!SPIFFS.begin(true)) { Serial.println("SPIFFS ne podnyalsya - prover Partition Scheme"); return; } Serial.print("kod: "); Serial.print(ESP.getSketchSize() / 1024); Serial.println(" KB"); Serial.print("svobodno pod kod: "); Serial.print(ESP.getFreeSketchSpace() / 1024); Serial.println(" KB"); Serial.print("fajly: "); Serial.print(SPIFFS.usedBytes() / 1024); Serial.print(" iz "); Serial.print(SPIFFS.totalBytes() / 1024); Serial.println(" KB");} void loop() { delay(1000);}Tools-меню: ручки сборки
Flash Size — сколько флеша на модуле. У большинства DevKit честные 4 МБ, встречаются версии на 8 и 16 — у них список схем шире, с запасом на два-три слота. Ставить больше, чем реально распаяно, нельзя: часть прошивки молча не запишется, и плата будет уходить в перезагрузку на ровном месте. Сомневаетесь, что за модуль в руках, — начните с 4 МБ, это безопасный минимум, и гляньте маркировку чипа памяти на плате.
Upload Speed отвечает за скорость заливки: 921600 бод стоит по умолчанию и шьёт мегабайтный бинарник за десятки секунд, 115200 — тот же файл за минуту с лишним. Ронять скорость стоит только при капризном тракте: если заливка падает по таймауту посреди записи, виноваты кабель или хаб в девяти случаях из десяти, и 115200 маскирует беду вместо того, чтобы лечить её. Мой порядок при таймаутах: сменить кабель, воткнуть напрямую в материнку, снизить до 460800 — и только потом 115200. Список идёт от 115200 до 921600, и чем выше цифра, тем требовательнее тракт.
Core Debug Level включает логи ядра: None по умолчанию, дальше Error, Warn, Info, Debug и Verbose. Печатается всё в Serial на 115200 — это не ваши print-ы, а сообщения WiFi-стека и файловой системы. Уровень Info спасал мне вечера на загадочных переподключениях WiFi: ядро само объясняло, что происходит. Verbose оставляю только на похоронах — десятки строк в минуту, и на рабочей плате этот поток глушит ваш же лог. Остальные ручки среды разобрали в уроке про настройки IDE.
Смена схемы стирает не код, а мир вокруг: файловая система размечается заново, и всё, что вы хранили в SPIFFS, после первой прошивки с новой таблицей перестаёт читаться. Мои страницы веб-интерфейса перед переездом я выкачиваю на диск и заливаю заново через Sketch Data Upload — занятие на десять минут, если файлы лежат в папке data проекта, и потеря вечера, если лежали только в плате.
Типовые сценарии и мой выбор: рабочий проект без файловой системы — Default, спокойный сон: OTA пригодится чаще, чем третий мегабайт кода. Дисплейный терминал с шрифтами — Huge APP, обновления для него всё равно идут кабелем. Метеостанция с архивом на флеше — No OTA 2/2, потому что данные ценнее обновлений по воздуху. Ни одна схема не «лучшая»: каждая — ставка на то, что дороже именно в этом проекте.
И про переносимость: схема разделов привязана к бинарнику, поэтому экспортированный файл собранной прошивки (Sketch → Export Compiled Binary) подходит только к схеме, при которой собирался. Для стенда с несколькими платами я держу на каждую схему свой экспорт — путаница «какой файл для какой платы» рассасывается именем папки. Детали экспорта разбирали в уроке про бэкап и export binary, а перед заливкой на живую плату пройдитесь по чек-листу перед загрузкой.
Если схема меняется часто, заведите привычку: перед каждой сменой — Show Sketch Folder и копия папки data на диск. Десять секунд копирования против десяти минут перезаливки страниц через Sketch Data Upload — арифметика, которая в третий раз уже не радует. Для проектов с большой файловой системой я держу два скетча-близнеца под разные схемы и не переключаюсь на лету.
- 1. Сколько кода даёт Default 4MB with spiffs?
- 2. Скетч 2,6 МБ, файлы и OTA не нужны. Что выбрать?
- 3. Что теряете при переходе на Huge APP?
- 4. Core Debug Level Info делает что?
- 5. Заливка падает по таймауту на 921600. Первое действие?
- Default 4MB: около 1,2 МБ на код в двух слотах OTA и 1,5 МБ на файлы.
- Huge APP отдаёт коду около 3 МБ и снимает OTA; Minimal SPIFFS даёт 1,9 МБ с OTA, но 190 КБ файлам.
- Sketch too big — это потолок APP-раздела текущей схемы, а не флеша вообще; ответ — сменить схему или ужать код.
- Смена схемы переразмечает флеш: содержимое SPIFFS перестаёт читаться — данные выкачивайте заранее.
- Upload Speed 921600 стоит по умолчанию; таймауты заливки — кабель и хаб, а не всегда скорость.
Частые вопросы по теме урока
- Сколько кода даёт Default 4MB with spiffs?
- Два слота по 1,25 МБ под OTA плюс 1,5 МБ на файлы — подпись со схемой видна прямо в списке Tools. около 1,2 МБ в двух слотах
- Скетч 2,6 МБ, файлы и OTA не нужны. Что выбрать?
- Huge APP отдаёт коду около 3 МБ. Default даёт 1,2 МБ, Minimal — 1,9 МБ: оба меньше 2,6 МБ. Huge APP (3MB No OTA)
- Что теряете при переходе на Huge APP?
- Один слот под код — OTA физически не куда писать, а файлам остаётся около 1 МБ вместо полутора. обновления по воздуху и большую часть файловой системы
- Core Debug Level Info делает что?
- Это уровень сообщений ядра в Serial на 115200: Info рассказывает о подключениях и событиях, Verbose глушит ваш лог. печатает логи ядра WiFi и файловой системы в Serial
- Заливка падает по таймауту на 921600. Первое действие?
- Таймауты посреди записи в девяти случаях из десяти — кабель или хаб. 115200 маскирует беду, а не лечит. проверить кабель и упасть до 115200