Цитата(Goodvin @ Oct 26 2009, 19:24)

Еще вариант расположить bootloader в последних адресах. Тогда прикладная программа при прерываниях не будет скакать по адресам, но там другие загвоздки есть.
Я правильно уловил логику "колдования" со стартапом?
Загвоздки могут быть. Например при работе с SiLabs.
При блокировке области кода от чтения и записи доступ к младшим страницам из старших запрещен (возвращаемый результат неопределен),
что вызывает сложности с подсчетом контрольной суммы приложения расположенного ниже чем загрузчик. Лично не проверял, но описанию склонен верить.
Пример изменений стартапа для ознакомления прилагаю.
Код
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
// основные изменения сделаны здесь
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
// ORG 3H
Offset SET 800H // адрес основного приложения
ISR_JMP 0 // int 0
ISR_JMP 1 // Timer 0
//ISR_JMP 2 // int 1
ISR_JMP 3 // Timer 1
ISR_JMP 4 // uart 0
ISR_JMP 5 // Timer 2
ISR_JMP 6 // spi0
ISR_JMP 7 // SMBus
ISR_JMP 8 // ADC 0
ISR_JMP 9 // PCA
ISR_JMP 10 // Comarator 0
ISR_JMP 11 // Comarator 0
ISR_JMP 12 // Comarator 1
ISR_JMP 13 // Comarator 1
ISR_JMP 14 // Timer 3
ISR_JMP 15 // ADC 0
ISR_JMP 16 // Timer4
ISR_JMP 17 // ADC2
ISR_JMP 18 // ADC2
ISR_JMP 19 // Reserved
ISR_JMP 20 // UART1
CSEG AT 0100h
EXTRN CODE(LoadCode) // фиксируем адрес для вызова из основной программы
MOV SP,#?STACK-1 // установить стек загрузчика
LJMP LoadCode // перейти к выполнению функции
RSEG ?C_C51STARTUP
STARTUP1:
.... // штатные действия
?My_Exit_Func SEGMENT CODE
RSEG ?My_Exit_Func
PUBLIC exit
exit: // вызывается из загрузчика для передачи управления основному приложению
MOV SP,#7 // значение стека как при сбросе контроллера
LJMP Offset
END
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.