我看了你写的4510启动代码诠释,我觉得大体的思路是在flash中建立中断向量,一开始的代码也在flash中执行,flash地址在0x0处,但是接下来启动代码部分在flash执行中执行了重新映射内存的remap操作,我想不明白的是执行完remap操作后,flash中其余的代码还能继续执行么?flash的地址都变了,怎么执行下去呢?我的理解这段程序是在flash中执行的,但是在
LDR r13, PtInitRemap
语句之后程序执行了remap操作,那么remap之后flash的地址都变了,而其后在flash中还有其他程序,这时候,程序还能走到相应的地方继续执行么?想不明白
原来的程序如下:
?cstartup ; ?cstartup标号 LDR r1, =IntMask ; 屏蔽所有中断服务 LDR r0, =0xFFFFFFFF STR r0, [r1] LDR r0, =0x3FF0000 ; 设置SYSCFG=0x87FFFF90;RAM为SDRAM类型
;设置了8KCache,但unenable;写缓冲disable LDR r1, =0x87FFFF90 STR r1, [r0]
LDR r13, PtInitRemap ; PC入栈,保存remap后PC地址 LDR r0, =SystemInitDataSDRAM LDMIA r0, {r1-r12} ; 将rEXTDBWTH~rSREFEXTCON入栈 LDR r0, =0x3FF0000 + 0x3010 ; 从0x3FF3010开始写 STMIA r0, {r1-r12} ; rEXTDBWTH~rSREFEXTCON出栈写向
EXTDBWTH,ROMCON0~ROMCON5,DRAMCON0~DRAMCON3,REFEXTCON等12个寄存器,实现remap MOV pc, r13 ; PC出栈,恢复正确PC地址 PtInitRemap DCD RemapJump
SystemInitDataSDRAM: DC32 rEXTDBWTH DC32 rROMCON0 DC32 rROMCON1 DC32 rROMCON2 DC32 rROMCON3 DC32 rROMCON4 DC32 rROMCON5 DC32 rSDRAMCON0 DC32 rSDRAMCON1 DC32 rSDRAMCON2 DC32 rSDRAMCON3 DC32 rSREFEXTCON ;--------------------------------------------------------------- RemapJump:
;************执行其他的操作********************