|
Стартовый загрузчик, с нуля |
|
|
|
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
|
|
|
|
|
 |
Ответов
|
Oct 8 2014, 19:17
|
Участник

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

|
Не надо ничего сдвигать на 7 битов! Прочитай внимательнее про этот регистр: эти биты не используются, потому что таблица прерываний должна быть выровнена по определенному адресу, кратному размеру таблицы, округленному до следующей степени двойки.
Второе. Никаких жестко заданных 0x8105! При следующей компиляции этот адрес может быть совсем другим. Я же сказал, как его достать: читаешь значение из второго вектора в таблице основного ПО, которая всегда находится в известном (определенном тобой) месте.
Надо бы проект посмотреть, да у меня IAR не стоит. Попробуй для начала просто отладить переход: вставь эту инструкцию в стартап файл загрузчика, сразу в ResetHandler, пускай переходит куда-нибудь рядом, через пару адресов. Попробуй другие инструкции вроде BX, которые переходят по адресу из указанного регистра. Только почитай про них внимательнее, при использовании BX и BLX младший бит адреса назначения должен быть установлен.
|
|
|
|
|
Oct 8 2014, 19:42
|
Местный
  
Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085

|
Цитата(menzoda @ Oct 8 2014, 23:17)  Не надо ничего сдвигать на 7 битов! Прочитай внимательнее про этот регистр: эти биты не используются, потому что таблица прерываний должна быть выровнена по определенному адресу, кратному размеру таблицы, округленному до следующей степени двойки. В хидере 35 прерываний и добавим 16 исключений, как написано в руководстве на ядро, получили 51, ближайшая степень двойки - 64, умножаем на 4 и получим 0x100. Этому числу должен быть кратен адрес таблицы векторов, т.е. 0x7000 подходит. Далее читаю описание полей регистра VTOR: Бит 29 TBLBASE - расположение таблицы в оперативке(1) или во флеш(0) Биты 28:7 TBLOFF - Смещение таблицы относительно начала области кода или области ОЗУ,т.е. к 0x7000 добавляем справа 7 нулевых битов и получаем 0x380000 и записываем это число в регистр VTOR. Цитата(menzoda @ Oct 8 2014, 23:17)  Второе. Никаких жестко заданных 0x8105! При следующей компиляции этот адрес может быть совсем другим. Я же сказал, как его достать: читаешь значение из второго вектора в таблице основного ПО, которая всегда находится в известном (определенном тобой) месте. Пока не трогаю записанные данные по адресу 0x7000, т.е. никуда ничего не перемещаю, а пытаюсь маленькой программой запустить большую, расположеннуюв другом месте памяти. И адрес 8105 не меняется в моём случае.
Сообщение отредактировал ДЕЙЛ - Oct 8 2014, 19: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 ДЕЙЛ Есть ещё вопрос по безусловному переходу.
если на... Sep 3 2014, 10:34 menzoda ЦитатаУже интереснее. Как это сделать в IAR?
Есть ... Sep 4 2014, 05:33  ДЕЙЛ Цитата(menzoda @ Sep 4 2014, 09:33) 2. Ес... Sep 5 2014, 10:08   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 ДЕЙЛ Почему-то в пашаговом режиме после перехода по адр... 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
|
|
|