;**************************************************** ;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里边的数据啊?!
|