ARM довольно универсален: есть много производителей, которые внедряют архитектуры ARM, и некоторые из них могут предоставить эту функцию.
Клабаккио
1
Было бы неплохо получить более конкретную информацию о том, какой чип / семейство ARM вы планируете использовать. Многие, если не все микроконтроллеры Cortex-M поддерживают запись во флэш-память из пользовательского кода. Существуют примеры реализаций с открытым исходным кодом, таких как загрузчик Maple leaflabs.com/docs/bootloader.html , и я думаю, что я видел обновление прошивки по радиоканалу, поддерживаемому в некоторых квадрокоптерах.
Торн
На данный момент мы не выбрали устройство ARM;)
hotips
7
Большая проблема с обновлениями прошивки - как заставить микросхему перейти в режим обновления, если с прошивкой что-то не так. Когда у вас есть доступ к микросхеме, вы можете сбросить ее и увеличить загрузочный штифт, но как вы собираетесь это сделать по воздуху? Единственное надежное решение, которое я могу себе представить, это наличие второго чипа (без возможности обновления), который обрабатывает базовую связь и может обновлять основной чип. После решения этой проблемы фактическая загрузка может быть так же проста, как использование (например) встроенного в чип загрузчика (например, все известные контроллеры LPC имеют последовательный загрузчик).
Воутер ван Оойен
2
@Hernan Это сделало бы возможным тонкие режимы сбоев, например, когда один чип (каким-то образом запускает неправильный код) сохраняет другой в состоянии сброса. Единственное действительно надежное решение - хранить функции в одной микросхеме так просто, что вам никогда не потребуется их обновлять.
Воутер ван Оойен
Ответы:
9
Я не знаю никаких готовых решений, но я опишу, как я обошел это в одном проекте. Он не совсем «не поддающийся обработке», но я не знаю, что он потерпел неудачу после тысяч обновлений. Для этого приложения очень низкая частота отказов все равно будет дешевле, чем получение доступа к устройствам.
Основное приложение имеет три дополнительных типа пакетов, добавленных к его обычному протоколу связи, который включает обнаружение ошибок и состояние повторных попыток сверху:
Команда начала обновления прошивки очищает зарезервированную область памяти во внешней SPI Flash. Он возвращает ошибку, если устройство работает от своей резервной батареи или от внешнего источника питания, но уровень заряда батареи ниже 25%.
Команда записи блока принимает адрес смещения и данные, которые записываются во внешнюю флэш-память небольшими порциями. Протокол более высокого уровня заботится об обнаружении ошибок и повторных передачах. После записи каждого блока он читается и проверяется до подтверждения команды.
Команда завершения обновления прошивки включает в себя длину, на которой полученная прошивка должна быть вместе с CRC32 всего образа для дальнейшей проверки. Если это совпадает с содержимым внешней флэш-памяти и условия питания все еще в порядке, то же значение длины и CRC32 передается в область EEPROM вместе с «магическим числом», чтобы указать, что обновление микропрограммного обеспечения еще не завершено.
Жесткий цикл выполняется в основном приложении для принудительного перезапуска сторожевого таймера.
Загрузчик (который находится в защищенной от записи области ARM Flash) видит магическое число в EEPROM и еще раз проверяет CRC32 изображения. Если все в порядке, он передает изображение из внешней Flash-памяти в основную программную область Flash ARM.
Информация об ожидающем обновлении удаляется из EEPROM, и жесткий цикл вызывает другую перезагрузку. На этот раз загрузчик запустит основное приложение нормально.
Хотя я никогда не видел, чтобы фаза обновления проваливалась, тестирование новых версий микропрограммного обеспечения перед развертыванием крайне важно с помощью этого метода. Если новая версия не может подключиться к сети GSM и принимать команды на обновление в будущем, для нее потребуется обновление встроенного программного обеспечения.
Вы используете Linux или RTOS, или голый металл? Если вы используете Debian, вы можете сделать снимок текущей файловой системы, выполнить обновление с помощью «apt-get», а затем сохранить или откатить изменения в зависимости от того, сработало это или нет.
У нас есть Linux и голый металл в зависимости от приложения ;-)
hotips
1
Если у вас Linux, вы можете использовать большую часть этой инфраструктуры. Я работаю с обновлениями в моем текущем проекте, чтобы создать файлы .deb для пользовательских приложений, а затем использовать apt-get update для обновления системы. Я также экспериментирую с btrfs. Эта файловая система позволяет делать снимки. Поэтому я планирую сделать снимок нужных каталогов, попробовать и обновить, а если это не сработало, вернуть снимок. Если вы работаете с голым железом, то вам, вероятно, придется использовать обычный подход с двойной памятью: одно изображение для последнего рабочего кода, а другое для только что загруженного кода.
Ответы:
Я не знаю никаких готовых решений, но я опишу, как я обошел это в одном проекте. Он не совсем «не поддающийся обработке», но я не знаю, что он потерпел неудачу после тысяч обновлений. Для этого приложения очень низкая частота отказов все равно будет дешевле, чем получение доступа к устройствам.
Основное приложение имеет три дополнительных типа пакетов, добавленных к его обычному протоколу связи, который включает обнаружение ошибок и состояние повторных попыток сверху:
Команда начала обновления прошивки очищает зарезервированную область памяти во внешней SPI Flash. Он возвращает ошибку, если устройство работает от своей резервной батареи или от внешнего источника питания, но уровень заряда батареи ниже 25%.
Команда записи блока принимает адрес смещения и данные, которые записываются во внешнюю флэш-память небольшими порциями. Протокол более высокого уровня заботится об обнаружении ошибок и повторных передачах. После записи каждого блока он читается и проверяется до подтверждения команды.
Команда завершения обновления прошивки включает в себя длину, на которой полученная прошивка должна быть вместе с CRC32 всего образа для дальнейшей проверки. Если это совпадает с содержимым внешней флэш-памяти и условия питания все еще в порядке, то же значение длины и CRC32 передается в область EEPROM вместе с «магическим числом», чтобы указать, что обновление микропрограммного обеспечения еще не завершено.
Жесткий цикл выполняется в основном приложении для принудительного перезапуска сторожевого таймера.
Загрузчик (который находится в защищенной от записи области ARM Flash) видит магическое число в EEPROM и еще раз проверяет CRC32 изображения. Если все в порядке, он передает изображение из внешней Flash-памяти в основную программную область Flash ARM.
Информация об ожидающем обновлении удаляется из EEPROM, и жесткий цикл вызывает другую перезагрузку. На этот раз загрузчик запустит основное приложение нормально.
Хотя я никогда не видел, чтобы фаза обновления проваливалась, тестирование новых версий микропрограммного обеспечения перед развертыванием крайне важно с помощью этого метода. Если новая версия не может подключиться к сети GSM и принимать команды на обновление в будущем, для нее потребуется обновление встроенного программного обеспечения.
источник
Вы используете Linux или RTOS, или голый металл? Если вы используете Debian, вы можете сделать снимок текущей файловой системы, выполнить обновление с помощью «apt-get», а затем сохранить или откатить изменения в зависимости от того, сработало это или нет.
источник