Делал bootloader для SyLabs C8051F022 в Keil. Проект организовывал так:
1) Проект для самого загрузчика.
2) Проект с полезным кодом.
В загрузчике указал располагать код в области памяти начиная с 0xF000 такой директивой линковщику:
CODE(0F000h, ?PR?MAIN?UPDATER_F02x(0F000h)).
В проекте с полезным кодом вызов загрузчика:
void (*update_firmware)(); // pointer to bootloader memory
.....
update_firmware = (void code*)0xF000;
IE = 0;
update_firmware(); // go to bootloader menu
При такой организации перекрытие быть может, только если размер полезного кода достигнет адреса 0xF000. Весь же startup code располагается по адресам 0х0000 и 0xF000 для программы и загрузчика соответственно. Правда прерываниями в загрузчике пожертвовал, чтобы не заморачиваться с переопределением векторов. Пример брал из
аппнота для силаба. Вдруг поможет.
UPD. Да, а зачем Вы объединяете hex-файлы bootloader'a и программы? Я в чистый контроллер заливаю bootloader, переход на него после сброса добавляет сама среда, из bootload'a загружаю саму прошивку (2-й hex-файл). Можно загрузить 2-й hex отладчиком/программатором, но тогда нужно выключить очистку flash перед программирование.
Сообщение отредактировал DO_SL - Feb 7 2013, 08:53