Цитата(quantum @ Oct 3 2007, 10:10)

...любопытно, что рядовые программы запускаются с SRAM, а ucos - нет...
...Я писал в startup.s79 код для remap и через ЖТАГ пронаблюдал, что вектора встают как надо - тоесть ремэп делается. Но ось всё равно не пашет!

...
не нужно ничего в стартапе писать!
в своё время я тоже на такие грабли натыкался!
JTAG помог - в ходе отладки зарулил на bsp.c на функцию BSP_IntCtrlInit
Во-первых:в ней код, который делает ремэп, если ОН УЖЕ СДЕЛАН!!! - идёт проверка чт./зап. ячейки RAM - таким образом проверяется - если кто-то отремэпил (mac-файл при отладке), то отремэпить назад:
Код
BSP_RAM_REMAP_TEST_BYTE=0xAA; //Write a byte to RAM
if(BSP_RAM_REMAP_TEST_BYTE==0xAA)
//Check if the write to RAM worked
{
AT91C_BASE_MC->MC_RCR=1; //If so, toggle REMAP register
}
в итоге нужный Вам ремэп не происходит!
Во-вторых:в той же функции есть функция инициализации векторов прерываний - так вот, прохождение
JTAG'ом показало, что он НЕ ВЫПОЛНЯЕТСЯ, так как условная директива компиляции RAM_REMAPPED ложна:
Код
#ifdef RAM_REMAPPED //BEGIN CODE RUNNING OUT OF RAM
BSP_InitExceptVect();
#endif
Отсюдова ТТРИ вывода:
1. Разрешить сделать ремэп ОДИН раз
2. Проинициализировать вектора прерываний (аля просто их сдвинуть куда надо)
3. Подправить xcl-файл линкераВот пример, изменённого файла bsp.c:
Код
static void BSP_IntCtrlInit (void)
{
CPU_INT16U i;
[b]AT91C_BASE_MC->MC_RCR=1; //REMAP
BSP_InitExceptVect(); //Prepare Vectors[/b]
AT91C_BASE_AIC->AIC_EOICR=0x00000000; //End-of-interrupt
for (i = 0; i < 32; i++) //Disable all ISRs
{
AT91C_BASE_AIC->AIC_SVR[i]=(CPU_INT32U)BSP_DummyISR_Handler;
AT91C_BASE_AIC->AIC_SMR[i]=0;
}
}
Кусок xcl-файла (отточен для SAM-BA SRAM
start address 0x202000):
Код
-carm
//Тут код и инициализированные данные
-DROMSTART=00202040
-DROMEND=00206FFF
//Тут переменные и стеки
-DRAMSTART=00207000
-DRAMEND=0020FFFF
//А тут вектора
-Z(CODE)INTVEC=202000-20203F
...
//далее без изменений
...
Цитата(quantum @ Oct 3 2007, 10:10)

вопрос - для чего нужен mac-файл? я его удаляю - всё равно в Flash работает! xcl- токо нужен
он нужен для дебугера - в нём тоже можно ремэп описать и настроить контроллер и JTAG
Цитата(quantum @ Oct 3 2007, 10:10)

Я писал в startup.s79 код для remap и через ЖТАГ пронаблюдал, что вектора встают как надо - тоесть ремэп делается. Но ось всё равно не пашет!

потому что из-за вышеопианных причин в bsp.c он ищё раз делается! стартап - НЕ ТРОГАТЬ!
P.S. надеюсь, исчерпывающе ответил на ваш вопрос.
Во всяком случае у меня работает