Цитата(Goodvin @ Oct 26 2009, 21:49)

В обработчике прерываний проверять что сейчас работает (bootloader или прикладная программа) и в зависимости от этого прыгать на определенный адрес. Вы это имели ввиду?
Да - это. Недостаток такой организации прерываний прикладной программы очевиден: задержка в переходе на процедуру обработки прерывания (для прикладной программы это может оказаться критичным). Еще одно маленькое неудобство - флаг работы бутлоадера/программы нужно где-то хранить, при этом необходимо обеспечить, чтобы этот флаг не разрушался прикладной программой. Т.е. необходимо выделить байт или бит, который бы использовался бутлоадером, но не использовался бы прикладной программой. Наверное, для этих целей можно использовать бит F0 регистра PSW (я не замечал, чтобы Keil этот бит использовал, а выделять для этого место в ОЗУ крайне не желательно - имхо, тяжело будет разделять его между бутлоадером и программой).
Мне все-таки кажется более предпочтительным бутлоадер, размещаемый в конце памяти. Место для адреса начала прикладной программы много не нужно - всего три байта (команда LJMP), которые можно отвести в начале бутлоадера. Бутлоадер, скорее всего, получится несколько больше по объёму за счет сохранения неизменным нулевого вектора на бутлоадер и сохранения (формирования команды перехода) адреса начала прикладной программы. Но при этом прикладная программа не будет тормозиться лишними проверками и переходами, что гораздо ценнее, да и прикладная программа не будет "искорёжена" сдвигом на длину бутлоадера.
P.S. Кстати, работу по сохранению вектора 0 и адреса начала прикладной программы можно частично (а, может быть - полностью) перенести на программу, которая будет работать "извне" (на ПЭВМ, с которой "заливается" прикладная программа) и взаимодействовать с бутлоадером.