logo Оренда жилья Севастополь Меню

Изменение стандартных размеров разделов памяти esp32.

Так случилось, что в процессе написания скетча под есп32 мы можем столкнуться с ошибкой:
text section exceeds available space in board
Скетч использует 1331858 байт (101%) памяти устройства. Всего доступно 1310720 байт.


И все дело может быть не в нашем большом коде, а в сторонних библиотеках которые используются при написании скетча.
Можно в Инструментах->Partition Scheme выбрать например Huge APP (3MB No OTA/1MB SPIFFS) увеличив до 3мб возможный размер скетча.
Но в большинстве очень не хочется отказываться от возможности обновления прошивки через wi-fi убрав раздел OTA.
Тем более что микроконтроллер в большинстве случаев будет установлен в слабо доступном месте, где подкинуть провода программатора не возможно. Остаться без возможности прошить esp32 это не мой путь. Потому как всегда есть ошибки и опции которые хочется исправить, изменить, добавить функционал.
Первый вариант уменьшить размер кода и исключить большие библиотеки. Поубивать не нужное и оставить необходимое.
Второй вариант это создать свой файл с настройкой размеров разделов в памяти esp32.

Не знаю, как обстоят дела в новой версии Arduino 2.0.3.
Я использую довольно древнюю Arduino 1.8.12, так как она поддерживает требуемые инструменты.
И версию ядра esp32 не ниже 1.0.3.

Начнем разбираться.

Берем за основу файл default.csv в папке C:\Users\ИмяПользователя\AppData\Local\Arduino15\packages\esp32\hardware\esp32\Версия ядра\tools\partitions\ default.csv:

# Name, Type, SubType, Offset, Size, Flags

nvs, data, nvs, 0x9000, 0x5000,

otadata, data, ota, 0xe000, 0x2000,

app0, app, ota_0, 0x10000, 0x140000,

app1, app, ota_1, 0x150000,0x140000,

eeprom, data, 0x99, 0x290000,0x1000,

spiffs, data, spiffs, 0x291000,0x16F000,

Этот файл с более старой версии ядра, в нем еще есть раздел "eeprom", он более наглядно раскрывает описание разных партиций.
Все что до Offset 0x10000 изменяется с шагом размера 0x1000 (4 КБ), в обычных реализациях их изменять не стоит, даже более не рекомендуется.
Учитывайте так же тот момент, что рекомендуется раздел app0 располагать по смещению 0x10000 (65536 байт).
Помните, что размер памяти esp32 может быть 4-8-16 мегабайт.
Для самой дешёвой и распространенной версии 4мб = 4194304 байт.
Смещение после 0x10000 рассчитывать учитывая кратность в 0x10000 (64кб = 65536 байт).
Поверьте этот шаг очень важен, если размер увеличивать не кратно 64кб то по итогу получите ошибку, сначала по смещению (offset), потом даже используя "gen_esp32part.py" и заполнив правильные смещения получите ошибку в разделе SPIFFS. Причем прошивка нормально прошьется, но вот будут беспокоить ошибки записи и чтения SPIFFS раздела. Скетч будет рабочий, если вы учтете отказоустойчивость софта в случае отвала раздела SPIFFS на запись.

Ну что приступим.

Копируем файл default.csv например на рабочий стол.
Переименовываем скопированный файл партиций дав ему имя без пробелов, спецсимволов и не длиннее 16 символов, например "App1408Sp828Epr".
Открываем переименованный файл в простом текстовом редакторе.


Что к чему ?:
"0x" это префикс указывающий на шестнадцатеричное счисление. Во многих конверторах он отсутствует или присутствует.
Конвертор стоит использовать чтобы снизить количество ошибок.
Например в десятичное счисление:
В шестнадцатеричное счисление:
nvs, data, nvs, 0x9000, 0x5000, -> библиотеки NVS

otadata, data, ota, 0xe000, 0x2000, -> раздел «otadata», хранятся данные для OTA-обновлений. При загрузке, если «ota data» пусто, будет выполнен прошитый код, а если есть данные то будет обновление.
app0, app, ota_0, 0x10000, 0x140000,

app1, app, ota_1, 0x150000,0x140000,-> используются для хранения данных программы и обновлений по воздуху,

eeprom, data, 0x99, 0x290000,0x1000, -> энергонезависимая память, теряет свой смысл если пользоваться SPIFFS.

spiffs, data, spiffs, 0x291000,0x16F000, -> сам раздел SPIFFS где будут храниться ваши данные.

В зависимости от потребностей редактируем размеры разделов, стоит учитывать, что раздел app0 и app1 должны быть одинакового размера!

Редактируем:

# Name, Type, SubType, Offset, Size, Flags

nvs, data, nvs, 0x9000, 0x5000,

otadata, data, ota, 0xe000, 0x2000, # Остается без изменений

app0, app, ota_0, 0x10000, 0x160000, # Увеличиваем только размер с 0x140000 например до 0x160000 (0x140000+0x20000) получаем 1441792 байт.

app1, app, ota_1, 0x170000,0x160000, # Изменяем смещение с 0x150000 до 0x170000 (0x10000+0x160000) и размер с 0x140000 до 0x160000.

# исключаем eeprom за ненадобностью

spiffs, data, spiffs, 0x330000,0xD0000, # Изменяем смещение 0x160000+0x170000=0x330000.

С размером раздела не все так просто, 4мб = 4194304, смещение раздела SPIFFS = 0x330000 = 3342336 байт.

Следственно раздел SPIFFS = 4194304-3342336=851968 байт и = 0xD0000

Сохраняем изменения в файле. Копируем файл в папку "partitions" к остальным файлам.

Редактируем файл boards.txt

Переходим в папку C:\Users\"Имя пользователя"\AppData\Local\Arduino15\packages\esp32\hardware\esp32\"версия ядра есп32"
Находим файл "boards.txt", открываем его в текстовом редакторе.
В файле настроек boards.txt находим секцию описывающую разные партиции, добавляем описание нашей новой секции. «app1408Sp828Epr» имя моего файла схемы разделов.

esp32.menu.PartitionScheme.app1408Sp828Epr=App1408kb Spiff 828kb
esp32.menu.PartitionScheme.app1408Sp828Epr.build.partitions=app1408Sp828Epr
esp32.menu.PartitionScheme.app1408Sp828Epr.upload.maximum_size=1441792

Сохраняем изменения.
Перегружаем Ардуино если запущен, заходим в Инструменты-> Partition Scheme, там должна появиться наша новая схема партиций.
Выбираем и переходим к компиляции скетча.
Если все сделано правильно то при компиляции ошибок не будет.
Прошиваем esp32 сначала скетч.
Скетч использует 1331858 байт (92%) памяти устройства. Всего доступно 1441792 байт.
Потом данные:
Compressed 851968 bytes to 271701...
И проверяем работоспособность устройства.

Если что то пошло не так !

Ошибка при компиляции в смещении по разделу:
Перепроверить смещения, если по вашему ошибок нету, то нужно убрать смещения после 0x10000, оставив смещения пустыми.
Отредактировав файл разделов и привести его к виду:

# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x160000,
app1, app, ota_1, ,0x160000,
spiffs, data, spiffs, ,0xD0000,

Пояснение:
Если вы оставите поле смещения пустым, то утилита gen_esp32part.py автоматически выровняет разделы.
Если вы укажете не выровненное смещение для раздела приложения app0, инструмент вернет ошибку.
Запускаем командную строку (CMD).
Переходим в командной строке в папку командой:
cd C:\Users\"имя пользователя"\AppData\Local\Arduino15\packages\esp32\hardware\esp32\"версия ядра"\tools
Вводим команду:
python gen_esp32part.py C:\Users\"имя пользователя"\AppData\Local\Arduino15\packages\esp32\hardware\esp32\"версия ядра"\tools\partitions\"Наш файл разделов".csv bin_part.bin
Parsing CSV input...
Verifying table...

После вводим команду:
python gen_esp32part.py bin_part.bin

Parsing binary partition input...
Verifying table...
# Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,20K,
otadata,data,ota,0xe000,8K,
app0,app,ota_0,0x10000,1408K,
app1,app,ota_1,0x170000,1408K,
spiffs,data,spiffs,0x330000,832K,

В выводе мы видим требуемые смещения ! Их вносим в файл разделов и сохраняем.
Компиляция кода будет работать и с пустыми смещениями, но вот загрузить в SPIFFS данные вы не сможете !
Будет ошибка при сборке SPIFFS . Будьте бдительны, даже с генерированными смещениями при нестандартном шаге в 0x10000 (64кб = 65536 байт) могут быть проблемы с SPIFFS разделом !!!
Выражается ошибки в ошибки записи и чтения раздела с данными. Сам код может работать стабильно, но вот сохранить в раздел даты не получится, так как из-за неточности таблицы адресов данные могут быть перезаписаны или попасть за сектор раздела!
Сам я потратил примерно три дня, чтобы собрать всю информацию в кучу и получить рабочий вариант ! Все проблемы и ошибки пришлось решать самому.
С этим талмутом вам будет проще и быстрей понять, как изменить размер разделов для есп32.
Время деньги! Берегите время и себя!
Вернуться к оглавлению.


Оренда жилья Севастополь Меню