Да, как отдельный проект. Он должен быть отдельным проектом в любом случае. Ведь загрузчик - он один, а проекты (проложения) могут быть разные. В данном случае возникает вопрос, в таблице векторов прерываний разместить инструкции rjmp. Я пока вижу только один вариант - использовать xcl-файл и его ключ -h. В xcl-файле (который используется по умолчанию) данный ключ дает указания линкеру заполнить неиспользуемые вектора прерывания инструкцией с кодом H1895 - reti. В нашем случае, после того, как определимся с размером boot-a, можно будет просто поменять код инструкций на rjmp. Кода для всех векторов будут совпадать, ведь rjmp - относительный переход. Для примера, если под бут отвести 128 слов, код будет H7FC0, если 256 -> HFFC0.
Все, что нужно будет сделать при написании приложения - это, как я уже писал, вектора прерываний объявлять следующим способом: #pragma vector=<original_vector>+APPSTART
Само значение APPSTART объявить глобальным дефайном в свойствах проекта. Так же нужно будет использовать подправленый файл xcl, в котором перепределить положение сегмента INTVEC (сместить его на APPSTART байт вниз): -Z(CODE)INTVEC=APPSTART-(APPSTART+_..X_INTVEC_SIZE-1) То же проделать с остальными сегментами кода: -Z(CODE)NEAR_F=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END -Z(CODE)SWITCH=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END -Z(CODE)INITTAB=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END -Z(CODE)DIFUNCT=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END -Z(CODE)CODE=(APPSTART+_..X_INTVEC_SIZE)-_..X_FLASH_END -Z(CODE)TINY_ID=_..X_INTVEC_SIZE-_..X_FLASH_END -Z(CODE)NEAR_ID=_..X_INTVEC_SIZE-_..X_FLASH_END
НО работать такая программа будет только в том случае, если во флеши уже имеется бутлоадер. Если нужно будет произвести отладку программы без бутлоадера или в симуляторе, то будет достаточно APPSTART объявить равным 0x00. Правда, при этом время обработки прерывания сократится на 2 такта.
З.Ы. Значения APPSTART нужно указывать в байтах.
|