сценарий
Я хочу обновить недорогое устройство IoT по беспроводной сети с помощью новой прошивки, обновляющей микроконтроллер (ы) устройства. Память микроконтроллера - это флэш-память в диапазоне от 32 до 128 Кб (считается каждый цент). Эта дешевая память имеет одно главное ограничение: она может быть стерта только блочно.
Вопрос
Означает ли это, что я не могу сделать дифференциальные ( дельта ) обновления? Всегда ли мне обновлять всю память контроллера (или хотя бы существенные части)?
Я хочу уменьшить необходимость перепрошивки и максимально рисковать кирпичом устройства. Существуют ли существующие стратегии при прошивке микроконтроллеров по воздуху?
Ответы:
Простой ответ - да, вам нужно достаточно блоков флэш-памяти для поддержки загрузчика и образов A / B-кода, если вы хотите высокую надежность. Прежде чем активировать новый образ, вы можете написать все, проверить его и, возможно, повторить попытку.
Однако это является дорогостоящим / надежная стратегия , и есть вещи , которые вы можете сделать , чтобы уменьшить накладные расходы. Низкоуровневая поддержка обновлений OTA также может входить в состав встроенного ПО или ОС устройства, поэтому вы можете избежать самостоятельной установки, если не хотите учиться. Эта функция может быть описана как
FOTA
.Разбиение базы кода позволяет производить постепенные обновления, в лучшем случае загрузчик может установить сетевое соединение, загрузить и проверить код без необходимости использовать какой-либо резервный код пользователя. С помощью локального шлюза управление этой задачей может быть делегировано с недорогих конечных точек.
Многие устройства имеют небольшое количество флэш-памяти для стирания слов, и даже если это не удастся, обычно можно установить биты, не стирая целый блок. Эти функции можно использовать для манипулирования таблицами переходов и сшивания кода, который обновляется в блоках размеров блоков. Даже если вы изначально планировали полное кодовое пространство A / B, вам может понадобиться более сложная схема, когда база кода слишком сильно увеличивается.
Чтобы прояснить функциональные возможности, которые могут быть достигнуты с помощью сложного решения для микропрограммного обеспечения, загрузчик и, возможно, первичный стек связи могут оставаться резидентными, в то время как все оставшееся пространство пользовательского приложения повторно мигает. Это не требует каких-либо накладных расходов (особенно, если разбиение блока является мягким). В сценарии, где необходимо обновить стек связи, область, обычно используемая для кода приложения, может временно использоваться во время загрузки и проверки. Достижение этого требует некоторой поддержки в SoC, но устройства 2-го и 3-го поколения, разработанные с учетом этого, уже существуют.
источник
Помимо вашего кода, который выполняет обновление, которое было бы относительно статичным, вам необходимо хранить два образа в вашем хранилище: активный образ и образ резервной копии. Всякий раз, когда вам нужно обновить, сделайте это в резервной копии, а затем переключите его, чтобы быть активным. После стабилизации обновите старый активный образ, который теперь должен быть вашей резервной копией.
Имея это в виду, вы можете использовать алгоритмы выравнивания износа при обновлении обоих изображений. Код для таких алгоритмов может занимать около 10-15% от общего объема памяти, но это стоит того, чтобы продлить срок службы устройства.
( Techtarget.com: выравнивание износа )
источник
Freescale Semiconductor описывает надежный способ обновления встроенного программного обеспечения для микроконтроллеров Kinetis .
Называется она: программа Flash Memory Swap .
Вы можете обновить блоки, а затем поменять их местами.
Связанный документ содержит подробное описание.
Это обеспечивает более безопасное обновление прошивки, но, поскольку требует больше памяти, наверняка стоит дороже . Также не применимо для любого типа микроконтроллера, только те, которые поддерживают замену внутренних флэш-блоков.
источник