NORRoCopy ;copy_proc_beg by pht
bl ClearSdram
adr r0, ResetEntry ;判断是否在ROM中运行,ROM即RO指定的地址 从NOR启动时ResetEntry为0
ldr r2, BaseOfROM ;如果是则跳转到RwCopy 否则的话,将程序拷贝到ROM地址
cmp r0, r2
beq NORRwCopy
ldr r3, TopOfROM ;
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
NORRwCopy
ldr r0, TopOfROM
ldr r1, BaseOfROM
sub r0, r0, r1 ;TopOfROM-BaseOfROM得到从0开始RW的偏移地址
ldr r2, BaseOfBSS ;将RW部分的数据从ROM拷贝到RAM
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
InitRamZero
mov r0, #0
ldr r2, BaseOfZero
ldr r3, EndOfBSS
1
cmp r2, r3 ;初始化Zero部分 不管从哪里启动,这部分都需要执行
strcc r0, [r2], #4
bcc %B1
ldr pc, =CEntry ;goto compiler address
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
曾听说代码拷贝过程中不能将Nor正在运行的代码拷贝到RAM中,存在程序运行与读写数据冲突问题,上面这段代码怎么感觉是这么做的呢?而且可以运行的啊。 |