Создать систему горячей замены прошивки на Arduino Nano?

Разрешает ли архитектура Arduino Nano разрабатывать Sketch, разделенный на два сегмента:

  1. Тот, который принимает через CAN-шину новую версию прошивки и записывает ее во второй сегмент. Цель первого сегмента — срабатывать только при передаче данных.
  2. Сама прошивка.

Я представляю это так:

void loop(){
  
  if (CAN.onReceive(...)){
    // первый сегмент
  }
  else{
    // второй сегмент
  }

}

После завершения передачи скетч просто запускается с обновленным кодом. Это возможно?

, 👍1


2 ответа


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

2

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

См. расширенный пример OTASketchDownload о том, как использовать InternalStorage с вашим собственным способом загрузки двоичного файла обновления.

InternalStorageAVR требует модифицированного загрузчика Optiboot с функцией copy_flash_pages. Hex-файл с модифицированным загрузчиком доступен в репозитории my_boards GitHub.

использование InternalStorage

  if (!InternalStorage.open(length)) {
    client.stop();
    Serial.println("There is not enough space to store the update. Can't continue with update.");
    return;
  }
  byte b;
  while (length > 0) {
    if (!client.readBytes(&b, 1)) // чтение байта с таймаутом
      break;
    InternalStorage.write(b);
    length--;
  }
  InternalStorage.close();
  
  if (length > 0) {
    Serial.print("Timeout downloading update file at ");
    Serial.print(length);
    Serial.println(" bytes. Can't continue with update.");
    return;
  }

  Serial.println("Sketch update apply and reset.");
  Serial.flush();
  InternalStorage.apply(); // это не возвращает
,

2

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

Я понимаю, что получение файла через CAN отличается, но я ожидаю, что большинство основных идей те же самые. Одним из преимуществ SD-карты является то, что весь файл может быть проверен перед записью во флэш-память. У Nano недостаточно оперативной памяти для хранения всех 32 КБ, поэтому я ожидаю, что вам придется делать это «в реальном времени» через CAN.

https://github.com/zevero/avr_boot — один из примеров, поддерживающий ATmega328P (поэтому он должен быть совместим с Nano).

Но по сути то, что вы ищете, — это настроенный загрузчик.

,