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

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

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

, 👍0


1 ответ


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

3

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

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

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

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

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

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

,