По моему опыту, все сводится к тому, сколько вы стоите, если вы можете позволить себе иметь вдвое больше места для кода / данных на устройстве и можете перезагрузиться, это просто, сохраните новую версию во всем вашем дополнительном пространстве. выполните правильную проверку контрольной суммы на новом изображении, и я также рекомендую глубже проверить образ новой прошивки, так как он может быть подделан, если вы этого не сделаете, например, какой-то зашифрованный ключ, гарантирующий происхождение нового изображения. Вы можете сделать это и с внешней памятью, например, в одном проекте, использующем PIC, у меня был внешний EEPROM для нового образа прошивки и флаг, который, если установлен при загрузке, загрузит новый образ из EEPROM.
если вам не так повезло, то есть вы не можете позволить себе это место, тогда жизнь становится более интересной, и, вероятно, не существует гарантированного способа полностью избежать вероятности сбоя во время обновления. Во всех случаях загрузчик должен находиться в защищенной от записи части памяти, и, если вы можете себе это позволить, должен иметь некоторую базовую форму внешнего подключения, я сделал системы с очень простыми драйверами USB в загрузчике и системы с ДЕЙСТВИТЕЛЬНО простым UDP только сетевые стеки. Любой из них позволит вам по крайней мере получить новое представление об устройстве в случае сбоя во время обновления. В этих случаях я настоятельно рекомендую поместить загрузчик в область памяти, доступную только для чтения, вы теряете возможность обновлять его, но обновление haywire также не оставит вас с полностью заблокированным устройством. В таком случае загрузчик достаточно мал, чтобы вы могли быть почти уверены в его правильности.
последняя возможность - это система, которая должна обновлять некоторую часть своего кода во время работы ... это действительно сложно и обычно требует сложного контроля над расположением функций в памяти и значительного планирования в макете памяти. Это не слишком весело, но выполнимо.