Создание избыточности прошивки на Arduino Nano

Существует ли устоявшаяся система, которая при загрузке новой версии приложения во Flash автоматически переключается на нее, но сохраняет старую на случай, если из-за каких-то проблем нам придется вернуться к ней?

Я прошу о такой системе в целом, но также и о той, которая работает с CAN-трансивером.

, 👍0


1 ответ


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

3

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

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

InternalStorageAVR в моей библиотеке ArduinoOTA может хранить загруженное OTA обновление в верхней половине флэш-памяти классического AVR. Но программа не может там работать. Загрузчик должен скопировать его по адресу 0 и запустить оттуда. Поэтому предыдущая версия теряется. В большой флэш-памяти Arduino Mega, возможно, он мог бы хранить копию предыдущей версии, но не в Nano. Любая логика для этого сделала бы скетч больше, чем треть флэш-памяти.

РЕДАКТИРОВАТЬ:

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

Optiboot можно модифицировать для этого. В качестве отправной точки, вот моя функция copy_flash_pages для Optiboot.

,

Спасибо за исчерпывающий ответ. Меня действительно не смущает, что скетч занимает треть флеш-памяти или больше. Правильно ли я понимаю, что если бы вы могли хранить две версии прошивки во флеш-памяти Nano, вы могли бы переключаться между ними, просто позволяя загрузчику скопировать одну из них по адресу 0?, @Andrew's Quest

Буду признателен, если вы расскажете (или дадите ссылку на документацию, где это проясняется), как можно заставить загрузчик выполнять разные инструкции? Думаю, мне нужно две: одну для сохранения новой версии и ее использования, и одну для переключения на старую версию., @Andrew's Quest

Запись новой версии скетча, полученного через UART, — это то, что обычно делает bootolade. Смотрите исходный код Optiboot. Есть код, который обнаруживает загрузку, поэтому там вы можете активировать резервное копирование. Чтобы переключиться на резервное копирование, это зависит от того, как вы хотите обнаружить, что вам нужно переключиться на резервное копирование., @Juraj

Мне нужно передать сигнал с базовой станции на узел с использованием протокола CAN, если это возможно., @Andrew's Quest

это предполагает, что скетч запущен и вы хотите подать ему сигнал о необходимости активировать загрузчик с помощью флага в EEPROM, указывающего на необходимость копирования старой версии по адресу 0., @Juraj

Я попытался выразить это другими словами в другом вопросе, возможно, вы также сможете ответить на него: https://arduinoprosto.ru/q/95912/create-a-system-of-hot-swap-firmware-update-on-arduino-nano, @Andrew's Quest

этот вопрос задает что-то немного другое. насколько я понимаю, предыдущей версии нет, только обновление через CAN?, @Juraj

есть предыдущая версия, я просто не упомянул ее для простоты, вы можете представить ее как третий блок кода, @Andrew's Quest