Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обновление прошивки
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
data_stack
Делаю бут, который будет обновлять прошивку с sd карты. Возникло пару вопросов, поэтому рассуждения вслух. Скомпилировал прошивку, получил bin файл, файл может получиться большого размера, в оперативку возможно не влезет, думаю писать в специально отведенные для этого сектора в начало/конец флеша - пока не понятно куда лучше. Собственно, читаю с карты этот бинарник, записал во флеш, хорошо бы его проверить, думаю использовать CRC. Еще хорошо бы знать отличается ли версия залитой прошивки, от той что на карте. Теперь, внимание вопрос, как вы бы делали это? Пока единственное решение - написать утилиту для пк, которая бы посчитала crc прошивки, и обернуть в какой то новый файл, с полями crc и версией, но почему то есть смутное подозрение что никто так не делает.
aaarrr
Цитата(data_stack @ Jan 21 2016, 16:42) *
Пока единственное решение - написать утилиту для пк, которая бы посчитала crc прошивки, и обернуть в какой то новый файл, с полями crc и версией, но почему то есть смутное подозрение что никто так не делает.

Я, например, именно так и делаю. Просто и удобно.
mantech
Цитата(data_stack @ Jan 21 2016, 16:42) *
Делаю бут, который будет обновлять прошивку с sd карты. Возникло пару вопросов, поэтому рассуждения вслух. Скомпилировал прошивку, получил bin файл, файл может получиться большого размера, в оперативку возможно не влезет, думаю писать в специально отведенные для этого сектора в начало/конец флеша - пока не понятно куда лучше. Собственно, читаю с карты этот бинарник, записал во флеш, хорошо бы его проверить, думаю использовать CRC. Еще хорошо бы знать отличается ли версия залитой прошивки, от той что на карте. Теперь, внимание вопрос, как вы бы делали это? Пока единственное решение - написать утилиту для пк, которая бы посчитала crc прошивки, и обернуть в какой то новый файл, с полями crc и версией, но почему то есть смутное подозрение что никто так не делает.


Это все как бы само собой разумеется:
1) бин хоть какого размера, лишь бы во флеху вошел biggrin.gif Бут вы не переписываете, обновление с сд-карты, т.е. человеком. Если даже некорректно прочитается или запишется - оператор просто повторит перепрошивку.

2) CRC конечно надо, у меня была еще шифровка, поэтому и контрольная сумма уже подразумевалась.

3) проверить версию прошивки - пишите ее в начало заголовка, где CRC файла и пр...

4)"написать утилиту для пк, которая бы посчитала crc прошивки, и обернуть в какой то новый файл, с полями crc и версией, но почему то есть смутное подозрение что никто так не делает." - кто это сказал??? wacko.gif
data_stack
Просто столкнулся с этой проблемой впервые, поэтому и не знаю как сделать так чтобы не наступать на грабли. По правде смутила плата Nucleo, ей кидаешь bin на флешку без всяких оберток и вроде как все работает. Хотя конечно это не показатель.
megajohn
Цитата(data_stack @ Jan 21 2016, 17:42) *
Делаю бут, который будет обновлять прошивку с sd карты. ... Скомпилировал прошивку, получил bin файл, файл может получиться большого размера, в оперативку возможно не влезет, думаю писать в специально отведенные для этого сектора в начало/конец флеша - пока не понятно куда лучше.


аналогичный проект: RTOS, SD+FatFS, AES-crypt, Heap заняло на LPC1778
34 878 bytes of readonly code memory
6 498 bytes of readonly data memory
12 769 bytes of readwrite data memory (+ 13 absolute)

Цитата(data_stack @ Jan 21 2016, 17:42) *
Еще хорошо бы знать отличается ли версия залитой прошивки, от той что на карте. Теперь, внимание вопрос, как вы бы делали это? Пока единственное решение - написать утилиту для пк, которая бы посчитала crc прошивки, и обернуть в какой то новый файл, с полями crc и версией


почти что так. Утилита для ПК шифровала прошивку и генерировала CRC
и на фтп выкладывалась прошивка и файл описания fw_uc.ini
[uc]
ver="2"
file="fw151023.bin"
crc32="12AB56EF"
jcxz
Цитата(data_stack @ Jan 21 2016, 19:42) *
Скомпилировал прошивку, получил bin файл, файл может получиться большого размера, в оперативку возможно не влезет, думаю писать в специально отведенные для этого сектора в начало/конец флеша - пока не понятно куда лучше. Собственно, читаю с карты этот бинарник, записал во флеш, хорошо бы его проверить, думаю использовать CRC.

Непонятно зачем прошивку переписывать куда-то если она лежит на SD-карте? Бутлоадер может в любой момент считать с SD-карты любую её часть и, при необходимости, повторить процесс обновления, если по какой-то причине прошлый раз не удался.
Или Вы боретесь с диким юзером, который выдёргивает карту во время прошивки? :-)
Насчёт CRC - IAR прекрасно умеет считать CRC образа прошивки, зачем изобретать велосипед? Мы именно так и контролируем валидность прошивок.
aaarrr
Цитата(jcxz @ Jan 21 2016, 17:37) *
Непонятно зачем прошивку переписывать куда-то если она лежит на SD-карте?

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

Цитата(jcxz @ Jan 21 2016, 17:37) *
Насчёт CRC - IAR прекрасно умеет считать CRC образа прошивки, зачем изобретать велосипед? Мы именно так и контролируем валидность прошивок.

А номер и дату сборки он умеет вставлять?
prottoss
Цитата(aaarrr @ Jan 21 2016, 21:04) *
Так загрузчику и не надо будет знать ничего о SD-карте - его дело проверить и скопировать прошивку из одной части флеш в другую. Получается очень простой и компактный бут без привязки к какому-либо внешнему железу.
+1. То же так же делаю. Загрузчик работает только с сегментами памяти - он знает где лежит приложение, где лежит новая версия, где лежит резервная версия. Про всякие карты-интерфейсы он ничего не ведает. Умеет считать CRC, знает где расположена версия, дата и прочие атрибуты приложения.


Цитата(aaarrr @ Jan 21 2016, 21:04) *
А номер и дату сборки он умеет вставлять?
Дату сборки в IAR, ровно как и в других компиляторах, можно вычислить по макросам _DATE_ и _TIME_. Номер сборки, похоже, только вручную...
scifi
Цитата(prottoss @ Jan 21 2016, 18:29) *
Номер сборки, похоже, только вручную...

Номер сборки - это из каменного века, когда первобытные люди ещё не придумали системы контроля версий.
Ну и "вручную" - это же жесть. Такие дела автоматизируются. Makefile, скрипты там всякие...
aaarrr
Цитата(prottoss @ Jan 21 2016, 18:29) *
Дату сборки в IAR, ровно как и в других компиляторах, можно вычислить по макросам _DATE_ и _TIME_.

А ежели я её захочу в unix time?
prottoss
Цитата(aaarrr @ Jan 21 2016, 21:44) *
А ежели я её захочу в unix time?
Я ежели я захочу на лыжах с горки и на луну прямиком? ;-)


Цитата(scifi @ Jan 21 2016, 21:34) *
Номер сборки - это из каменного века, когда первобытные люди ещё не придумали системы контроля версий.
Ну и "вручную" - это же жесть. Такие дела автоматизируются. Makefile, скрипты там всякие...
Наверное Вы правы - я из каменного века sm.gif не пользуюсь этим. Архивирую рабочие версии с простым текстовым фалом где добавляю дату, что добавлено, что исправлено...
jcxz
Цитата(aaarrr @ Jan 21 2016, 21:04) *
Так загрузчику и не надо будет знать ничего о SD-карте - его дело проверить и скопировать прошивку из одной части флеш в другую. Получается очень простой и компактный бут без привязки к какому-либо внешнему железу.

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

Цитата(aaarrr @ Jan 21 2016, 21:04) *
А номер и дату сборки он умеет вставлять?

Про дату/номер Вам уже ответили, а номер сборки - ну хотя-бы формировать его bat-файлом, запускаемым из prebuild.
aaarrr
Цитата(jcxz @ Jan 21 2016, 19:01) *
Про дату/номер Вам уже ответили

Нет, я же написал, что хочу дату в unix time. Законное желание, как мне кажется.

Тут, на мой взгляд, дело такое: можно реализовать желания скриптами и внешним "велосипедом" (сторонним софтом), а можно накидать пару сотен строк своего.
Скажем, программка, занимающаяся добавлением в прошивку CRC, времени и номера сборки с автоинкрементом (номер хранится в ini-файле), занимает менее 300 строк на "C" и без проблем собирается на любой системе.
mantech
Цитата(aaarrr @ Jan 21 2016, 18:04) *
Так загрузчику и не надо будет знать ничего о SD-карте - его дело проверить и скопировать прошивку из одной части флеш в другую. Получается очень простой и компактный бут без привязки к какому-либо внешнему железу.


А номер и дату сборки он умеет вставлять?


Че-то непонятно вообще, вы откуда грузить бинарь будете, с сд-карты, правильно? Тогда что значит "не надо будет знать ничего о SD-карте"??
А если копировать сначала в какую-то область флеш, а затем снова из нее в другую область? Какая-то дурь из разряда, если делать нечего, то...
Так делают только для обновлений по сети, удаленно, на случай критического обрыва связи, у вас-то это зачем? wacko.gif
ЗЫ. Если уж есть такая большая вероятность, что зальют непойми, что, то делайте бэкап копию старой прошивки на карту, а потом прошивайте.
aaarrr
Цитата(mantech @ Jan 23 2016, 16:20) *
Так делают только для обновлений по сети, удаленно, на случай критического обрыва связи, у вас-то это зачем? wacko.gif

Ну так я как раз по сети и обновляюсь. Вот только нужно это не "на случай критического обрыва связи", а чтобы загрузчик в сетевые дела не лез - не его ума это дело.
С SD-картой проще, но зачем плодить сущности? Основное приложение умеет работать с картой, вот пусть оно и отдувается.
Ruslan1
А я простой стандартный hex-файл использую. Нашел бутлодер на диске нужный файл- и пишет в флеш МК, при этом пропуская сегменты, которые заняты самим бутлодером.
Если файл грузится из удаленного источника - то он сначала сохраняется на локальный носитель (SD карта, например), потом уже включается бутлодер.
jcxz
Цитата(aaarrr @ Jan 23 2016, 19:31) *
С SD-картой проще, но зачем плодить сущности? Основное приложение умеет работать с картой, вот пусть оно и отдувается.

А с чего Вы взяли что "основное приложение умеет работать с картой"? :-)
Из сообщения ТС это никак не следует. Так же как не следует и то, что ему необходимо обновление по сети (да и вообще может никакой сети нет). Понафантазировали. :-)
Из сообщения ТС следует только, что в устройстве всегда есть SD-карта, а значит действительно - зачем плодить сущности и куда-то с неё переписывать??? Проще как раз (даже если есть другие источники приёма прошивки (по сети например)), сохранить её на SD и прямо с неё шить в бутлоадере.
prottoss
Выскажу свое мнение, хоть, похоже оно и не совпадает с большинством, по видимому. Мое мнение, бутлоадеру лучше обновляться из собственной памяти... Конечно, если позволяет объем памяти программ на обновление. Плюсы для бутлоадера:
1. Нет необходимости держать в себе код для драйвера SD-карты. Т.е он получается компактный. Наверное, это самый главный плюс.
2. Защита от воровства прошивки. Вы скажете, что прошивку можно ложить зашифрованную в бут? Да можно, но тогда смотрите п.1.
3. Надежность устройства выше. Один МК всяко лучше чем МК + SD-карта.

Наверное все из основных плюсов.
scifi
Цитата(prottoss @ Jan 24 2016, 15:20) *
Выскажу свое мнение, хоть, похоже оно и не совпадает с большинством, по видимому. Мое мнение, бутлоадеру лучше обновляться из собственной памяти... Конечно, если позволяет объем памяти программ на обновление. Плюсы для бутлоадера:

Ну и главный минус: если "что-то пошло не так" и устройство превратилось в кирпич, то нужно отправлять сей кирпич изготовителю. Поэтому не вредно иметь в загрузчике аварийный режим, который всё-таки оставляет пользователю возможность оживить кирпич своими силами.
aaarrr
Цитата(scifi @ Jan 24 2016, 15:32) *
Ну и главный минус: если "что-то пошло не так" и устройство превратилось в кирпич, то нужно отправлять сей кирпич изготовителю.

Как Вы представляете механизм окирпичивания?
Огурцов
Цитата(prottoss @ Jan 24 2016, 12:20) *
бутлоадеру лучше обновляться

бутлоадеру лучше не обновляться
т.е. даже не то что бы лучше, но просто никогда
mantech
Цитата(scifi @ Jan 24 2016, 15:32) *
Ну и главный минус: если "что-то пошло не так" и устройство превратилось в кирпич, то нужно отправлять сей кирпич изготовителю. Поэтому не вредно иметь в загрузчике аварийный режим, который всё-таки оставляет пользователю возможность оживить кирпич своими силами.


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

ЗЫ. В своих устройствах, никогда не делал "сетевых" бутов, даже с усб стараюсь связываться поменьше. Если нужно обновить по сети, то делаю так: закачиваю на сд-карту бинарь по сети, затем сброс устройства, бут делает бэкап на карту, проверяет, записалось-ли все, что нужно, затем прошивает новый бинарь и запускает. СД-карта в МК есть всегда, где есть сеть. Если апдейт не удался - восстанавливает из бэкапа, но такого еще не было ни разу...
prottoss
Блин...Извиняюсь за неправильные термины. Я не имел ввиду обновление самого бутлоадера. Я имел ввиду обновление прошивки бутлоадером.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.