реклама на сайте
подробности

 
 
> Обновление ПО с удаленного сервера., Как правильнее разделить ПО и самописный bootloader
Atridies
сообщение Dec 18 2013, 20:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Доброго времени суток, армоводы!

Есть железка на Cortex-M0, в которой хотелось бы иметь возможность обновления ПО с фирменного FTP-сервера. Все части загрузчика: скачивание файла в SPI Flash, собственно запись в MCU Flash - готово. Но пока не могу всё это взаимоувязать, чтобы получился надежный загрузчик (чтобы из-за провалов питания и кривых рук персонала - не умирал насовсем).

На msp430 делал следующим образом (обновление по rs485): все обработчики прерывания - были расположены по жестким адресам и обслуживали основное ПО. Сам загрузчик не использовал вообще прерывания - вся обработка была через контроль соответствующих флагов (кроме reset-а). Соответственно как бы чего не происходило - всегда после перевключения стартовал загрузчик и в этот момент его можно было перехватить (нужным пакетом на rs485) и обновить ПО. Если перехвата нет - уходим в основное ПО.

Ровно сделать также на кортексе - не получается: почему-то uart-ы периодически подвисают.

Вообще мне видится несколько решений задачи загрузчика:
1. Сделать работу загрузчика чисто по флагам и оставить прерывания для основного ПО. Хорошо, но пока - не получается.
2. Сделать загрузчик как часть основной программы, но тогда - все вызовы между ними надо будет делать по жестким адресам. Муторно писАть и отлаживать.
3. Сделать работу загрузчика по прерываниям, но внутри сделать ветвление: в функцию загрузчика или в функцию основного ПО. Убиваем скорость реакции. Не айс.


Вопросы, которые хотелось бы прояснить для себя:
1. Какой вариант загрузчика все-таки лучше ?
2. Нет ли каких-то подводных камней при работе с флагами прерывания, но без самих прерываний ? Возможно ли это в принципе на кортексе ?

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
A. Fig Lee
сообщение Dec 18 2013, 20:37
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



А там что,
NVIC_SetVectorTable()
не присутствует?

Можно и с векторами.
У нас на Кортексе М3 и сам бутлоадер можно апдейтить.
Состоит из 2х независимых программ, бутлоадер стартует с ресета, дальше
по условию или комманде может перейти в главную программу.
Было несколько граблей, но решаемо.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 19 2013, 09:22
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(A. Fig Lee @ Dec 19 2013, 00:37) *
У нас на Кортексе М3 и сам бутлоадер можно апдейтить.


Можно глупый вопрос? rolleyes.gif А зачем апдейтить бутлоадер вообще, создавая при этом дополнительные возможности потери прошивки?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 19 2013, 11:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(mantech @ Dec 19 2013, 13:22) *
Можно глупый вопрос? rolleyes.gif А зачем апдейтить бутлоадер вообще, создавая при этом дополнительные возможности потери прошивки?

Не всегда можно заранее предвидеть и реализовать весь функционал, который может потребоваться от загрузчика. Ну и баг может всплыть, куда ж без этого.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Dec 19 2013, 11:51
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(scifi @ Dec 19 2013, 15:05) *
Не всегда можно заранее предвидеть и реализовать весь функционал, который может потребоваться от загрузчика. Ну и баг может всплыть, куда ж без этого.


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

Работа загрузчика и обновление ПО организованы приблизительно так:
- загрузчик стартует, проверяет crc32 2х банков внешней загрузочной памяти и crc32 приложения.
- если во внешней загрузочной памяти сбой и приложение в порядке, то запускает его.
- если во внешней загрузочной памяти всё ок, а в приложении сбой, то секция приложения обновляется из того блока загрузочной памяти, прошивка в котором помечена как новая или активная или старая (в порядке убывания приоритета), или из того блока загрузочной памяти, в котором корректное crc32. После успешного обновления запускается приложение, иначе устройство уходит в глубокий сон на 10 минут.
- если во внешней загрузочной памяти всё ок и в приложении всё ок, то проверяется статус загрузочной памяти - ищется в которой из них находится прошивка со статусом новая и выполняется обновление секции приложения. В случае успешного обновления статус прошивки в области загрузочной памяти меняется на активная. В другом банке загрузочной памяти статус меняется на старая, если текущий статус банка активная После успешного обновления запускается приложение, иначе устройство уходит в глубокий сон на 10 минут.
- если во внешней загрузочной памяти сбой и в приложении сбой, то устройство уходит в глубокий сон на 10 минут.

Обновление загрузочной памяти осуществляется только в приложении (прошивка загружается через GPRS). В процессе загрузки прошивки контролируется принадлежность прошивки данному устройству, после завершения загрузки проверяется crc32 прошивки, и если всё ок, то устанавливается статус прошивки в банке загрузочной памяти - новая. После чего устройство перезагружается.

Есть устройства с одним банком загрузочной памяти.
Там вместо статусов прошивка из секции приложения сравнивается с прошивкой из загрузочной памяти (естественно если все crc32 верны).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Atridies   Обновление ПО с удаленного сервера.   Dec 18 2013, 20:10
|- - KRS   Цитата(A. Fig Lee @ Dec 19 2013, 00:37) А...   Dec 18 2013, 20:58
|- - jcxz   Цитата(A. Fig Lee @ Dec 19 2013, 02:37) У...   Dec 19 2013, 02:50
||- - A. Fig Lee   Цитата(jcxz @ Dec 18 2013, 21:50) При про...   Dec 19 2013, 03:08
||- - demiurg_spb   Цитата(jcxz @ Dec 19 2013, 06:50) При про...   Dec 19 2013, 06:33
||- - scifi   Цитата(demiurg_spb @ Dec 19 2013, 10:33) ...   Dec 19 2013, 06:49
|- - A. Fig Lee   Цитата(mantech @ Dec 19 2013, 04:22) Можн...   Dec 19 2013, 11:55
|- - mantech   Цитата(A. Fig Lee @ Dec 19 2013, 15:55) В...   Dec 19 2013, 16:37
- - kolobok0   Цитата(Atridies @ Dec 19 2013, 00:10) ..х...   Dec 18 2013, 21:14
- - Golikov A.   надо 2 загрузчика делать 1. примитивный, на 1 путь...   Dec 19 2013, 21:18
|- - mantech   Цитата(Golikov A. @ Dec 20 2013, 01:18) н...   Dec 20 2013, 06:10
- - Atridies   Спасибо за ответы! Проблема несколько модифиц...   Jan 4 2014, 23:53
- - Atridies   Проблема решена. "указатель Reset-а - на 0x0...   Jan 6 2014, 21:40
- - alx125   Цитата(Atridies @ Jan 7 2014, 01:40) Проб...   Jan 6 2014, 22:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016