QUOTE (rezident @ Oct 12 2011, 02:16)

Нет, Сергей, как сделать "перемещаемые" вектора прерываний я лично понимаю. Для пользовательского приложения "аппаратные" вектора прерываний как таковые вообще не используются. Пишутся лишь функции-обработчики прерываний, адреса которых "раскладываются" в таблицу переходов, расположенную в ОЗУ.
Верно. И раскладывает их туда загрузчик перед тем, как запустить приложение. И берет он их из таблицы, которая расположена в фиксированном месте приложения. И таблицей этой является содержимое сегмента INTVEC приложения.
QUOTE (rezident @ Oct 12 2011, 02:16)

У ТС же возник вопрос по совмещению двух проектов/прошивок в одном кристалле и вызове одного из другого. Как я понял, ты предлагаешь замещать вектор сброса тем, который генерируется при компиляции именно бутлоадера. А то содержимое вектора RESET, которое компилируется в пользовательском приложении из прошивки выкинуть, использовав его лишь как адрес для старта приложения. Так?
Зачем же выбрасывать и замещать? Пусть он лежит в таблице векторов приложения. Тогда загрузчик точно будет знать, откуда его брать. Вот смотрите, я в сообщении №26 давал пример. Вот структура таблицы векторов приложения, т.е. полное содержимое сегмента INTVEC приложения:
CODE
__attribute__ ((section(".app_vectors"))) struct
{
void *Vectors[INT_VECTORS_COUNT - 1];
void (*ResetVector)();
} Application;
Тут и все вектора прерываний и вектор сброса.
Вот загрузчик копирует эту таблицу в ОЗУ, в то место, откуда берут адреса функции-трамплины:
CODE
uint_fast8_t i = INT_VECTORS_COUNT - 1; // do not copy reset vector
while(i--)
{
InterruptVectors[i] = Application.Vectors[i];
}
А вот из этой же таблицы берется адрес, на который надо перейти для старта приложения:
CODE
Application.ResetVector();
А "железный" вектор RESET указывает на старт загрузчика. Тогда и приложение знает, как запустить загрузчик - адрес его точки входа всегда лежит в ячейках по адресу 0xFFFE.