Вот такая ситуация.
Вводная - все тот же ARM968E-S
Что делаю:
1. Стартую с адреса внутренней флеш
2. Включаю TCM
3. Инициализация стеков
4. scatter_load должен мне все функции перенести в remap область, включая вектора
Что не получается:
0. Линкер ругается - L6286E
1. Вектора (которые exceptions) - слишком длинное расстояние PC+xx
2. Стеки, все-таки, инициализироваться должны после ремапа ПМСМ
Вот здесь Keil предлагает решение
http://www.keil.com/support/docs/3607.htm
все бы гут, но я тогда вылезу за слово на вектор
Вопросы:
1. Сам по себе ремап - после включения TCM она автоматом маппируется на адрес 0? не нашел этого нигде, ни в арме, ни в доке на проц
2. Как оно вообще нужно сделать првильно с векторами? Пока попробую сделать кусок кода уже в ремап области, чтобы вектора нормально попадали на исключения
3. Скаттер. Все ли в нем правильно?
Код
LR_IROM1 0x20000000 0x00010000 ; load region size_region
{
RO_IROM1 0x20000000 0x00010000; RO/Exec data
{
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
LR_VECTORS 0x00000000 0x8000; ITCM memory
{
*.o (MyVectors)
}
LR_ITCM_CODE_EXCEPTION +0
{
*.o (EXCEPTION)
}
LR_STACKS +0
{
*.o (MyStacks)
*.o (Heap)
*.o (Stacks)
}
LR_ITCM +0
{
*.o (RAMFUNC)
}
LR_RAM2 0x00400000 0x8000; DTCM memory
{
.ANY (+RW, +ZI)
}
}
{
RO_IROM1 0x20000000 0x00010000; RO/Exec data
{
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
LR_VECTORS 0x00000000 0x8000; ITCM memory
{
*.o (MyVectors)
}
LR_ITCM_CODE_EXCEPTION +0
{
*.o (EXCEPTION)
}
LR_STACKS +0
{
*.o (MyStacks)
*.o (Heap)
*.o (Stacks)
}
LR_ITCM +0
{
*.o (RAMFUNC)
}
LR_RAM2 0x00400000 0x8000; DTCM memory
{
.ANY (+RW, +ZI)
}
}