|
Стартовый загрузчик, с нуля |
|
|
|
Sep 2 2014, 09:34
|
Местный
  
Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085

|
Хочется понять, как работает эта штука? В моём представлении это маленькая программа, находящаяся где-то в хвосте флеш-памяти. При старте начинается выполнение программы с нулевого адреса, где проверяется выполнение какого-то условия, например, уровень на определённой ножке. Если условие выполняется, то следует инструкция вроде JMP Bootloader, т.е. переход в область флеш, содержащей команды загрузчика, которые выполняет ЦПУ. Загрузчик принимает данные в виде файла *.bin по какому-либо интерфейсу МК, эти данные он раскладывает во флеш-памяти, затирая старую версию прошивки. Причём в новой версии программы должна быть та же самая процедура перехода в область загрузчика на случай следующего обновления. Если в этом месте мысли правильные, то дальше имеются мысли по поводу организации самопального загрузчика: 1. Пишется программа загрузчика - процедуры приёма и раскладки данных в памяти, компилируется в виде файла *.bin. 2. Пишется программа для записи полученного файла куда-нибудь в дальний угол памяти, начиная с определённого адреса, допустим 0х1000000. Всё, загрузчик находится в памяти. 3. Пишем рабочую программу, которая в самом начале содержит условие с переходом вроде JMP 0x1000000. Размер прошивки должен быть всегда такой, чтобы не затёрся код загрузчика.
Примерно такие у меня измышления. Насколько они правильные? Если правильные, то имеются попутные вопросы: 1. Как организовать запись байта по определённому адресу флеш на С в IAR? 2. В MSP430 перед изменением флеш нужно предварительно настроить контроллер флеш-памяти. Как обстоит дело в LPC1778? 3. Если в LPC1778 прошивка записывается через UART0, то там уже есть загрузчик? Если он есть, то можно ли его случайно стереть?
Где можно подробнее почитать на эту тему с самого нуля с пошаговой инструкцией создания загрузчика?
P.S Вынтернете гуглил на эту тему ровно несколько минут, попадались всякие описания загрузчиков планшетов, смартфонов и прочих девайсов.
Сообщение отредактировал ДЕЙЛ - Sep 2 2014, 09:39
|
|
|
|
|
 |
Ответов
|
Sep 3 2014, 10:34
|
Местный
  
Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085

|
Есть ещё вопрос по безусловному переходу. если написать такой код: Код int i; void main (void) { for (i = 0; i<20; i++) { asm (" nop "); } asm (" B 0x???? "); } то по какому адресу нужно сделать безусловный переход, чтобы программа стала заново выполняться и возможно ли это? МК LPC1778, среда IAR.
|
|
|
|
|
Sep 4 2014, 05:33
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530

|
Цитата Уже интереснее. Как это сделать в IAR? Есть скрипты компоновщика (линкера), в которых указывается расположение всех секций с кодом и данными. Мне совершенно не нравится формат этого файла, я в нем никогда не разбирался, так что сейчас ничего не скажу. Советую почитать документацию IAR по формату этого файла, там все написано. Цитата И можно ли таким способом по одному адресу раздельно записать загрузчик, а по другому программу? Т.е. по очереди два файла загрузить. Можно. Цитата Флеш полностью не стирается перед записью? Обычно, стирается по секторам, так что если разместить загрузчик и основное ПО в разных секторах проблем быть не должно. Цитата по какому адресу нужно сделать безусловный переход, чтобы программа стала заново выполняться и возможно ли это? Смотри, процесс загрузки выглядит следующим образом: 1. Сброс. Вызов соответствующего обработчика прерывания. 2. Если используется стандартный шаблон проекта, то в обработчике прерывания сброса обычно идет вызов процедуры SysInit, которая выполняет инициализацию некоторого оборудования (PLL например). 3. После SysInit вызывается процедура инициализации библиотеки времени исполнения (CRT, C Runtime Library). В Keil она имеет метку __main, в IAR не помню, может так же, может подругому. Эта процедура инициализирует кучу, статические переменные, ну и остальное по мелочи. 4. После инициализации, внутри __main вызывается уже твой main. Получается, надо переходить на начало обработчика прерывания сброса. Перейти не проблема - нужно только расположить его по фиксированному адресу в скрипте компоновщика, проблема в другом. Смотри, ты поработал, повключал какие-то прерывания, настроил UART, еще что-нибудь, а потом переходишь на процедуру сброса. Как отреагирует твоя программа на "попорченные" настройки оборудования? Ведь обычно, она запускается со сброшенным оборудованием. Что будет, если при инициализации CRT начнут шпарить прерывания UART? Думаю ничего хорошего. Конечно, можно все это предусмотреть, но это сложно и чревато сложно отлавливаемыми ошибками, поэтому лучше сбрасывать контроллер, а не просто куда-то переходить.
Сообщение отредактировал menzoda - Sep 4 2014, 05:35
|
|
|
|
|
Sep 5 2014, 10:08
|
Местный
  
Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085

|
Цитата(menzoda @ Sep 4 2014, 09:33)  2. Если используется стандартный шаблон проекта, то в обработчике прерывания сброса обычно идет вызов процедуры SysInit, которая выполняет инициализацию некоторого оборудования (PLL например). А если у меня в проекте никакие библиотеки не подключены? Просто имеется такой код: Код void main (void) { while(1) { } } и ещё вопрос Если я участок памяти программы, начиная с нулевого адреса, полностью скопирую в ОЗУ по адресу ADRES, затем после процедуры копирования сделаю перескок ассемблерной инструкцией asm (" B ADRES ");, то это будет равносильно выполнению программы заново? Работать будет? Пока в матчасть вникаю, до железа руки не доходят. Вот ещё непонятность. в описании ядра CM3 есть такие слова: "Таблица векторов прерываний может быть перемещена по другому адресу в области кода или в области ОЗУ" и далее имеется описание регистра смещения таблицы векторов VTOR. Как выглядит участок программы, который перемещает эту таблицу векторов? Нужно просто в регистр смещения записать новый адрес? Какие-то дополнительные действия нужны? Хотелось бы посмотреть пример исходника.
Сообщение отредактировал ДЕЙЛ - Sep 5 2014, 10:43
|
|
|
|
Сообщений в этой теме
ДЕЙЛ Стартовый загрузчик Sep 2 2014, 09:34 smalcom Цитатанаходящаяся где-то в хвосте флеш-памяти
нет.... Sep 2 2014, 10:40 ДЕЙЛ Цитата(smalcom @ Sep 2 2014, 14:40) нет. ... Sep 2 2014, 11:43  adnega Цитата(ДЕЙЛ @ Sep 2 2014, 15:43) В начале... Sep 2 2014, 12:22 Lagman А если загрузчик и программа используют одно преры... Sep 2 2014, 11:47 ДЕЙЛ Цитата(Lagman @ Sep 2 2014, 15:47) А если... Sep 3 2014, 06:25  adnega Цитата(ДЕЙЛ @ Sep 3 2014, 10:25) Думаю, ч... Sep 3 2014, 06:29 AlexandrY Цитата(ДЕЙЛ @ Sep 2 2014, 12:34) 3. Если ... Sep 2 2014, 12:37 esaulenka Цитата(AlexandrY @ Sep 2 2014, 16:37) LPC... Sep 8 2014, 12:46 Сергей Борщ Справа вверху кнопка "Поиск", в выпадающ... Sep 2 2014, 13:10 ДЕЙЛ Цитата(Сергей Борщ @ Sep 2 2014, 17:10) В... Sep 3 2014, 06:47  adnega Цитата(ДЕЙЛ @ Sep 3 2014, 10:47) я свои и... Sep 3 2014, 07:53   ДЕЙЛ Цитата(adnega @ Sep 3 2014, 11:21) Дык, в... Sep 3 2014, 08:09 Сергей Борщ Цитата(ДЕЙЛ @ Sep 3 2014, 09:25) Думаю, ч... Sep 3 2014, 07:56   menzoda Цитата(ДЕЙЛ @ Sep 5 2014, 14:08) А если у... Sep 5 2014, 10:45    ДЕЙЛ Цитата(menzoda @ Sep 5 2014, 14:45) Может... Sep 5 2014, 11:09     menzoda В кратце опишу, как я это вижу. Подробности поведе... Sep 5 2014, 13:25      ДЕЙЛ Покопался в настройках линкера, нашёл настройки ли... Oct 6 2014, 21:21       menzoda ЦитатаВ каком известном векторе прерывания находит... Oct 8 2014, 05:17        ДЕЙЛ Цитата(menzoda @ Oct 8 2014, 09:17) Во-пе... Oct 8 2014, 18:57 ДЕЙЛ Цитата(ДЕЙЛ @ Sep 3 2014, 14:34) Есть ещё... Sep 5 2014, 07:49 andrewlekar Вот исходники загрузчика для LPC178X. Практически ... Sep 8 2014, 06:39 ДЕЙЛ Пока в исходник загрузчика глубоко не влазил. Хочу... Sep 30 2014, 10:35 Сергей Борщ Цитата(ДЕЙЛ @ Sep 30 2014, 13:35) В мануа... Sep 30 2014, 11:36  ДЕЙЛ Цитата(Сергей Борщ @ Sep 30 2014, 15:36) ... Sep 30 2014, 12:50   Lagman Цитата(ДЕЙЛ @ Sep 30 2014, 16:50) Но ведь... Sep 30 2014, 14:00 toweroff ДЕЙЛ, я, конечно, ничего против не имею, но такая ... Oct 8 2014, 14:52 menzoda Не надо ничего сдвигать на 7 битов! Прочитай в... Oct 8 2014, 19:17 ДЕЙЛ Цитата(menzoda @ Oct 8 2014, 23:17) Не на... Oct 8 2014, 19:42 ДЕЙЛ Почему-то в пашаговом режиме после перехода по адр... Oct 8 2014, 20:55 menzoda Не так считаешь. Векторов прерываний 51, в байтах ... Oct 9 2014, 04:54 ДЕЙЛ насчёт перескока на 2кб на какой странице мануала ... Oct 9 2014, 06:47  menzoda Цитатанасчёт перескока на 2кб на какой странице ма... Oct 9 2014, 07:30   ДЕЙЛ Цитата(menzoda @ Oct 9 2014, 11:30) То ес... Oct 9 2014, 08:53 menzoda ЦитатаМошть ещё нужно указатель стека на нужное ме... Oct 9 2014, 10:15 ДЕЙЛ Железно заработало
дело было ещё и в указателе ... Oct 9 2014, 19:26 menzoda ЦитатаЖелезно заработало
Наконец! Всем миром з... Oct 10 2014, 04:59 ДЕЙЛ Оставлю тут свой код загрузчика на всякий случай, ... Feb 16 2015, 12:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|