выполняю это:
cli();
/* Enable change of Interrupt Vectors */
MCUCR = 1; //(IVCE);
/* Move interrupts to Main */
MCUCR = 0;//(IVSEL);
asm volatile("jmp 0");
Работает это дело уже тысячах устройств с самым разнообразным способом загрузки - и по usart, и с таблеток даллас, и по ethernet, и даже по RFID (индутивная спязь).
А тут, сцуко, наткнулся на такую шнягу:
Гружу с SD карточки (быстро):
while (blkcnt)
{
WORD page = cnt<<7;
boot_page_erase(page);
boot_spm_busy_wait();
for (i=0; i<SPM_PAGESIZE; i+=2)
{
// Set up little-endian word.
union temp w;
w.byte[0] = buf[wbufaddr++];
w.byte[1] = buf[wbufaddr++];
boot_page_fill(page + i, w.word);
}
boot_page_write(page); // Store buffer in flash page.
boot_spm_busy_wait(); // Wait until the memory is written.
cnt++;
blkcnt--;
}
, передаю управление по адресу 0
Если на месте "asm volatile("jmp 0");" вставить "while(1);", то при дальнейшем чтении памяти программатором, вижу, что флэш то, что и должно быть - записанная бутлодырем прога.
Подцепил дракон по DW - если установить бряк на ""asm volatile("jmp 0")", то следующий шаг в отладчике кажет нормальный вектор по адресу 0 и все работает... Если ставлю бряк на адресу 0 - туда не попадает...
Может я заработался? :)
Или GCC кривит (но в ассемблерном листинге все ОК)...