Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: BootLoader
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Злодей
Здравствуйте, ребята!

Написал бутлоадер, написал пользовательскую программу. Оба в 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. бутлоадер видит - флага нет, и запускает пользовательскую программу.
Но есть ли в этом смысл, и будет ли разница между была перезагрузка - не было?

Помогите, пожалуйста, у меня очень большое желание сделать красиво :)

Спасибо!
Dog Pawlowa
Цитата(Злодей @ Feb 11 2009, 19:12) *
1. Пользовательская программа, решив обновиться, произносит заклинание asm{ jmp $3F00 }, где - $3F00 - Boot Loader Flash Section. (хоть это я правильно понял? ...

Не совсем. Ставите фьюз перехода на бут после сброса и контроллер будет туда переходить по сбросу. Соответственно приложение должно сбрасывать контроллер.
Все остальное тоже не до конца продумано. Обычно бутлоадер должен быть автономным от приложения, т.к. если во время перезаписи флэш выключится питание, вся система может рухнуть.
Злодей
Спасибо большое, значит поставлю фьюз, чтоб первым всегда был автономный бутлоадер smile.gif
Сергей Борщ
Цитата(Злодей @ 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) *
Но почему-то хочется сделать всё через перезагрузку, вроде:
Я использую одну из ножек, при нормальной работе настроенную на вывод. Если загрузчик видит ее настроенной на ввод - было включение питания, работа штатная. Если при этом нога притянута снаружи не туда, куда ее тянет внешняя подтяжка - это сигнал принудительной перепрошивки. Если нога притянута куда надо - проверка приложения и если все хорошо - его запуск. Если нога настроена на вывод - значит приложение передало управление загрузчику и надо сразу идти на перепрошивку.
Огурцов
Цитата(Сергей Борщ @ Feb 11 2009, 21:51) *
Не забывайте перед этим вернуть периферию в исходное состояние, а в приложении явно проинициализировать всю использованную периферию

Ух, как сложно и ненадежно. Переход в приложение должен быть выполнен практически сразу после входа в загрузчик (после сброса), тогда голова об инициализации болеть не будет. А сброс, конечно же, выполняется по собаке.
defunct
Цитата(Огурцов @ 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)();
}
Огурцов
Цитата(defunct @ Feb 13 2009, 01:27) *
Запускать битый аппликейшн сразу, это похоже ваш стиль... И он должно быть "чертовски" надежен...

Я этого не говорил, речь идет про недопустимую инициализацию железа в загрузчике между ресетом и переходом в приложение.

Цитата(defunct @ Feb 13 2009, 01:27) *
Я предпочитаю так

Вот-вот, именно так и не надо.
Злодей
Спасибо за советы, я скопирую сюда уже тысячу раз сказанное "Bootloader - как сделать?" - прочитать апноут atmel 109, даташит на МК, WinAVR/doc/avr-libc/avr-libc-user-manual/boot_8h.html все вопросы отпадают.
Сергей Борщ
Цитата(Огурцов @ Feb 13 2009, 07:42) *
Я этого не говорил, речь идет про недопустимую инициализацию железа в загрузчике между ресетом и переходом в приложение.
AT91SAM7 стартует от RC на 32КГц. Приложение может быть до 512К (минус загрузчик). Вы представляете, сколько времени займет подсчет целостности этого приложения при 32КГц тактовой? Разрешите хоть PLL включить, а? У MSP430 после включения питания запущена собака. Если ее не отключить, через 32768 тактов она сбросит процессор. Разрешите отключить ее на время проверки целостности? defunct выводит диагностические сообщения в консоль. Разрешите ему UART настроить, а то не видно ничего? Нужные порты разрешите настроить на вывод, что б не болтались?
Dog Pawlowa
Цитата(Сергей Борщ @ Feb 13 2009, 10:00) *
Разрешите ...

Если принимать высказывание Огурцова как напоминание, что приложение не должно рассчитывать, что что-то сконфигурировано загрузчиком, то можно придти к консенсусу smile.gif
Злодей
Цитата(Сергей Борщ @ Feb 13 2009, 10:00) *
...Вы представляете, сколько времени займет подсчет целостности этого приложения...

Так вроде ни кто не советует проверять перед каждым запуском 05.gif
defunct
Цитата(Злодей @ Feb 13 2009, 11:53) *
Так вроде ни кто не советует проверять перед каждым запуском 05.gif

Я советую проверять перед каждым запуском. Мало ли какая ситуация случится, например - бутлоадер что-то шил и пропало питание.
Dog Pawlowa
Цитата(defunct @ Feb 13 2009, 14:10) *
Я советую ..

И я советую. Куда торопиться? Наоборот, желательно иметь возможность обратиться именно к загрузчику после сброса до старта приложения. Конечно, от прибора зависит, но у меня 3 секунды загрузчик ждет.
Огурцов
Цитата(Сергей Борщ @ Feb 13 2009, 07:00) *
AT91SAM7 стартует от RC на 32КГц.

Мы про AVR ?

Цитата(Сергей Борщ @ Feb 13 2009, 07:00) *
Разрешите хоть PLL включить, а?

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

Цитата(Сергей Борщ @ Feb 13 2009, 07:00) *
У MSP430 после включения питания запущена собака.

Так AVR и сбрасывается собакой. Все остальное от лукавого. И собаку в загрузчике сбрасывать никто не запрещает.

Цитата(Сергей Борщ @ Feb 13 2009, 07:00) *
Разрешите отключить ее на время проверки целостности?

Я не отключаю и не советую.

Цитата(Сергей Борщ @ Feb 13 2009, 07:00) *
defunct выводит диагностические сообщения в консоль.

Это режим отладки ? Делайте что попало. Если штатный, то это уже допущение, которое требуется учитывать _всеми_.

Цитата(Сергей Борщ @ Feb 13 2009, 07:00) *
Нужные порты разрешите настроить на вывод, что б не болтались?

А у Вас что-то болтается ? Не верю (с) По крайней мере у меня ничего никогда не болтается. В общем, опять мимо. Есть еще какие-то дургие причины инициализировать железо до контроля валидности флеша ?


Цитата(Злодей @ Feb 13 2009, 09:53) *
Так вроде ни кто не советует проверять перед каждым запуском 05.gif

Я советую. Так же как и загрузчик. Так же как и область данных. Так же как и фьюзы.
defunct
Цитата(Огурцов @ Feb 13 2009, 21:46) *
Есть еще какие-то другие причины инициализировать железо до контроля валидности флеша ?

Вопрос на мой взгяд тупой, ровно настолько, насколько будет тупым вопрос - "есть какие-то причины позавтракать после того как почистили зубы?"

Давайте его перефразируем, чтобы вложить в него смысл:
- Есть еще какие-то другие причины инициализировать железо перед запуском приложения?

Есть конечно же.
Первая и наиболее серьезная причина - влетели в бут нештатным образом (врезультате ошибки основного приложения).

Вторая причина - допустим Bootloader проверил целостность, и с апп - все Ок. Как теперь ему узнать надо обновлять прошивку или не надо?
Без инициализации периферии - никак (аргумент "аппликейшн сообщает" - не катит, т.к. такой подход добавляет зависимость между бутлоадером и приложением).
Итого хоть какую-то периферию проиниализировать надо чтобы принять решение, что буту делать дальше:
1. обновить прошивку;
2. запустить приложение;
3. сделать что-то еще (например провести диагностику железа, отгрузить дамп/статисткику последнего запуска и т.п.).

Раз инициализируем хотя бы один пин хотя бы одного порта, то что мешает проинициализировать сразу всё, что бутлоадеру может потребоваться. Тогда функция запуска приложения из любого состояния бутлоадера будет одинаковой. Где меньше исключений - там выше надежность.

Цитата
Это режим отладки ? Делайте что попало. Если штатный, то это уже допущение, которое требуется учитывать _всеми_.

В приведенном выше коде консоль используется в штатном режиме. (полезно вообще, и вдвойне полезно когда возникают какие-то проблемы).
учитывать _всеми_ - кеми? Основное приложение у меня и не знает о существовании бутлоадера. Работает как с ним так и без.

Выключить периферию так, чтобы от железного сброса было не отличить - дело нехитрое. Насколько это сложно - сами видите, достаточно просто записать 0 в соотв. регистры периферии.

Цитата
Так AVR и сбрасывается собакой. Все остальное от лукавого.
Резетить контроллер из бутлоадера по WDT после проверки целостности прошивки чтобы запустить app, одним словом называется - дебилизм. Причину назову если спросите. (конечно же вы так не делаете, поэтому это к вам не относится. Только тут у меня возникает вопрос - а как вы запускаете приложение после обновления прошивки, ведь в процессе обновления прошивки вы периферию инициализируете, не так ли?).

Цитата
И собаку в загрузчике сбрасывать никто не запрещает.

По поводу сбрасывания WDT - тут строго говоря, всегда надо исходить из того, что по законам Мерфи WDT включен и обязательно с минимально возможным интервалом.
А это значит, что в некоторых случаях (низкая тактовая + обновление NRWW) может понадобиться хотя бы изменить его интервал, иначе МК может сброситься при выполнении SPM.
smac
Цитата(defunct @ Feb 14 2009, 03:13) *
Резетить контроллер из бутлоадера по WDT после проверки целостности прошивки чтобы запустить app, одним словом называется - дебилизм. Причину назову если спросите...

Назовите, если не сложно (я не с целью подлить масла в огонь, просто хочется знать). Вопрос как быть если в уарте, например, "недопереданный байт" остался. Хотя в принципе это тоже можно проверить и дождаться окончания передачи.
Огурцов
Цитата(defunct @ Feb 14 2009, 00:13) *
- Есть еще какие-то другие причины инициализировать железо перед запуском приложения?

Резонно, т.к. там была редакция, которая куда-то исчезла. Звучало примерно: "между ресетом и запуском приложения". Где-то между этим, конечно, проверка.

Цитата(defunct @ Feb 14 2009, 00:13) *
Первая и наиболее серьезная причина - влетели в бут нештатным образом (врезультате ошибки основного приложения).

Точно в начальный адрес загрузчика ? Или от балды ? Если первое, то у меня снова уйдет на начало приложения. Это пока. Хооший вопрос, кстати. Вероятно нужно посмотреть, что ресета не было и вообще остановить камень.

Цитата(defunct @ Feb 14 2009, 00:13) *
Вторая причина - допустим Bootloader проверил целостность, и с апп - все Ок. Как теперь ему узнать надо обновлять прошивку или не надо?
Без инициализации периферии - никак (аргумент "аппликейшн сообщает" - не катит, т.к. такой подход добавляет зависимость между бутлоадером и приложением).

Очень даже как. Так же, как у атмела. По холодному старту ждем апдейт, если он не произошел, по таймауту собаки сваливаемся опять в загрузчик, проверяем как в него попали, проверяем флешь и если все нормально уходим в приложение.

Цитата(defunct @ Feb 14 2009, 00:13) *
провести диагностику железа, отгрузить дамп/статисткику последнего запуска и т.п.).

А зачем этим всем заниматься загрузчику ? Вообще, какое назначение у загрузчика ? И самое интересное, как запихать все хотелки в тыщу слов ?

Цитата(defunct @ Feb 14 2009, 00:13) *
Раз инициализируем хотя бы один пин хотя бы одного порта

В этом нет никакой необходимости.

Цитата(defunct @ Feb 14 2009, 00:13) *
учитывать _всеми_ - кеми?

Программерами, схемотехниками, камнями, приложениями...

Цитата(defunct @ Feb 14 2009, 00:13) *
Выключить периферию так, чтобы от железного сброса было не отличить - дело нехитрое.

Только для одного камня. Иначе хитрое.

Цитата(defunct @ Feb 14 2009, 00:13) *
Насколько это сложно - сами видите, достаточно просто записать 0 в соотв. регистры периферии.

Вы явно не представляете по каким граблям прыгаете ATmega128.UCSRnC Initial Value 0 0 0 0 0 1 1 0
И, главное, закладываете эти грабли на будущее. Или есть какие-то гарантии, что оно еще и не изменится в новой ревизии ?

Цитата(defunct @ Feb 14 2009, 00:13) *
Резетить контроллер из бутлоадера по WDT после проверки целостности прошивки чтобы запустить app, одним словом называется - дебилизм.

Конечно дебилизм, после проверки нужно идти в приложение, иначе зачем его проверять.

Цитата(defunct @ Feb 14 2009, 00:13) *
а как вы запускаете приложение после обновления прошивки, ведь в процессе обновления прошивки вы периферию инициализируете, не так ли?).

Я же уже сказал - после ресета.

Цитата(defunct @ Feb 14 2009, 00:13) *
По поводу сбрасывания WDT - тут строго говоря, всегда надо исходить из того, что по законам Мерфи WDT включен и обязательно с минимально возможным интервалом.
А это значит, что в некоторых случаях (низкая тактовая + обновление NRWW) может понадобиться хотя бы изменить его интервал, иначе МК может сброситься при выполнении SPM.

Конечно надо. В чем, собственно, проблема ?
defunct
Цитата(Огурцов @ Feb 14 2009, 12:17) *
Очень даже как. Так же, как у атмела. По холодному старту ждем апдейт, если он не произошел, по таймауту собаки сваливаемся опять в загрузчик, проверяем как в него попали, проверяем флешь и если все нормально уходим в приложение.

Ничего не понял, сорри, как у Atmel'a? Если можно, объясните более подробно - как по холодному старту ждать апдейт без проинициализированной периферии?

Цитата
А зачем этим всем заниматься загрузчику ? Вообще, какое назначение у загрузчика ? И самое интересное, как запихать все хотелки в тыщу слов ?

Ну в m128 и подобных с 4K слов бутом есть где разгуляться. Все хотелки есть где разместить.

Цитата
В этом нет никакой необходимости.

Обоснуйте.

Цитата
Программерами, схемотехниками, камнями, приложениями...

Еще раз отмечу, программерам, схемотехникам, камням и приложениям - не нужно знать, что и как делает бутлоадер.
1. Схемотехнику и камень учитывает разработчик бутлоадера.
2. Этот же разработчик бутлоадера заботится о том, чтобы программерам и приложениям бутлоадер не мешал.

Цитата
Только для одного камня. Иначе хитрое.

То плачетесь что 1000 слов мало, то хотите чтобы программа из 1000 слов учитывала особенности всех камней. Понятное дело, бутлоадер затачивается напильником под конкретный камень, а иногда (чаще) под конкретный девайс. И тщательно следит за тем чтобы прошивки от других девайсов часом не залили в этот, т.к. чужая прошивка может попросту спалить железо.

Цитата
Вы явно не представляете по каким граблям прыгаете ATmega128.UCSRnC Initial Value 0 0 0 0 0 1 1 0

Зачем UCSRxC вообще трогать?! Он за вкл/откл уарта не отвечает.

Цитата
И, главное, закладываете эти грабли на будущее. Или есть какие-то гарантии, что оно еще и не изменится в новой ревизии ?

А вы что привязываетесь к default настройкам? или приложение таки настраивает то, что ему нужно?

Цитата
Я же уже сказал - после ресета.

Т.е. обновили прошивку, проверили app CRC, и сбросились по WDT, для того чтобы опять проверить CRC. Чем же это не тот же самый дебилизм?!

Цитата(smac @ Feb 14 2009, 08:56) *
Назовите, если не сложно

Причина - глобальное зацикливание sad.gif
После сброса мы опять попадаем в bootloader, и опять проверяем app CRC и опять резетимся, и опять попадаем в бутлоадер ......

Если поставить костыль - идти путём проверили, записали где-то флажек, перезапустились, проверили флажек - запустили апп. То нет гарантии, что между последней проверкой и входом в бутлоадер флеш не изменился. Что равносильно запуску битого приложения.
Огурцов
Цитата(defunct @ Feb 14 2009, 21:57) *
Еще раз отмечу, программерам, схемотехникам, камням и приложениям - не нужно знать, что и как делает бутлоадер.

И это единственно правильно. Ну до тех пор, конечно, пока не начинаете что-то инициализировать.

Цитата(defunct @ Feb 14 2009, 21:57) *
То плачетесь что 1000 слов мало, то хотите чтобы программа из 1000 слов учитывала особенности всех камней.

Это вы вынуждены учитывать, т.к. что-то инициализируете. А правильно не учитывать особенности, а не зависеть от них. И это гораздо проще и жрет меньше флеша.

Цитата(defunct @ Feb 14 2009, 21:57) *
Зачем UCSRxC вообще трогать?! Он за вкл/откл уарта не отвечает.

Да какая разница UCSRxC или какой другой. Просто пример, что не все инициализируется нулями. А вы хреначите во все регистры нули...

Цитата(defunct @ Feb 14 2009, 21:57) *
А вы что привязываетесь к default настройкам? или приложение таки настраивает то, что ему нужно?

А что не нужно - не настраивает. А вы это "ненужное" в загрузчике под себя настроили. И забыли...

Цитата(defunct @ Feb 14 2009, 21:57) *
Т.е. обновили прошивку, проверили app CRC, и сбросились по WDT, для того чтобы опять проверить CRC. Чем же это не тот же самый дебилизм?!


Причина - глобальное зацикливание smile.gif
После сброса мы опять попадаем в bootloader, и опять проверяем app CRC и опять резетимся.

Если поставить костыль - идти путём проверили, записали где-то флажек, перезапустились, проверили флажек - запустили апп. То нет гарантии, что между последней проверкой и входом в бутлоадер флеш не изменился. Что равносильно запуску битого приложения.

Посмотрите апнот от атмела. Потом пишите про дибилизм. Если все еще будет не понятно.
defunct
Цитата(Огурцов @ Feb 14 2009, 23:43) *
И это единственно правильно. Ну до тех пор, конечно, пока не начинаете что-то инициализировать.

Непроинициализируете - не обновите прошивку.

Цитата
Это вы вынуждены учитывать, т.к. что-то инициализируете. А правильно не учитывать особенности, а не зависеть от них. И это гораздо проще и жрет меньше флеша.

Специально для тех кто в танке - еще раз - как ваш бутлоадер получает прошивку которую надо зашить во флеш? И как ваш бутлоадер проверяет подходит ли прошивка к конкретному устройству.

Цитата
Да какая разница UCSRxC или какой другой. Просто пример, что не все инициализируется нулями. А вы хреначите во все регистры нули...

Код то смотрели? Где там "во все"?

Цитата
А что не нужно - не настраивает. А вы это "ненужное" в загрузчике под себя настроили. И забыли...

С чего вы взяли, что мы о чем-то забыли? Вы экстрасенсорно определили? smile.gif
Ничего мы не забыли.

Цитата
Посмотрите апнот от атмела. Потом пишите про дибилизм. Если все еще будет не понятно.
Какой аппноут. Своими словами вам религия не позволяет объяснить суть?

Самое главное, Вы бутлоадер-то для кого обычно пишете (если пишите его вообще) - для себя или для пользователя вашего устройства?

PS: Если не затруднит - напишите ответ на самый первый вопрос предыдущего моего комента:
Цитата
Если можно, объясните более подробно - как по холодному старту ждать апдейт без проинициализированной периферии?
Без ответа на этот вопрос дальнейшие рассуждения бессмыслены, т.к. отстается только полагать, что Вы просто не владеете темой.
Огурцов
Цитата(defunct @ Feb 14 2009, 23:42) *
Непроинициализируете - не обновите прошивку.

Согласен. Или я писал обратное, то при обновлении нельзя инициализировать ?

Цитата(defunct @ Feb 14 2009, 23:42) *
И как ваш бутлоадер проверяет подходит ли прошивка к конкретному устройству.

Как и у атмела - сигнатура. На тип девайса. В т.ч. прошивка может подходить к разным девайсам, но не конфликтующим по железу.

Цитата(defunct @ Feb 14 2009, 23:42) *
Код то смотрели? Где там "во все"?

Смотрел. Код (наверно) правильный. Подход неправильный.

Цитата(defunct @ Feb 14 2009, 23:42) *
С чего вы взяли, что мы о чем-то забыли? Вы экстрасенсорно определили? smile.gif Ничего мы не забыли.

Сегодня не забыли, завтра забыли. Опыт, блин, и практика.

Цитата(defunct @ Feb 14 2009, 23:42) *
Какой аппноут. Своими словами вам религия не позволяет объяснить суть?

Выше кто-то давал. Алгоритм уже описан не раз, код в апноте. Зачем мне напрягаться еще раз ?

Цитата(defunct @ Feb 14 2009, 23:42) *
Самое главное, Вы бутлоадер-то для кого обычно пишете (если пишите его вообще) - для себя или для пользователя вашего устройства?

Не то и не другое. Загрузчик - для устройства.

Цитата(defunct @ Feb 14 2009, 23:42) *
PS: Если не затруднит - напишите ответ на самый первый вопрос предыдущего моего комента:
Без ответа на этот вопрос дальнейшие рассуждения бессмыслены, т.к. отстается только полагать, что Вы просто не владеете темой.

Разберитесь с атмеловским примером. Если он непонятен, то таки да, все зря.
defunct
Цитата(Огурцов @ Feb 15 2009, 01:03) *
Разберитесь с атмеловским примером. Если он непонятен, то таки да, все зря.

AVR109 озвученный здесь я читал. Думал может быть Вы ссылаетесь на какой-то другой документ.
А так получается (уж насколько не печально выглядит), что Вы таки не владеете темой.
appnote AVR109. Figure 7. Самый первый пункт алгоритма - инициализация периферии.

Отрывок кода main из AVR109:

Код
__C_task void main(void)
{
    long address;
    unsigned int temp_int;
    unsigned char val;


    /* Initialization */
    void (*funcptr)( void ) = 0x0000; // Set up function pointer to RESET vector.
    PROGPORT |= (1<<PROG_NO); // Enable pull-up on PROG_NO line on PROGPORT.
    initbootuart(); // Initialize UART.


Цитата
Выше кто-то давал. Алгоритм уже описан не раз, код в апноте. Зачем мне напрягаться еще раз ?

Затем, что вы несете пургу преподносите нам полуправду (которая хуже чем откровенная ложь).
Огурцов
Цитата(defunct @ Feb 15 2009, 00:16) *
AVR109 озвученный здесь я читал. Думал может быть Вы ссылаетесь на какой-то другой документ.

О да, вынужден признать, что это не тот документ про который я говорил. Дабы не рыться в поисках, откуда оно было украдено, вот общий принцип:

Код
    Wdt_change_enable();
    Wdt_enable_8s();

    Check_crc(MEM_SIZE + SPM_PAGESIZE, FLASHEND - MEM_SIZE - SPM_PAGESIZE + 1);
    if (boot_lock_fuse_bits_get(GET_LOCK_BITS) != 0xCC)
        Error();

    if (!Is_wdt_reset())
    {
        Bus_init();
        Loader_start_loading();
    }

    Wdt_clear_flag();
    Check_crc(0, MEM_SIZE);
    Check_crc(MEM_SIZE, SPM_PAGESIZE);
    Soft_reset();


Цитата
Затем, что вы несете пургу преподносите нам полуправду (которая хуже чем откровенная ложь).

Вот интересно, а слабо будет извиниться ?
defunct
Цитата(Огурцов @ Feb 15 2009, 02:02) *
Вот интересно, а слабо будет извиниться ?

Да не вопрос, извинюсь когда Вы дадите себе труд найти оффициальный документ описывающий этот принцип. Так как Вы дважды посылали меня рыться в аппнотах от Atmel, то желательно чтобы этот документ был от Атмел. Но я пойду Вам навстречу, приму документ от любого производителя МК...

Цитата
Дабы не рыться в поисках, откуда оно было украдено, вот общий принцип

Несмотря на проявленное неуважение к моему времени, скажу очень мягко:
По коду принцип к сожалению не очень понятен. Понятно только - что из пользовательской программы никак нельзя заставить бутлоадер обновить прошивку. А это IMHO минус, сами себя лишили возможности удаленного (автоматизированного) обновления прошивки.
И еще одно - даже в Вашем принципе без настройки периферии - никак.
Огурцов
Цитата(defunct @ Feb 15 2009, 02:27) *
Да не вопрос, извинюсь когда Вы дадите себе труд найти оффициальный документ описывающий этот принцип. Т.к. Вы дважды посылали меня рыться в аппнотах от Atmel, то желательно чтобы этот документ был от Атмел. Но я пойду Вам навстречу, приму документ от любого производителя МК...

Аха, а вы еще обвините меня в том, что я сам это придумал

Цитата(defunct @ Feb 15 2009, 02:27) *
Понятно только - что из пользовательской программы никак нельзя заставить бутлоадер обновить прошивку.

Никто не мешает передать управление на точку Bus_init() или подобно.

Цитата(defunct @ Feb 15 2009, 02:27) *
И еще одно понятно - даже в Вашем принципе без настройки периферии - никак.

Опять мимо. Это частный случай реализации и не идеальный. Первые две строки логично перенести перед Bus_init(), на работу загрузчика это не повлияет, хоть и менее изящно. В общем-то я так наверно и сделаю.
defunct
Цитата(Огурцов @ Feb 15 2009, 04:01) *
Аха, а вы еще обвините меня в том, что я сам это придумал

Вы сами это сказали. Подтверждения обратного пока нет.

Цитата
Никто не мешает передать управление на точку Bus_init() или подобно.

Мешает зависимость между проектами, от которой Вы пытаетесь уйти. А в итоге приходите к еще бОльшей зависимости.
Если бутлоадера нет или версия другая, к чему такой прыжек приведет подумали?

Цитата
Опять мимо. Это частный случай реализации и не идеальный.

Всё-то у вас частно, и не идеально. А где же тот самый идеальный вариант, который Вы всем советуете делать? Как же другие его будут реализовывать если сам автор идеи его реализовать не может! smile.gif

Да и не мимо тут, а как раз в точку (хотя бы потому, что без настройки периферии, сброс по WDT сделать нельзя)..
Код сами привели никто за уши не тянул.
Огурцов
Цитата(defunct @ Feb 15 2009, 03:11) *
Мешает опять таки зависимость между проектами, от которой Вы пытаетесь уйти.
Если бутлоадера нет, к чему такой финт ушами приведет?

Есть соглашение о вызовах и список функций загрузчика, которые им поддерживаются. Хотя приложение и не обязано их использовать. Загрузчик есть всегда, а вот приложения может и не быть.
Впрочем, если приложение не вызывает функции загрузчика, то это не важно.

Цитата(defunct @ Feb 15 2009, 03:11) *
Да не мимо, а как раз в точку. Сами же код привели никто за уши не тянул.

Хех, так я ж сказал, как сделать правильно, без какой бы то ни было инициализации периферии. Недостаточно ? Или вы мне м.б. сейчас про указатель стека напомните ? Да, тут таки сложно наверно будет возразить.
defunct
Цитата
так я ж сказал, как сделать правильно

С этим флеймом пора заканчивать... "правильно", "неправильно", детсад какой-то. Пока получается, что все делают неправильно, только Вы один знаете как надо делать правильно, и тем не менее приводите неправильный код. sad.gif

Или приводите документ с описанием принципа из comment #23 и мы проникаемся правильностью идеи...
Или честно скажите - "придумал сам, насколько это правильно или неправильно - не знаю".
Огурцов
Цитата(defunct @ Feb 15 2009, 03:31) *
С этим флеймом пора заканчивать...

И вам спасибо (с)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.