Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Bootloader для ATtiny461
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ivainc1789
Девайс на ATtiny461 расположен в труднодоступном месте. Хотелось бы обновлять flash и eeprom, устанавливать lock bits дистанционно через интерфейс USI. Пишу в IAR EWAVR v5.40. Как правильно оформить бутлоадер для такого кристалла?
Так как памяти всего 4к допустимо ли размещать бутлоадер совместно с осн программой и расположить его в самом конце памяти. Расположить его там вроде нет проблем, но как оформить передачу управления ему при старте с адреса 0x000? Как это оформить в IAR и именно для ATtiny461, где средства self-programming ограничены?
Ясно, что запускать саму программу с адреса 0x000 и в ней принимать решение о старте бутлоадера нельзя, т. к. возможен неудачный апгрейд прошивки и соотв. полная неоперабельность девайса по сбросу.
В IAR в настройках конфига линкера есть некая возможность изменить точку старта программы, но как этим пользоваться я даже в помощи не нашел, есть только короткое описание в руководстве к IDE...
Александр Куличок
а в чем смысл установки лок-битов через usi? Ведь если Вы запрграммировали их одни раз, то после перепрограммироания бутлоадером они останутся неизменными, т.е. их повторно программироват не нужно. Эти биты запрещают чтение и запись в/из флеша только в режимаж High-voltage и Serial Programming mode. А на самопрограммирование они не влияют. Точно также, как самопрограммирование не влияет на них.
Цитата
Ясно, что запускать саму программу с адреса 0x000 и в ней принимать решение о старте бутлоадера нельзя, т. к. возможен неудачный апгрейд прошивки и соотв. полная неоперабельность девайса по сбросу.

Можно сделать следующим образом.
Бутлоадер расположить в самом начале программы, сразу после векторов прерываний.
После бутлоадера на границе страницы будет располагаться точка входа в приложение. Она должна быть постоянна. Пускай ee адрес будет равен APPSTART.
Таблицу векторов прерываний жестко прописать следующим образом:
нулевой вектор - на старт бутлоадера, в котором принимается решение о запуске программы.
во всех последующих векторах прописать переход на APPSTART байт/слов вперед. На авр-асме это будет выглядеть следующим образом:
Код
.ORG 0x00
rjmp  BootStart
rjmp  APPSTART+1
rjmp  APPSTART+2
rjmp  APPSTART+3
.........
rjmp  APPSTART+17
rjmp  APPSTART+18

BootStart:
      // if ( crc(application) == 0) && app.startEnabled )
      //   goto APPSTART
      //    
.................
// Далее выравнивание на границу страницы
dummy:
.equ PAGESIZE_W = PAGESIZE/2
.equ PS_W = LOG2(PAGESIZE_W)
.ORG ((dummy+PAGESIZE_W-1)>>PS_W)<<PS_W
APPSTART:

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

Основная программа (application) при этом будет иметь почти обычный вид.
Но в директивах к векторам нужно будет добавить значение APPSTART
#pragma vector=0x14+APPSTART
или переопределить эти самые векторы (так вроде универсальней)
В настройках линкера нужно будет позаботиться о том, чтобы остальное приложение разместилось под областью прерываний
Так же как-то нужно указать новое место вектора прерывания по сбросу. Как это сделать не знаю, но для обычных бутлоадеров это делалось всегда. Возможно, достаточно в xcl-файле изменить границы сегмента INTVEC.

Р.S. В правках xcl-файла я не особо силен, поэтому конкретных вещей предлагать не стану. Разве что никто уже ничего не поскажет. Хотя там, на первый взгляд, нет ничего сложного.
ivainc1789
Если я правильно понял, вы предлагаете написать бутлоадер как отдельный проект? Потому что иначе (когда пишем основную программу) как поместить по ORG 0x00 команду перехода на бутлоадер? Все, что связано в IAR со стартом программы пока для меня не совсем понятно и как это проделать - тоже.
Писать бутлоадер как составную часть осн программы - это рисковать неудачным программированием первой страницы, на которой будет приниматься решение о старте бутлоадера... Это видимо еще хуже...
И еще. Заливать прошивку по USI при отладке основной программы - слишком долго и неудобно. Т. е. разумно на бут-программирование переходить перед установкой устройства в труднодоступное место, верно?

Если я правильно понял, вы предлагаете написать бутлоадер как отдельный проект? Потому что иначе (когда пишем основную программу) как поместить по ORG 0x00 команду перехода на бутлоадер? Все, что связано в IAR со стартом программы пока для меня не совсем понятно и как это проделать - тоже.
Писать бутлоадер как составную часть осн программы - это рисковать неудачным программированием первой страницы, на которой будет приниматься решение о старте бутлоадера... Это видимо еще хуже...
И еще. Заливать прошивку по USI при отладке основной программы - слишком долго и неудобно. Т. е. разумно на бут-программирование переходить перед установкой устройства в труднодоступное место, верно?
Александр Куличок
Да, как отдельный проект. Он должен быть отдельным проектом в любом случае. Ведь загрузчик - он один, а проекты (проложения) могут быть разные.
В данном случае возникает вопрос, в таблице векторов прерываний разместить инструкции 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 нужно указывать в байтах.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.