В cstartup вектора переделываются на такой манер: .... __program_start ldr pc, [pc, #0x18] ; SoftReset ldr pc, [pc, #0x18] ; UndefHandler ldr pc, [pc, #0x18] ; SWIHandler ldr pc, [pc, #0x18] ; PrefetchAbortHandler ldr pc, [pc, #0x18] ; DataAbortHandler dc32 (SFE(CHECKSUM)-__program_start)/512+1 ldr pc, [pc,#-0xF20] ; IRQ : read the AIC ldr pc, [pc,#-0xF20] ; FIQ : read the AIC ;- There are only 5 offsets as the vectoring is used. PUBLIC SoftVectorVals SoftVectorVals: DCD SoftReset ;idx=0 DCD UndefHandler ;idx=1 DCD SWIHandler ;idx=2 DCD PrefetchAbortHandler DCD DataAbortHandler .... SoftReset b ?boot ...... ?boot: ..... // after remap ldr r11,=0 ldr r12,=__program_start ldmia r12!,{r0-r10} //move vectors from my INTVEC stmia r11!,{r0-r10} //to internal RAM @ 0 ldmia r12!,{r0-r6} stmia r11!,{r0-r6} .... Поскольку данные участки программы позиционно независимы они могут использоваться в любом месте памяти... Табличка SoftVectorVals доступна с уровня языка Ц и в low_level_init можно их первоначально устанавливать: ..... extern void *SoftVectorVals[];
__irq __arm void MyUndefHandler(void) { ..... }
...... SoftVectorVals[1]=(void *)MyUndefHandler; .......
Пока не проинициализируешь все клоки и контроллер СДРАМ загружать в СДРАМ что либо бесполезно, поэтому необходимо при подаче питания чтобы в ходе инициализационного процесса из какой-либо ПЗУхи выполнился кусок кода инициализирующий необходимую периферию и контроллер СДРАМ и больше к ним не прикасаться... Надеюсь что был вам полезен...
|