|
stm32 bootloader, разьясните новичку |
|
|
|
Apr 18 2012, 11:40
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Помогите, пожалуйста, поставить точки над i. Насколько мне понятно, в stm32 bootloader может быть использован вместо программатора. Для того, чтоб залить прошивку в контроллер, необходимо подсоединить плату с МК к компу через ком порт( по USART1 МК), подать на вход бут0 1, на бут 1 -0, загрузить бинарник, используя специальную утилиту Flash Loader Demonstrator.Это весь алгоритм? Второй вопрос. Часто встречается в сети такое выражение, как "написать загрузчик". Что имеется в виду под этим? В каком случае нужно писать свой загрузчик и как это сделать?
Сообщение отредактировал batisto4ka - Apr 18 2012, 11:41
|
|
|
|
|
 |
Ответов
|
Apr 19 2012, 06:41
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Вектора прерываний переносятся потому, что и бутлоадеру и основной прошивке как правило требуется работа с прерываниями, и необходимо выбирать какой код обработчика прерывания мы выполняем - код бутлоадера или код основной прошивки. Для этой цели у STMовского контроллера прерываний есть функция переноса таблицы векторов прерываний. При этом появляется возможность иметь отдельные наборы обработчиков прерываний для бутлоадера и для основной прошивки. Конечно возможен вариант с одной таблицей векторов, и программным выбором какой обработчик использовать (устанавливаем флаг работает бутлоадер или основная прошивка, и по этому флагу делаем if в ветках которого расположены разные обработчики) - бутлоадера или основной прошивки (в зависимости от того что активно), но такой вариант замедляет реакцию системы на прерывания. Вариант с переносом таблицы векторов удобней тем, что в памяти программ мы можем хранить несколько разных прошивок (естественно скомпилированных и линкованных для использования разных стартовых адресов), и на старте системы можем выбирать какой из прошивок отдавать управление. Сейчас как раз занимаюсь такой развлекухой)). Требуется шиться по CAN с оооочень низкой скоростью (порядок байтов в секунду), причем с огромной вероятностью разрывов на линии. При этом вероятность того, что устройство продолжит функционировать после неудачной перепрошивки, должна стремится к 100%.
|
|
|
|
|
Apr 19 2012, 07:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(lead_seller @ Apr 19 2012, 12:41)  Вектора прерываний переносятся потому, что и бутлоадеру и основной прошивке как правило требуется работа с прерываниями, и необходимо выбирать какой код обработчика прерывания мы выполняем - код бутлоадера или код основной прошивки. Для этой цели у STMовского контроллера прерываний есть функция переноса таблицы векторов прерываний. При этом появляется возможность иметь отдельные наборы обработчиков прерываний для бутлоадера и для основной прошивки. Конечно возможен вариант с одной таблицей векторов, и программным выбором какой обработчик использовать (устанавливаем флаг работает бутлоадер или основная прошивка, и по этому флагу делаем if в ветках которого расположены разные обработчики) - бутлоадера или основной прошивки (в зависимости от того что активно), но такой вариант замедляет реакцию системы на прерывания. Вариант с переносом таблицы векторов удобней тем, что в памяти программ мы можем хранить несколько разных прошивок (естественно скомпилированных и линкованных для использования разных стартовых адресов), и на старте системы можем выбирать какой из прошивок отдавать управление. Сейчас как раз занимаюсь такой развлекухой)). Требуется шиться по CAN с оооочень низкой скоростью (порядок байтов в секунду), причем с огромной вероятностью разрывов на линии. При этом вероятность того, что устройство продолжит функционировать после неудачной перепрошивки, должна стремится к 100%. У нас работают тысячи устройств имеющих загрузчик (правда на LPC). Обновление прошивки - по любому интерфейсу по рабочему протоколу, при внезапной перезагрузке ничего не слетит 100%, загрузка нового ПО может быть продолжена с точки разрыва. Сбой питания возможен в любой момент хоть при загрузке прошивки хоть при обновлении её во флеш. Никакие таблицы векторов переносить не надо - на время работы загрузчика прерывания запрещены, рабочее ПО при старте само настраивает таблицу прерываний. ПО состоит из: 1. неизменяемой части (загрузчика) в первом секторе флеш, который прошивается изначально на заводе и при удалённой прошивке не может быть перешит; 2. собственно рабочего ПО (во флеш после загрузчика). Вся флеш (за исключением первого сектора) делится на две половины: первая - область исполняемого рабочего ПО; вторая - область хранения нового ПО, которое надо прошить. Рабочее ПО по любому интерфейсу (или по всем включая CAN и беспроводные) принимает прошивку по рабочему протоколу устройства среди прочего обмена данными не мешая основной работе устройства. Приём идёт в ОЗУ (так как если шить сразу во вторую половину флеши контроллера, то надо запрещать прерывания надолго, а это помешает работе основной программы). По завершении приёма и проверки валидности прошивки, новая прошивка переписывается во вторую половину флеш контроллера и во флеш выставляется флаг требования обновления прошивки, после чего делается RESET процу. Стартует загрузчик, который обнаружив флаг и проверив CRC прошивки во второй половине, перешивает прошивку из второй половины флеш в первую, далее - удаляет флаг и стартует рабочее ПО из первой половины флеш. Если загрузчик флаг не обнаруживает - значит не надо обновлять прошивку и просто передаёт управление рабочему ПО в первую половину прошивки. Вот такой алгоритм обеспечивает 100%-надёжное удалённое обновление прошивки в устройстве по рабочему протоколу, не боящееся неожиданных сбоев питания и с возможностью широковещательного обновления ПО. Если в устройстве есть внешняя энергонезависимая память (SPI-флеш к примеру), то можно обойтись без хранения принимаемой прошивки во второй половине флеш контроллера и хранить её в этой памяти. Цитата(Danis @ Apr 19 2012, 13:04)  Вероятно, можно и не переносить, но мне пока в голову не приходит, как организовать тогда взаимодействие загрузчика и основной программы. Расположите с помощью компоновщика команду перехода на _c_int00 (точку входа в С-программу) с самого начала образа прошивки и передавайте управление на первый адрес прошивки. Цитата(Danis @ Apr 19 2012, 13:04)  Обработчики прерываний описываютсся одинаково везде. Неправда
|
|
|
|
|
Apr 26 2012, 07:05
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 19 2012, 11:22)  Вот такой алгоритм обеспечивает 100%-надёжное удалённое обновление прошивки в устройстве по рабочему протоколу, не боящееся неожиданных сбоев питания и с возможностью широковещательного обновления ПО. У вашего подхода есть минус. Представьте ситуацию - загруженная прошивка в девайс имеет правильную crc, но сама по себе так испорчена, что не позволяет загрузить новую прошивку.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 26 2012, 12:08
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 26 2012, 12:07)  Ваши предложения как обойти этот минус? По-моему обойти это можно только, если неизменяемый загрузчик в первом секторе флеш, зашиваемый вами на заводе, будет иметь возможность "засасывать" прошивку из вне.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 26 2012, 13:59
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Lotor @ Apr 26 2012, 18:08)  По-моему обойти это можно только, если неизменяемый загрузчик в первом секторе флеш, зашиваемый вами на заводе, будет иметь возможность "засасывать" прошивку из вне. Каким образом? Учтите мои требования по интерфейсам, приплюсуйте сюда необходимость реализации некоего рабочего протокола обмена (довольно сложного) в бутлоадере, необходимость определения параметров конфигурации каналов связи (формат этой конфигурации каналов связи может от прошивки к прошивке поменяться и бутлоадер должен заранее знать какой он был в прошлом и будет в будущем  Т.е. - вам придётся еще раз реализовать все те функции, что есть в рабочем ПО + необходимо как-то определить, что основное рабочее ПО функционирует неверно (а ведь определить это бутлоадеру будет очень сложно, раз на этапе тестирования новой прошивки вы сами не выявили её неработоспособности, значит эту неработоспособность очень сложно даже вам определить не говоря уже о бутлоадере  Таким образом вам придётся написать бутлоадер значительно сложнее самого рабочего ПО! Значит если у нас рабочее ПО перед пуском в серию должно пройти опытную эксплуатацию на объекте как минимум месяц, то и такой бутлоадер тем более надо ставить на опытную эксплуатацию. Только как вы будете его отлаживать, ставить на опытную эксплуатацию на объект и УДАЛЁННО ОБНОВЛЯТЬ??? Таким образом - приходим к абсурдности этой идеи  А если вы о простом интерфейсе для обновления ПО, не подразумевающем использование различных каналов связи с переменной конфигурацией, то по-моему это уже есть в самом проце в ROM изначально - у NXP в её LPC есть ISP через UART. Цитата(lead_seller @ Apr 26 2012, 18:52)  Раздумывал над таким вариантом. Придумал такой вариант тестирования прошивки: в самой прошивке пишем функцию и располагаем ее по четко указанному адресу памяти программ, задача функции получить какое-нибудь число, выполнить некие действия (например, какие то арифметические действия) и вернуть ответ. Перед загрузкой основной прошивки бутлоадер сделает вызов этой функции с какими-то данными, получит от нее результат, выполнит такие же операции с этим же набором данных сам, сравнит результаты, если результаты совпадут то прошивка будет считаться валидной. Получится эдакий аналог системы пароль-отзыв. Конечно, от необнаруженных при помощи CRC ошибок в прошивке это может и не спасти (если ошибки в прошивке есть, а сама функция-ключ будет работоспособной), но хотя бы спасет от заливки "левых" прошивок и выполнения устройством непредусмотренных действий. Всё то же самое, но гораздо лучше реализует обычное CRC всей прошивки. Ведь вы предлагаете контролировать малую часть прошивки (функцию), а я - всю прошивку. А спасение от заливки левых прошивок в моём способе делает бутлоадер, проверяя эту самую CRC перед обновлением поверх рабочей. Считать CRC генерируемой прошивки должен линковщик, благо к примеру в IAR-е это есть. Либо сторонее ПО - автоматом следующим шагом после линковки.
|
|
|
|
Сообщений в этой теме
batisto4ka stm32 bootloader, разьясните новичку Apr 18 2012, 11:40 lead_seller Бутлоадер (термин "загрузчик" имеет неск... Apr 18 2012, 11:52 KnightIgor Цитата(batisto4ka @ Apr 18 2012, 12:40) П... Apr 18 2012, 11:53 batisto4ka Спасибо всем, кто откликнулся. Подскажите, где мож... Apr 18 2012, 11:57 nicks80 Цитата(batisto4ka @ Apr 18 2012, 15:57) С... Apr 18 2012, 13:12 batisto4ka И еще хотелось бы уточнить, есть отладочная плата ... Apr 18 2012, 13:16 lead_seller Собственно ответы:
1. да
2. нет. Заводской бутлоа... Apr 18 2012, 20:22 scifi Цитата(lead_seller @ Apr 19 2012, 00:22) ... Apr 18 2012, 20:45  Danis Цитата(scifi @ Apr 19 2012, 00:45) +1.
Пл... Apr 18 2012, 23:38 batisto4ka Цитата(lead_seller @ Apr 19 2012, 00:22) ... Apr 19 2012, 05:44  Danis Цитата(batisto4ka @ Apr 19 2012, 08:44) 1... Apr 19 2012, 07:04   KRS Цитата(Danis @ Apr 19 2012, 10:57) таблиц... Apr 19 2012, 07:07  batisto4ka Цитата(jcxz @ Apr 19 2012, 11:22) 1. неиз... Apr 19 2012, 07:26   Danis Цитата(batisto4ka @ Apr 19 2012, 10:26) Н... Apr 19 2012, 07:31   jcxz Цитата(batisto4ka @ Apr 19 2012, 13:26) 1... Apr 19 2012, 07:34  Danis Цитата(jcxz @ Apr 19 2012, 10:22) Неправд... Apr 19 2012, 07:27      Lotor Цитата(jcxz @ Apr 26 2012, 17:59) Таким о... Apr 27 2012, 04:23       jcxz Цитата(Lotor @ Apr 27 2012, 10:23) Абсурд... Apr 27 2012, 05:01        Lotor Цитата(jcxz @ Apr 27 2012, 09:01) Или Вы ... Apr 27 2012, 05:17         jcxz Цитата(Lotor @ Apr 27 2012, 11:17) Зачем ... Apr 27 2012, 05:33          Lotor Цитата(jcxz @ Apr 27 2012, 09:33) Если вс... Apr 27 2012, 05:59 Marto Цитата(lead_seller @ Apr 19 2012, 12:41) ... Apr 19 2012, 07:36 batisto4ka Правильно ли я понимаю, что под переносом таблицы ... Apr 19 2012, 06:49 lead_seller Делаю примерно так же, но помимо текущей версии ПО... Apr 19 2012, 07:27 jcxz Цитата(lead_seller @ Apr 19 2012, 13:27) ... Apr 19 2012, 07:41 lead_seller При каждом старте бутлоадер проверяет целостность ... Apr 19 2012, 07:44 jcxz Цитата(lead_seller @ Apr 19 2012, 13:44) ... Apr 19 2012, 07:48 jcxz Цитата(lead_seller @ Apr 19 2012, 13:44) ... Apr 19 2012, 09:06 lead_seller Не спорю. Вообще и при моем алгоритме тоже. Но луч... Apr 19 2012, 07:56 lead_seller У нас проблемы с настройками связи не возникают. П... Apr 19 2012, 12:36 EugenyAM Хочу привести несколько рекомендаций, основываясь ... Apr 19 2012, 18:37 batisto4ka Подскажите, как сделать безусловный переход по адр... Apr 22 2012, 17:02 scifi Цитата(batisto4ka @ Apr 22 2012, 21:02) Н... Apr 22 2012, 18:18 EugenyAM Цитата(batisto4ka @ Apr 23 2012, 00:02) П... Apr 23 2012, 03:44  batisto4ka Цитата(EugenyAM @ Apr 23 2012, 07:44) Отв... Apr 23 2012, 07:03   EugenyAM Цитата(batisto4ka @ Apr 23 2012, 14:03) Г... Apr 23 2012, 09:29  batisto4ka Цитата(EugenyAM @ Apr 23 2012, 07:44) //У... Apr 23 2012, 13:34   scifi Цитата(batisto4ka @ Apr 23 2012, 17:34) ч... Apr 23 2012, 13:52    batisto4ka Цитата(scifi @ Apr 23 2012, 17:52) Мне во... Apr 24 2012, 13:53     scifi Цитата(batisto4ka @ Apr 24 2012, 17:53) В... Apr 24 2012, 13:59      batisto4ka Цитата(scifi @ Apr 24 2012, 17:59) Для эт... Apr 24 2012, 19:17   EugenyAM Цитата(batisto4ka @ Apr 23 2012, 20:34) ч... Apr 23 2012, 19:32 k000858 подскажите плиз по переходу из бутлоадера в основн... Apr 26 2012, 06:12 EugenyAM Цитата(k000858 @ Apr 26 2012, 13:12) - мо... Apr 26 2012, 08:31 lead_seller Раздумывал над таким вариантом. Придумал такой вар... Apr 26 2012, 12:52 batisto4ka Прилагаю свой проект с функцией перехода по адресу... Apr 26 2012, 13:00 spasbyspas Цитата(batisto4ka @ Apr 26 2012, 16:00) П... Apr 26 2012, 17:06  batisto4ka Цитата(spasbyspas @ Apr 26 2012, 21:06) П... Apr 27 2012, 06:36 batisto4ka Помогите домучать бутлоадер.
Программа бутлоадера... May 3 2012, 07:59 EugenyAM Цитата(batisto4ka @ May 3 2012, 13:59) Я ... May 4 2012, 03:34  batisto4ka Так все решено. На самом деле в программу, которая... May 4 2012, 05:37 veteq Вопрос по встроенному загрузчику STM, возможно ли ... Dec 23 2013, 05:26 demiurg_spb Цитата(veteq @ Dec 23 2013, 09:26) Тут пи... Dec 23 2013, 06:45 veteq Спасибо, действительно все заработало. Основное мо... Dec 23 2013, 10:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|