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

 
 
> Стартовый загрузчик, с нуля
ДЕЙЛ
сообщение Sep 2 2014, 09:34
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
menzoda
сообщение Oct 9 2014, 04:54
Сообщение #2


Участник
*

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



Не так считаешь. Векторов прерываний 51, в байтах это 51*4 = 204. Округляем до 256, в двоичном виде это будет 100000000, младшие 7 бит уже равны нулю как ни крути. Выбираем адрес кратный 256, ты выбрал 0x7000, и пишем его прямо туда, не сдвигая, потому что у всех адресов кратных 256 младшие 8 бит будут всегда равны нулю.

В документации всё написано, хоть и несколько запутано:
Цитата
Vector table base offset field. It contains bits[29:7] of the offset of the table base from the bottom of the memory map.

Поле смещения таблицы векторов. Оно содержит биты [29:7] смещения таблицы относительно начального адреса. То есть надо взять смещение 0x7000, взять из него биты 29:7, получившееся число 0xE0 записать в биты 29:7 регистра. Это то же самое, что и запись в регистр числа 0x7000.

Цитата
Почему-то в пошаговом режиме после перехода по адресу программа в другом конце памяти запускается иногда после команды перехода, а после нажатия кнопки сброса никаких движений.

Не понял.

Кстати, что-то я не вижу в документации примеров использования инструкции B как у тебя, там только говориться про то, что можно указать метку или значение относительно текущего адреса в виде [PC, #imm]. Попробуй использовать:
Код
MOV R0, #0x8105
BX R0


Кроме того B может скакать только на +-2Кб, а у тебя тут вроде больше. Странно, почему ассемблер не ругнулся. Пройдись внимательно по шагам по ассемблерному коду (а не по сишному), точно вылетает на инструкции перехода? Покажи дизассемблер участка с этим переходом (что за инструкция там действительно находится).


Нашел у себя на работе IAR, в симуляторе всё работает, странно. Но всё равно ты попробуй перейти с помощью другой инструкции.

Сообщение отредактировал menzoda - Oct 9 2014, 06:33
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ДЕЙЛ   Стартовый загрузчик   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
- - menzoda   Не надо ничего сдвигать на 7 битов! Прочитай в...   Oct 8 2014, 19:17
|- - ДЕЙЛ   Цитата(menzoda @ Oct 8 2014, 23:17) Не на...   Oct 8 2014, 19:42
- - ДЕЙЛ   Почему-то в пашаговом режиме после перехода по адр...   Oct 8 2014, 20:55
|- - ДЕЙЛ   насчёт перескока на 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


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 09:15
Рейтинг@Mail.ru


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