Сергей Борщ (17.11.2007 18:12, просмотров: 158) ответил Argon на Уточнение: это у меня было в связи с прямым назначением сегмента INTVEC в "неродные" адреса. Сделал как в Вашем варианте, с копированием сегментов, предупреждения пропали. Но возникли еще вопросы.
Я прошиваю в два этапа. И имею два отдельных проекта - загрузчика и приложения. Это позволяет модифицировать их независимо. Вам, например, надо для всех функций загрузчика указывать принудительное их размещение в BLCODE, а у меня в скрипте линкера для загрузчика просто указано -DROMSTART=00000040
-DROMEND=00000FFF. И сразу пропадают ваши проблемы с передачей управления на __program_start(). Кроме этого, после загрзчика приложение должно выполнить свой cstartup - проинитить стеки, глобальные переменные и т.д. Как это решать в рамках одного проекта я даже не задумывался. Поскольку у меня приложение - самостоятельный проект, в нем вся инициализация идет штатным путем. Чтобы прошивать сразу обе части, можно какой-нибудь утилитой "склеить" два .hex и уже результат прошивать филипсовской утилитой, или используя postlink (но тут я не силен) склеить файлы после сборки, тогда их скорее всего и иар сможет прошить. Контрольную сумму вам нужно считать только для векторов загрузчика - приложению управление передаете вы сами. ИАР сам считает и добавляет ее при прошивке, филипсовская утилита вроде тоже.
Когда у вас вектора находились по адресу 1000, линкер не мог командой LDR PC, VICVectAddr "дотянуться" до VICVectAddr. Да это и не нужно, потому что при работе вектора фактически находятся в нулевых адресах. Опция -Q в скрипте как раз и говорит: положить вектора в сегмент INTVEC_I, но слинковать их так, как будто они находятся в адресах INTVEC.
ну и для полноты:
-QINTVEC=INTVEC_I //копирование содержимого INTVEC в INTVEC_I
- линкер ничего не копирует, копирование делаете вы в загрузчике перед ремапом.
Да, еще в приложении надо не забыть, что загрузчик может по-своему настроить какую-то периферию, и она будет уже не в состояни "по умолчанию". Поэтому у меня загрузчик только настраивает PLL, тактирование, проверяет контрольную сумму приложения и если совпала - сразу отдает управление. Если не совпала и пошел процесс загрузки - то настраивает все, что ему надо, но после загрузки запускает watchdog и ждет сброса по собаке. Сброс сбрасывает периферию и загрузчик снова попадает на проверку контрольной суммы приложения.