Создать систему горячей замены прошивки на Arduino Nano?
Разрешает ли архитектура Arduino Nano разрабатывать Sketch, разделенный на два сегмента:
- Тот, который принимает через CAN-шину новую версию прошивки и записывает ее во второй сегмент. Цель первого сегмента — срабатывать только при передаче данных.
- Сама прошивка.
Я представляю это так:
void loop(){
if (CAN.onReceive(...)){
// первый сегмент
}
else{
// второй сегмент
}
}
После завершения передачи скетч просто запускается с обновленным кодом. Это возможно?
@Andrew's Quest, 👍1
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(); // это не возвращает
Это похоже на принцип некоторых загрузчиков SD-карт, о которых я читал несколько лет назад. Эти загрузчики искали файл на SD-карте при срабатывании, а затем записывали его во флэш-память.
Я понимаю, что получение файла через CAN отличается, но я ожидаю, что большинство основных идей те же самые. Одним из преимуществ SD-карты является то, что весь файл может быть проверен перед записью во флэш-память. У Nano недостаточно оперативной памяти для хранения всех 32 КБ, поэтому я ожидаю, что вам придется делать это «в реальном времени» через CAN.
https://github.com/zevero/avr_boot — один из примеров, поддерживающий ATmega328P (поэтому он должен быть совместим с Nano).
Но по сути то, что вы ищете, — это настроенный загрузчик.
- Создание избыточности прошивки на Arduino Nano
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В