OTA-обновление ESP8266 с разными настройками размера флэш-памяти?

esp8266 flash ota partition

У меня есть ESP8266 в проекте. Это конкретно этот элемент ESP8266 SMT Module - ESP-12F. Он отлично работал с OTA, но я с опозданием понял, что не менял настройки флэш-памяти, когда начал компилировать через Arduino IDE несколько версий назад. Я использовал параметр «1 МБ (FS: 64 КБ OTA: ~ 470 КБ)» и обновлял OTA в нескольких версиях с одной и той же базовой структурой прошивки и с использованием одной и той же настройки на стороне сервера.

Я больше не могу обновляться с этим параметром, потому что размер моего скомпилированного скетча превышает предельный размер OTA. Однако на самом деле у моего чипа 4 МБ, так что это ограничение искусственное. Я попытался изменить на "4 МБ (FS:2 МБ OTA:~1019 КБ)", и это работает при следующих условиях тестирования:

  1. Я компилирую "старый" программу с настройками 4 МБ и перезаливаю старую программу через проводное соединение.
  2. Я компилирую "новый" программа, которая придет через OTA с теми же настройками 4 МБ.

Это нормально для теста, но у меня уже есть один из этих чипов "развернут" в труднодоступном месте. Я хотел бы обновить этот развернутый чип OTA, а также изменить раздел флэш-памяти. Я готов потерять любые файлы, хранящиеся вне самой программы. Поэтому я хотел бы вместо этого иметь:

  1. Развернутый чип с поддержкой OTA и прошивкой, работающей на структуре разделов размером 1 МБ, указанной выше:
  2. (Необходим любой промежуточный шаг)
  3. Обновление OTA до новой прошивки, скомпилированной со структурой разделов размером 4 МБ.

Я хочу загрузить фиктивный скетч на странице "Необходим любой промежуточный шаг" чтобы обойти текущий размер скетча, но после некоторых экспериментов OTA, похоже, дает сбой, когда структура разделов отличается независимо от размера двоичного файла.

Это согласуется с ответом № 2 здесь: проблема OTA esp8266, но этот старый вопрос принял другое направление с OP и пунктом № 2. там сказано без подробностей. Я понимаю, что в широком смысле предыдущий ответ касается моего случая, но я ищу более подробную информацию о конкретном аспекте настроек раздела флэш-памяти. Специально для этих связанных вопросов:

  • Есть ли какая-либо обходная стратегия, позволяющая изменить разделение флэш-памяти между разными версиями, обслуживаемыми OTA?
  • Если нет, определяется ли ограничение программным обеспечением в текущей структуре OTA в публичных библиотеках или оно каким-то образом фундаментально влияет на то, как программа размещается в аппаратной памяти?

По крайней мере, в теории кажется, что я должен иметь возможность принудительно записывать новую программу по OTA в том же месте, где она была бы записана, если бы старая программа также имела раздел размером 4 МБ. (Еще раз отметим, что я готов потерять любые другие данные во флэш-памяти, чтобы это обновление заработало.)

, 👍1

Обсуждение

afaik, если у вас неправильные настройки прошивки, вы можете только один раз OTA. (не спрашивайте откуда я знаю)., @dandavis


1 ответ


Лучший ответ:

3

Основная проблема заключается в том, что при загрузке через OTA вы не загружаете структуру разделов.

Флэш-память ESP32 разделена на несколько «разделов». или областей. Это может выглядеть примерно так:

+----+-+-------------+-------------+---------------------+
|BOOT|P|OTA Program 1|OTA Program 2| SPIFFS              |
+----+-+-------------+-------------+---------------------+

При загрузке через UART вы загружаете всю эту структуру, и эту структуру можно изменить. Когда вы загружаете через OTA, вы загружаете только одну из "OTA Program 1" или "Программа OTA 2". Один из них активен, а другой неактивен. Заливаешь в неактивный и потом при следующей перезагрузке тот становится активным. Это позволяет системе убедиться, что программа была написана правильно, прежде чем запускать ее, чтобы снизить вероятность поломки устройства в полевых условиях.

По этой причине вы не можете никогда загружать что-либо, что не помещается ни в один из разделов программы OTA.

Одним из рискованных вариантов, который вам придется сначала провести тщательное локальное тестирование, является написание программы, которая при выполнении изменит разбиение на разделы. Вам нужно убедиться, что он работает в нижнем разделе OTA, чтобы неактивный был тем, который перемещался и расширялся, что может потребовать небольшого количества проб и ошибок.

После этого вы сможете загрузить большую программу OTA в новый, более крупный, неактивный сегмент OTA.

Но это только предположение, и я никогда этого не делал и не слышал, чтобы кто-то делал.

,

ОК, исправил это с помощью лестничного метода. Достал свою лестницу, залез наверх, открутил корпус и залил свежее по UART., @Brick

О, мне бы очень хотелось услышать, что предложенный метод работает., @the busybee