Мы делали следующим образом. Бутлоадер зашивался по джэйтэгу, ну а прошивка в зашифрованном виде по уарту. DTR и RTS линии использовалисть для сброса МК и переключения между бутлоадером и рабочей программой соответственно. К МК подключен мост от FTDI, который по 7-8 долларов у нас. Бутлоадер компилировался обычным образом, никаких "перемещений" векторов в нём нет. Функции всех прерываний бутлоадера содержали инструкцию безусловного перехода (branch) по адресам "сдвинутых" прерываний рабочей программы. Эти адреса задавались в скрипте для компоновщика. "Сдвинутые" прерывания находятся во флеше, сначала были в RAM, но от этой идеи отказались, т.к. возможны неприятные последствия, какие именно уже не помню.
Ещё надо разграничить адресное пространство для бутлоадера и рабочей программы, чтоб не перекрывались. Вот команды для компоновщика IAR, включая "перемещённые" вектора прерываний рабочей программы.
Для бутлоадера.
Код
// Constant data
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=EA00-FFDF
// Code
-Z(CODE)CSTART,ISR_CODE=EA00-FFDF
-P(CODE)CODE=EA00-FFDF
// Interrupt vectors
-Z(CODE)INTVEC=0xFFE0-0xFFFF
-Z(CODE)RESET=FFFE-FFFF
Для рабочей программы.
Код
// Constant data
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=4040-FFFF
// Code
-Z(CODE)CSTART,ISR_CODE=4040-FFFF
-P(CODE)CODE=4040-FFFF
// Interrupt vectors
-Z(CODE)INTVEC=0x4000-0x403F
-Z(CODE)RESET=403E-0x403F
Чтоб задействовать в IARе: Project -> Options -> Linker -> Config -> Linker command file -> Override default снять. Скопировать файл, который там указан в директорию своего проекта и добавить вышеописанные команды. Вы разберётесь.
Вобщем всё это интересно, можно свою мини-ось написать с отдельными экзешниками, мультизадачностью... Был бы вагон времени только.