|
Bootloader или загрузчик, расскажите по подробней... |
|
|
|
Apr 24 2009, 10:06
|
Участник

Группа: Новичок
Сообщений: 64
Регистрация: 7-11-08
Пользователь №: 41 437

|
Расскажите какие функции выполняет встроенный bootloader и как написать свой(и где он будет находиться). (ядро LPC2468/78)
З.Ы. когда на форумах вспоминуют про Bootloader и про загрузчик - то имеют ввиду одно и тоже?
Сообщение отредактировал Anatrulij - Apr 24 2009, 10:09
|
|
|
|
|
 |
Ответов
|
Jun 30 2010, 14:32
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Для организации загрузки программы написал несколько классов, которые должны использоваться в бутлоадере (AES шифрование, подсчет CRC и т.д.). Написал собственно загрузчик, но теперь осталось правильно все это скомпоновать.
Как сделать, чтобы определенные объекты классов компилировались с 0-го сектора (загрузчик), а остальные скажем со 2-го сектора (пользовательская программа)?
Вычитал, что это решается с помощью scatter, нашел где он настраивается в Keil, но там вроде можно всю программу сместить, а как сделать частями, ума не приложу. Была идея сделать 2 разных проекта, один загрузчик и разместить его с 0-го сектора (и использовать далее во всех остальных проектах его без изменения). А второй проект это пользовательская программа, которая всегда начинается со 2-го сектора. Есть еще плюсы, у этого метода, но главные минусы в том, что: - всегда надо четко и, самое главное, в ручную оговаривать точки входа в пользовательскую программу (включая вектора прерываний) и загрузчик, потому что при компиляции они не будут знать о существовании друг друга; - хотелось быть часть однотипного кода по работе с интерфейсами, USB, CAN и UART разместить в загрузчике, чтобы не дублировать их в двух программах. Но тут встает та же проблема, ручного указания адресов методов и самое главное ручное резервирование памяти, которое используют объекты классов интерфейсов, чтобы компилятор пользовательской программы туда ничего не назначил.
|
|
|
|
|
Jun 30 2010, 15:52
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Yaumen @ Jun 30 2010, 17:32)  Была идея сделать 2 разных проекта, один загрузчик и разместить его с 0-го сектора (и использовать далее во всех остальных проектах его без изменения). А второй проект это пользовательская программа, которая всегда начинается со 2-го сектора. Правильное решение. Программы независимы, нет возможности развивая программу случайно сделать ее несовместимой с уже выпущенными и разлетевшимися по стране загрузчиками. Цитата(Yaumen @ Jun 30 2010, 17:32)  - всегда надо четко и, самое главное, в ручную оговаривать точки входа в пользовательскую программу (включая вектора прерываний) и загрузчик, потому что при компиляции они не будут знать о существовании друг друга; Вход в загрузчик - по адресу 0. В приложение (после ремапа) - тоже по адресу 0. Адрес фиксирован, не меняется. Цитата(Yaumen @ Jun 30 2010, 17:32)  - хотелось быть часть однотипного кода по работе с интерфейсами, USB, CAN и UART разместить в загрузчике, чтобы не дублировать их в двух программах. Но тут встает та же проблема, ручного указания адресов методов сделайте таблицу переходов, расположите ее раз и навсегда в фиксированном месте. Цитата(Yaumen @ Jun 30 2010, 17:32)  и самое главное ручное резервирование памяти, которое используют объекты классов интерфейсов, чтобы компилятор пользовательской программы туда ничего не назначил. Расположите их в начале ОЗУ, сразу за отремапленой таблицей векторов. А приложению уменьшите количество ОЗУ на этот размер. Но это тоже не лучшее решение - а найдете вы потом (через год) багу в этом коде, которая не мешает загрузчику, но не дает работать приложению. И что - отзывать все выпущенные приборы на перешивку загрузчика? Или писать очередное обновление, которое перепишет загрузчик с ненулевой вероятностью сбоя питания в этот момент и все - устройство надо возвращать. Пусть лучше дублируются, но загрузчик и приложение будут совершенно автономны.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 1 2010, 05:30
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Цитата(Сергей Борщ @ Jun 30 2010, 18:52)  Вход в загрузчик - по адресу 0. В приложение (после ремапа) - тоже по адресу 0. Адрес фиксирован, не меняется. Вот тут немного поподробнее. С загрузчиком все понятно, у него свой main(), который может располагаться где угодно в пределах первых 2-х секторов, а переход на main() действительно будет по 0-му адресу. Теперь о пользовательской программе. У него также main может располагаться в любом месте оставшейся памяти и об адресе этого main() загрузчик естественно ничего не знает. Значит ему надо это указать, опять же в пользовательской области зафиксировать переход на main(), по этому адресу и будет переходить загрузчик в случае, если с прошивкой все в норме. Возможно есть еще какой-то способ, но похоже я до него еще в голове не дошел. Есть еще один минус у двух проектов. Я планирую использовать AES шифрование, которое жестко будет зашито в загрузчик, а значит все пользовательские программы необходимо шифровать одним и тем же ключем, это же касается и сигнатуры. Мне кажется это неправильно!!! Теперь что касается общей части для обоих проектов. Смысл идеи состоит в том, чтобы дать возможность обновлять прошивку удаленно. В моем случае это происходит через штатно установленный отдельный модуль связи, который общается с другими модулями по CAN. Для работы на этой шине, разработан протокол обмена, позволяющий передавать файлы больших размеров, склеивать их на приемном устройстве, вести одновременный прием от нескольких устройств, ну и т.д. Это достаточно большой кусок куда, который не хотелось бы дублировать, чтобы не тратить лишнего, так как я и так уже вышел на использование 75% имеющейся памяти. А в добавок, этот фрагмент кода очень емкий по использованию RAM. Мне самому идея удаленного программирования не нравится, однако начальство настаивает на его присутствии, так как у нас уже были случаи, когда приходилось объезжать множество объектов для перепрошивки, а когда эти объекты находятся в разных городах или даже в странах это еще более утомительно.
|
|
|
|
Сообщений в этой теме
Anatrulij Bootloader или загрузчик Apr 24 2009, 10:06 HARMHARM Цитата(Anatrulij @ Apr 24 2009, 13:06) Ра... Apr 24 2009, 10:14 Anatrulij В данных ссылках я не увидел где конкретно находит... Apr 24 2009, 14:17 HARMHARM Цитата(Anatrulij @ Apr 24 2009, 17:17) В ... Apr 24 2009, 14:52  Anatrulij Я под системным загрузчиком имел в виду загрузчик ... Apr 24 2009, 15:31   Сергей Борщ Цитата(Anatrulij @ Apr 24 2009, 18:31) Ес... Apr 24 2009, 21:19 Anatrulij А по какому адресу он расположен, и какие его функ... Apr 24 2009, 21:26 Сергей Борщ Цитата(Anatrulij @ Apr 25 2009, 00:26) А ... Apr 24 2009, 22:29 Anatrulij На этом этапе мне пока все понятно.
Как я понял за... Apr 28 2009, 11:02 Сергей Борщ Цитата(Anatrulij @ Apr 28 2009, 14:02) Ко... Apr 28 2009, 11:26 Anatrulij Из загрузчика я считаю контрольную сумму записанно... Apr 28 2009, 11:42 HARMHARM Цитата(Anatrulij @ Apr 28 2009, 14:42) Из... Apr 28 2009, 12:11 Anatrulij HARMHARM >> Да, конечно. Удобно положить кон... Apr 28 2009, 12:49 Сергей Борщ Цитата(Anatrulij @ Apr 28 2009, 15:49) А ... Apr 28 2009, 16:48 Anatrulij А где в стартапе указано адрес начала программы, а... Apr 29 2009, 13:07 HARMHARM Цитата(Anatrulij @ Apr 29 2009, 16:07) А ... Apr 29 2009, 13:21 Anatrulij А линкер это тоже отдельный фалик прикрученный к п... Apr 29 2009, 13:57 HARMHARM Цитата(Anatrulij @ Apr 29 2009, 16:57) А ... Apr 29 2009, 14:08 Anatrulij я пишу на Keil Apr 29 2009, 14:15 HARMHARM Цитата(Anatrulij @ Apr 29 2009, 17:15) я ... Apr 29 2009, 14:18 defunct Цитата(Anatrulij @ Apr 29 2009, 17:15) я ... Apr 29 2009, 14:25 Anatrulij defunct>>для RVDS компилятора - см scatter f... Apr 30 2009, 05:41 sergeeff А Reset_Addr - это метка первой команды вашего boo... Apr 30 2009, 05:55 Anatrulij Цитата(sergeeff @ Apr 30 2009, 08:55) Воо... Apr 30 2009, 06:01 Anatrulij Что-то я не могу найти в Кейле, где указывается с ... Apr 30 2009, 09:24 HARMHARM Цитата(Anatrulij @ Apr 30 2009, 12:24) Чт... Apr 30 2009, 11:36 Anatrulij А где в scatter file указан адрес начала программи Apr 30 2009, 11:42 HARMHARM Цитата(Anatrulij @ Apr 30 2009, 14:42) А ... Apr 30 2009, 14:12 Anatrulij А как с бутлоадера передать управление на загружен... Apr 30 2009, 14:33 HARMHARM Цитата(Anatrulij @ Apr 30 2009, 17:33) А ... Apr 30 2009, 18:49 Anatrulij А для Keil? May 1 2009, 07:32 sergeeff Цитата(Anatrulij @ May 1 2009, 10:32) А д... May 1 2009, 10:15 Anatrulij После окончания работы функции, куда передается уп... May 1 2009, 10:50 sergeeff Цитата(Anatrulij @ May 1 2009, 13:50) Пос... May 1 2009, 11:11  Anatrulij Цитата(sergeeff @ May 1 2009, 14:11) Так ... May 2 2009, 11:25   HARMHARM Цитата(Anatrulij @ May 2 2009, 14:25) я п... May 2 2009, 11:53    Anatrulij Цитата(HARMHARM @ May 2 2009, 14:53) Есть... May 2 2009, 12:10     HARMHARM Цитата(Anatrulij @ May 2 2009, 15:10) Мож... May 3 2009, 19:27 Anatrulij Спасибо за ссылку. Сложновато пока для меня. может... May 4 2009, 11:38 zltigo Цитата(Anatrulij @ May 4 2009, 14:38) или... May 4 2009, 11:48  Anatrulij Цитата(zltigo @ May 4 2009, 14:48) Значит... May 4 2009, 12:08 sergeeff Никак не могу понять, что же вам не понятно? Сами ... May 7 2009, 08:53 Anatrulij Цитата(sergeeff @ May 7 2009, 11:53) Ника... May 7 2009, 11:38  Сергей Борщ Цитата(Anatrulij @ May 7 2009, 14:38) я к... May 8 2009, 07:34   Anatrulij Был отвлечен другим делом, теперь можно вернуться ... Jun 12 2009, 07:32 sergeeff Для начала, считайте, что у вас пока одна единстве... May 7 2009, 18:01 Anatrulij Цитата(sergeeff @ May 7 2009, 21:01) Для ... May 7 2009, 19:34 Anatrulij В IAP указано что можно писать до 4kB, а как быть ... Jun 12 2009, 08:35 SasaVitebsk Цитата(Anatrulij @ Jun 12 2009, 11:35) В ... Jun 12 2009, 10:54  Anatrulij Цитата(SasaVitebsk @ Jun 12 2009, 13:54) ... Jun 12 2009, 11:08   HARMHARM Цитата(Anatrulij @ Jun 12 2009, 14:08) Из... Jun 13 2009, 06:08    Anatrulij Цитата(HARMHARM @ Jun 13 2009, 09:08) Сек... Jun 13 2009, 11:26     HARMHARM Цитата(Anatrulij @ Jun 13 2009, 14:26) Ес... Jun 13 2009, 12:08      Anatrulij Цитата(HARMHARM @ Jun 13 2009, 15:08) Нет... Jun 13 2009, 13:28 Anatrulij Во флеш хочу писать блоками по 4кБ, для этого мне ... Jun 17 2009, 07:42 HARMHARM Цитата(Anatrulij @ Jun 17 2009, 10:42) Во... Jun 17 2009, 08:37  Anatrulij Цитата(HARMHARM @ Jun 17 2009, 11:37) Име... Jun 17 2009, 08:40 zltigo Цитата(Anatrulij @ Jun 17 2009, 10:42) Ка... Jun 17 2009, 14:50  Anatrulij Цитата(zltigo @ Jun 17 2009, 17:50) Не пи... Jun 17 2009, 19:01   zltigo Цитата(Anatrulij @ Jun 17 2009, 22:01) Я ... Jun 17 2009, 21:22    Anatrulij Цитата(zltigo @ Jun 18 2009, 00:22) Зачем... Jun 18 2009, 05:47     HARMHARM О, да! Jun 18 2009, 13:38 Anatrulij Ложу я прошивку с помощью бутлоадера(сам он находи... Jun 23 2009, 12:51 Anatrulij Цитата(Anatrulij @ Jun 23 2009, 15:51) мо... Jun 24 2009, 06:19 Nixon Вот только перейдете вы по этому адресу в user-mod... Jun 24 2009, 07:29 Anatrulij Цитата(Nixon @ Jun 24 2009, 10:29) Вот то... Jun 24 2009, 07:53 Nixon Что именно тут комментировать? Вы вызываете SWI пр... Jun 24 2009, 09:13 Anatrulij Цитата(Nixon @ Jun 24 2009, 12:13) Что им... Jun 24 2009, 10:12  alvy Цитата(Сергей Борщ @ Jun 30 2010, 22:52) ... Jul 1 2010, 03:21 Сергей Борщ Цитата(alvy @ Jul 1 2010, 06:21) Можно с ... Jul 1 2010, 09:40 Yaumen Цитата(Сергей Борщ @ Jul 1 2010, 12:40) П... Jul 1 2010, 10:56  Сергей Борщ Цитата(Yaumen @ Jul 1 2010, 13:56) Имелос... Jul 1 2010, 11:35   Yaumen Цитата(Сергей Борщ @ Jul 1 2010, 14:35) Т... Jul 1 2010, 12:20    MrYuran Цитата(Yaumen @ Jul 1 2010, 16:20) Т.е., ... Jul 1 2010, 12:34    Сергей Борщ Цитата(Yaumen @ Jul 1 2010, 15:20) Т.е., ... Jul 1 2010, 14:20
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|