Можно ли сделать обновление OTA, используя ссылку GitHub

c++ wifi http mkr1000

Мне нужно иметь возможность загружать обновления программного обеспечения через Интернет, не подключая MKR1000 к сети. Либо это, либо новый код будет загружен с моего сервера (C++) на мой MKR1000, а затем перезагружен с новым кодом. Любая помощь полезна. Спасибо.

, 👍0

Обсуждение

вы можете использовать объект InternalStorage библиотеки WiFi101OTA для хранения и применения загруженного двоичного файла, @Juraj

Ну, цель состоит в том, чтобы я мог иметь несколько MKR, разбросанных по провинции, и мне больше не нужно было их трогать, и иметь возможность обновлять их по мере необходимости, чтобы внутреннее хранилище не использовалось., @Alex Boisvert

он называется InternalStorage, потому что он сохраняет загруженный или загруженный двоичный файл в верхнюю половину флэш-памяти. после успешной загрузки вы вызываете apply(), и он копирует двоичный файл в место запуска и сбрасывает плату. новый скетч запущен, @Juraj


1 ответ


1

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

Обычный способ выполнения обновлений OTA заключается в использовании микросхемы с сегментируемой и переназначаемой флэш-памятью (например, ESP32, ESP8266, PIC32MZ и т. д.), когда ваш скетч запускается из одного сегмента, а новый код загружается из любой источник в другой сегмент. Затем он изменяет единственный флаг загрузки и сбрасывает MCU, а MCU сопоставляет второй сегмент с первым (переставляет два сегмента местами) и запускает новый код.

Это невозможно сделать с SAMD21, так как у него нет переназначаемых сегментов флэш-памяти.

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


Дополнение:

Очевидно, существует библиотека «WiFi101OTA», которая позволяет обновлять платы SAMD21 по беспроводной сети. По общему мнению, он получает новый код и сохраняет его где-то (фрагмент внутренней флэш-памяти, SD-карта и т. д.), а затем копирует эти данные в основную часть флэш-памяти с помощью функции, работающей из ОЗУ.

Хотя это звучит хорошо, я бы не рекомендовал использовать его в живом исполнении. Для разработки нормально, но не "в поле".

Это просто потому, что нет защиты от "замуровывания" юнита. Как только начнется копирование из хранилища на основную флэш-память, вы никогда не сможете вернуться назад. Если эта запись по какой-то причине не удалась (отключение питания, сбой скетча или любая из множества других непредсказуемых причин), устройство мертво. Вам придется вручную перепрограммировать устройство с помощью кабеля, чтобы вернуть его к жизни.

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

Если бы вы приняли эту библиотеку, вам, конечно, пришлось бы модифицировать ее, чтобы «загружать» обновления, а не получать «выталкиваемые» обновления. Это должно быть тривиально, но потребуется некоторый уровень навыков сетевого программирования.

,

но библиотека WiFi101OTA это делает. с функцией в ОЗУ, которая копирует двоичный файл, хранящийся в верхней части флэш-памяти, в целевое место во флэш-памяти. и я расширил эту библиотеку до других сетевых библиотек и других MCU (nrf5, AVR) в библиотеке ArduinoOTA., @Juraj

@Juraj Я не знал о такой библиотеке. О, а как это работает с AVR, который может записывать во флэш-память только из сегмента загрузчика?, @Majenko

@Juraj Кроме того, этот метод небезопасен. Если вы начнете перезаписывать код, выполняющий программирование, и произойдет сбой или отключение питания, устройство заблокируется. С сегментами с двойной флэш-памятью этого никогда не произойдет, поскольку переключение сегментов происходит только после того, как будет проверено, что весь код написан. Вот почему вы хотите сделать это из загрузчика, а не из основного скетча, чтобы можно было восстановиться после сбоя при запуске обновления ota., @Majenko

не портит плату. загрузчик не меняется. в случае сбоя OTA возможна загрузка через USB. AVR ArduinoOTA нуждается в улучшенной Optiboot: https://github.com/jandrassy/ArduinoOTA#atmega-support, @Juraj

@Juraj «Bricked» означает, что вам нужно вручную повторно загрузить код через USB - то, что вы не хотите делать в полевых условиях. Я, конечно, никогда не хотел бы использовать такую вещь в живой системе. Все, что не использует двухсегментную флэш-память или загрузчик, который работает за вас, небезопасно в реальной среде. Развитие, хорошо. Живи, черт возьми!, @Majenko

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