;****************************************************
;Copy and paste RW data/zero initialized data *
;****************************************************
LDR r0, =|Image$$RO$$Limit| ; 是RO输出运行域的结束地址
LDR r1, =|Image$$RW$$Base| ; 是RW输出运行域的起始地址
LDR r3, =|Image$$ZI$$Base| ;Zero init base => top of initialised data
CMP r0, r1 ; Check that they are different一般情况下这两者不是相等么?
BEQ %F1
0
CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2
CMP r3, r1 ;Zero init
STRCC r2, [r3], #4
BCC %B2
问题1:
前提:ADS1.2编译时,RO输出运行域的起始地址设置为0x0c000000;
|Image$$RO$$Limit|是RO输出运行域的结束地址
|Image$$RW$$Base|是RW输出运行域的起始地址
在不设置RW的时候,这两者不是相等么?那下一句代码:
CMP r0, r1 ;
BEQ %F1;
直接跳到下边去执行ZI段清零了,根本没有复制RW段代码啊?!
问题2:
CMP r0, r1;如果不相等
0
CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
这段代码是把r0这个起始地址里的数据复制到 r1这个起始地址里边去
然而,
r0里边装的是RO输出运行域的结束地址(即0x0c00000+数据长度)
r1里边转的是RW输出运行域的起始地址
两个地址都在SDRAM里(bank6),也没有复制ROM里边的数据啊?!