|
BootLoader, Newbee наступает с вопросами! |
|
|
|
Feb 11 2009, 16:12
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142

|
Здравствуйте, ребята!
Написал бутлоадер, написал пользовательскую программу. Оба в WinAVR. Есть в результате два .elf (ну или просто два сишника с main), теперь надо их соединить, да ещё так, чтоб бутлоадер попадал в "Boot Loader Flash Section". Направьте меня, в какую сторону копать. Есть ли что-то в MakeFile's, что должно быть подправлено?
Ещё есть несколько конкретных впросов:
В даташите на мегу уделено много внимания "Read-While-Write Section" и "No Read-While-Write Section", я не очень с ними разобрался, вообще это важно?
Я сомниваюсь при выборе алгоритма обновления прошивки, сейчас в голове такая картина: 1. Пользовательская программа, решив обновиться, произносит заклинание asm{ jmp $3F00 }, где - $3F00 - Boot Loader Flash Section. (хоть это я правильно понял? Начнёт работать бутлоадер?) 2. Бутлоадер обновляет флэш и делает asm{ jmp $02A }, запуская тем самым пользовательскую программу (или она не там?) Но почему-то хочется сделать всё через перезагрузку, вроде: 1. пользовательская программа ставит в EEPROM флаг "обновиться" и перезагружает МК 2. бутлоадер видит флаг, обновляет, снимает флаг, перезагружает МК 3. бутлоадер видит - флага нет, и запускает пользовательскую программу. Но есть ли в этом смысл, и будет ли разница между была перезагрузка - не было?
Помогите, пожалуйста, у меня очень большое желание сделать красиво :)
Спасибо!
|
|
|
|
|
 |
Ответов
|
Feb 11 2009, 20:51
|

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

|
Цитата(Злодей @ Feb 11 2009, 18:12)  да ещё так, чтоб бутлоадер попадал в "Boot Loader Flash Section". Делайте загрузчик отдельным приложением. При линковке задайте параметр -Wl,-section-start=.text=адрес, где адрес - начало области загрузчика (в байтах!) Цитата(Злодей @ Feb 11 2009, 18:12)  Бутлоадер обновляет флэш и делает asm{ jmp $02A }, запуская тем самым пользовательскую программу (или она не там?) Вектор сброса находится по адресу 0. Вот туда и передавайте управление. Не забывайте перед этим вернуть периферию в исходное состояние, а в приложении явно проинициализировать всю использованную периферию. Цитата(Злодей @ Feb 11 2009, 18:12)  Но почему-то хочется сделать всё через перезагрузку, вроде: Я использую одну из ножек, при нормальной работе настроенную на вывод. Если загрузчик видит ее настроенной на ввод - было включение питания, работа штатная. Если при этом нога притянута снаружи не туда, куда ее тянет внешняя подтяжка - это сигнал принудительной перепрошивки. Если нога притянута куда надо - проверка приложения и если все хорошо - его запуск. Если нога настроена на вывод - значит приложение передало управление загрузчику и надо сразу идти на перепрошивку.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 13 2009, 01:27
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Огурцов @ Feb 12 2009, 10:20)  Ух, как сложно и ненадежно. Переход в приложение должен быть выполнен практически сразу после входа в загрузчик (после сброса) Запускать битый аппликейшн сразу, это похоже ваш стиль... И он должно быть "чертовски" надежен... Я предпочитаю так: CODE /*********************************************** * RunApplication() * * This routine shuts-off peripherals used * * by the bootloader and performs jump to 0x0 * * address * * * ***********************************************/ void RunApplication(void) { V32 tmp = 500000; pgm_print("trying to run application...\n"); if (brmContext.appChanged) { iap_Finalize(); // make sure all flash operations are completed and RWW section re-enabled // rebuild app section CRC brmContext.appSectionCRC = iap_CheckCRC(); brmContext.appChanged = FALSE; }
if (brmContext.appSectionCRC) { // Wrong CRC! (section corrupted) pgm_print("app section CRC error detected, can't leave bootloader\n"); return; }
while(tmp--); // wait while queues being flushed
cli(); // disable interrupts
// stop timers ETIMSK = 0; // disable Extended timers int sources TIMSK = 0; // disable timers int sources
TCCR3B = 0; // stop timer3 TCCR2 = 0; // stop timer2 TCCR1B = 0; // stop timer1 TCCR0 = 0; // stop timer0
// stop uarts UCSR1B = 0; // stop UART1 UCSR0B = 0; // stop UART0
// stop SPIs SPCR = 0; // stop SPI0
// stop TWI bus TWCR = 0; // stop TWI module // reset used ports DDRF = 0; PORTF = 0; DDRE = 0; PORTE = 0; DDRB = 0; PORTB = 0;
// switch interrupt vector table to app section MCUCR = (1 << IVCE); MCUCR = (0 << IVSEL);
// jump to zero address ((void(*)(void))0x0)(); }
|
|
|
|
|
Feb 13 2009, 05:42
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(defunct @ Feb 13 2009, 01:27)  Запускать битый аппликейшн сразу, это похоже ваш стиль... И он должно быть "чертовски" надежен... Я этого не говорил, речь идет про недопустимую инициализацию железа в загрузчике между ресетом и переходом в приложение. Цитата(defunct @ Feb 13 2009, 01:27)  Я предпочитаю так Вот-вот, именно так и не надо.
|
|
|
|
|
Feb 13 2009, 07:00
|

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

|
Цитата(Огурцов @ Feb 13 2009, 07:42)  Я этого не говорил, речь идет про недопустимую инициализацию железа в загрузчике между ресетом и переходом в приложение. AT91SAM7 стартует от RC на 32КГц. Приложение может быть до 512К (минус загрузчик). Вы представляете, сколько времени займет подсчет целостности этого приложения при 32КГц тактовой? Разрешите хоть PLL включить, а? У MSP430 после включения питания запущена собака. Если ее не отключить, через 32768 тактов она сбросит процессор. Разрешите отключить ее на время проверки целостности? defunct выводит диагностические сообщения в консоль. Разрешите ему UART настроить, а то не видно ничего? Нужные порты разрешите настроить на вывод, что б не болтались?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Злодей BootLoader Feb 11 2009, 16:12 Dog Pawlowa Цитата(Злодей @ Feb 11 2009, 19:12) 1. По... Feb 11 2009, 16:21 Злодей Спасибо большое, значит поставлю фьюз, чтоб первым... Feb 11 2009, 16:28     Злодей Цитата(Сергей Борщ @ Feb 13 2009, 10:00) ... Feb 13 2009, 09:53      defunct Цитата(Злодей @ Feb 13 2009, 11:53) Так в... Feb 13 2009, 10:10       Dog Pawlowa Цитата(defunct @ Feb 13 2009, 14:10) Я со... Feb 13 2009, 10:50     Огурцов Цитата(Сергей Борщ @ Feb 13 2009, 07:00) ... Feb 13 2009, 19:46      defunct Цитата(Огурцов @ Feb 13 2009, 21:46) Есть... Feb 14 2009, 00:13       smac Цитата(defunct @ Feb 14 2009, 03:13) Резе... Feb 14 2009, 06:56       Огурцов Цитата(defunct @ Feb 14 2009, 00:13) - Ес... Feb 14 2009, 10:17        defunct Цитата(Огурцов @ Feb 14 2009, 12:17) Очен... Feb 14 2009, 20:57         Огурцов Цитата(defunct @ Feb 14 2009, 21:57) Еще ... Feb 14 2009, 21:43          defunct Цитата(Огурцов @ Feb 14 2009, 23:43) И эт... Feb 14 2009, 22:42           Огурцов Цитата(defunct @ Feb 14 2009, 23:42) Непр... Feb 14 2009, 23:03            defunct Цитата(Огурцов @ Feb 15 2009, 01:03) Разб... Feb 14 2009, 23:16             Огурцов Цитата(defunct @ Feb 15 2009, 00:16) AVR1... Feb 15 2009, 00:02              defunct Цитата(Огурцов @ Feb 15 2009, 02:02) Вот ... Feb 15 2009, 01:27               Огурцов Цитата(defunct @ Feb 15 2009, 02:27) Да н... Feb 15 2009, 02:01                defunct Цитата(Огурцов @ Feb 15 2009, 04:01) Аха,... Feb 15 2009, 02:11                 Огурцов Цитата(defunct @ Feb 15 2009, 03:11) Меша... Feb 15 2009, 02:25 Злодей Спасибо за советы, я скопирую сюда уже тысячу раз ... Feb 13 2009, 06:16 defunct Цитататак я ж сказал, как сделать правильно
С этим... Feb 15 2009, 02:31 Огурцов Цитата(defunct @ Feb 15 2009, 03:31) С эт... Feb 15 2009, 02:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|