Цитата(Vitaliy_ARM @ Sep 16 2011, 16:22)

Можно ли сделать копирование векторов прерываний в другую страницу на этапе линковки загрузчика, скажем по адресу 0x18000?
Я бы в вашем случае сделал так:
загрузчик пишется как обычно приложение, но только для работы в RAM.
Это можно сделать двумя способами - с помощью __ramfunc и двух таблиц прерываний, но на мой взгляд больно геморно....
Второй вариант переписав стратап код! Для кортекса можно без асма обойтись. Тоже понадобится 2 таблицы прерываний.
Код
// вектора во флеше для первоначального старта
uint32_t const __boot_table[]@".bootvect" =
{
0x20003FF0, //0
(uint32_t)bl_main, //1
};
#pragma section=".intvect"
#pragma section=".intvect_init"
#pragma section=".text_init"
static void segment_init(void)
{
uint32_t *src;
uint32_t *dst;
uint32_t len;
src = __section_begin(".intvect_init");
len = (uint32_t)__section_end(".text_init");
len = (len + 3 - (uint32_t)src) & ~3;
dst = __section_begin(".intvect");
while(len) {
*dst++=*src++;
len-=4;
}
}
#pragma location=".boot"
__noreturn
void bl_main(void)
{
segment_init();
*AT91C_CM3_VTOR = (unsigned)__section_begin(".intvect");
asm ("ldm r1, {r0,r1}\n"
"mov r13, r0\n"
"mov r15, r1");
while(1);
}
А в icf файл добавить
Код
do not initialize { section * };
initialize manually { section .text, section .intvect};
place at start of FLASH { section .bootvect };
place at start of RAM { section .intvect };
place in FLASH { section .boot*, section .text_init, section .intvect_init};
place in RAM { readwrite, readonly };
Но тут надо смотреть какие секции у вас используются и т.п.
но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу.