Совет был неправильный, как и сотни других советов, которые я перелопатил в инете.
Дельных советов в инете нет, поэтому напишу, как сделать Бутлоадер в Atmel Studio 7 на C++ для Atmega128.
1. Добавляем в alt -> Project -> Properties -> Toolchain -> AVR/GNU Linker -> Memory Settings ->FLASH segment
Запись: ".text=0xF000". Теперь вся программа располагается с адреса 0x1E000. Совет использовать "__attribute__ ((section" на десятках форумов - подстава и пустая трата времени, он нужен, чтобы бутлоадер и основную программу писать в одном проекте.
2. Ставим фьюзы в alt -> Tools -> Device Programming -> Fuses
BOOTSZ $F000 для загрузчика размером 8 килобайт.
BOOTRST on, чтобы загрузка при включении начиналась с адреса 0xF000 words (0x1E000 bytes).
3. Добавляем
Код:
uint8_t temp=MCUCR;
MCUCR|=(1<<IVCE);
MCUCR=temp|(1<<IVSEL);
в самом начале программы. Тогда прерывания будут работать в бутлоадере. Другие модификации этого кода без temp не работают.
4. Оптимизация -Os по умолчанию.
5. PSTR, memcmp_P и прочие _P не работают по умолчанию и их нет смысла использовать, так как оперативки полно.
6. Переход в основную прошивку можно делать любой из команд:
Код:
void* mainprog= (void *) 0;
goto *mainprog;
((void (*)())0x0000)();
asm("jmp 0x0000");
Если переходить сразу после прошивки, то придётся откручивать MCUCR обратно.
7. Пример функции записи страницы в память есть в файле avr/boot.h, который всё равно придётся подключать.
8. На всякий случай к прошивке можно добавить пару сотен байт нулей или хотя бы до конца страницы памяти.
Если бы я сразу встретил этот пост, то сэкономил бы часов 50 своего времени и много нервов на перерывание даташитов и испытания неработающих советов.