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

 
 
> Bootloader для ATtiny461, что-то не получается...
ivainc1789
сообщение Jan 27 2010, 08:54
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Девайс на ATtiny461 расположен в труднодоступном месте. Хотелось бы обновлять flash и eeprom, устанавливать lock bits дистанционно через интерфейс USI. Пишу в IAR EWAVR v5.40. Как правильно оформить бутлоадер для такого кристалла?
Так как памяти всего 4к допустимо ли размещать бутлоадер совместно с осн программой и расположить его в самом конце памяти. Расположить его там вроде нет проблем, но как оформить передачу управления ему при старте с адреса 0x000? Как это оформить в IAR и именно для ATtiny461, где средства self-programming ограничены?
Ясно, что запускать саму программу с адреса 0x000 и в ней принимать решение о старте бутлоадера нельзя, т. к. возможен неудачный апгрейд прошивки и соотв. полная неоперабельность девайса по сбросу.
В IAR в настройках конфига линкера есть некая возможность изменить точку старта программы, но как этим пользоваться я даже в помощи не нашел, есть только короткое описание в руководстве к IDE...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Александр Куличо...
сообщение Jan 29 2010, 20:31
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Да, как отдельный проект. Он должен быть отдельным проектом в любом случае. Ведь загрузчик - он один, а проекты (проложения) могут быть разные.
В данном случае возникает вопрос, в таблице векторов прерываний разместить инструкции rjmp. Я пока вижу только один вариант - использовать xcl-файл и его ключ -h.
В xcl-файле (который используется по умолчанию) данный ключ дает указания линкеру заполнить неиспользуемые вектора прерывания инструкцией с кодом H1895 - reti. В нашем случае, после того, как определимся с размером boot-a, можно будет просто поменять код инструкций на rjmp. Кода для всех векторов будут совпадать, ведь rjmp - относительный переход.
Для примера, если под бут отвести 128 слов, код будет H7FC0, если 256 -> HFFC0.

Все, что нужно будет сделать при написании приложения - это, как я уже писал, вектора прерываний объявлять следующим способом:
#pragma vector=<original_vector>+APPSTART

Само значение APPSTART объявить глобальным дефайном в свойствах проекта.
Так же нужно будет использовать подправленый файл xcl, в котором перепределить положение сегмента INTVEC (сместить его на APPSTART байт вниз):
-Z(CODE)INTVEC=APPSTART-(APPSTART+_..X_INTVEC_SIZE-1)
То же проделать с остальными сегментами кода:
-Z(CODE)NEAR_F=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END
-Z(CODE)SWITCH=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END
-Z(CODE)INITTAB=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END
-Z(CODE)DIFUNCT=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END
-Z(CODE)CODE=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END
-Z(CODE)TINY_ID=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(CODE)NEAR_ID=_..X_INTVEC_SIZE-_..X_FLASH_END

НО работать такая программа будет только в том случае, если во флеши уже имеется бутлоадер.
Если нужно будет произвести отладку программы без бутлоадера или в симуляторе, то будет достаточно APPSTART объявить равным 0x00.
Правда, при этом время обработки прерывания сократится на 2 такта.

З.Ы. Значения APPSTART нужно указывать в байтах.
Go to the top of the page
 
+Quote Post



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

 


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


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