а в чем смысл установки лок-битов через 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-файла я не особо силен, поэтому конкретных вещей предлагать не стану. Разве что никто уже ничего не поскажет. Хотя там, на первый взгляд, нет ничего сложного.