首先说明一下芯片内存情况:片内flash地址为0x00000000,大小为256K,片内sram为0x20000000,大小为64K.<br /> 现在想把代码放到SRAM运行,下面给出分散加载文件和编译时的map输出<br />FLASH 0x00000000 0x00010000<br />{<br /> RESET 0x00000000 0x00010000<br /> {<br /> *.o (RESET, +First)<br /> }<br /> RO +0x20000000 0x00010000<br /> {<br /> * (+RO)<br /> }<br /> RW +0 0x00010000<br /> {<br /> * (+RW)<br /> }<br /> ZI +0 0x00010000<br /> {<br /> * (+ZI)<br /> }<br />}<br /> <br /> map输出:<br />================================================================================<br /><br />Memory Map of the image<br /><br /> Image Entry point : 0x0000006f<br /><br /> Load Region FLASH (Base: 0x00000000, Size: 0x00000d70, Max: 0x00010000, ABSOLUTE)<br /><br /> Execution Region RESET (Base: 0x00000000, Size: 0x000000d8, Max: 0x00010000, ABSOLUTE)<br /><br /> Base Addr Size Type Attr Idx E Section Name Object<br /><br /> 0x00000000 0x000000b8 Code RO 159 * RESET bl_startup_rvmdk.o<br /> 0x000000b8 0x0000000a Ven RO 178 Veneer$$Code anon$$obj.o<br /> 0x000000c2 0x0000000a Ven RO 179 Veneer$$Code anon$$obj.o<br /> 0x000000cc 0x0000000a Ven RO 180 Veneer$$Code anon$$obj.o<br /><br /><br /> Execution Region RO (Base: 0x200000d8, Size: 0x00000c34, Max: 0x00010000, ABSOLUTE)<br /><br /> Base Addr Size Type Attr Idx E Section Name Object<br /><br /> 0x200000d8 0x00000048 Code RO 28 .text bl_check.o<br /> 0x20000120 0x00000b90 Code RO 55 .text bl_enet.o<br /> 0x20000cb0 0x00000024 Code RO 171 .text memcpya.o(mc_w.l)<br /> 0x20000cd4 0x00000026 Code RO 173 .text memseta.o(mc_w.l)<br /> 0x20000cfa 0x0000000a Ven RO 181 Veneer$$Code anon$$obj.o<br /> 0x20000d04 0x00000006 Data RO 57 .constdata bl_enet.o<br /><br /><br /> Execution Region RW (Base: 0x20000d0c, Size: 0x00000064, Max: 0x00010000, ABSOLUTE)<br /><br /> Base Addr Size Type Attr Idx E Section Name Object<br /><br /> 0x20000d0c 0x00000064 Data RW 56 .data bl_enet.o<br /><br /><br /> Execution Region ZI (Base: 0x20000d70, Size: 0x0000041c, Max: 0x00010000, ABSOLUTE)<br /><br /> Base Addr Size Type Attr Idx E Section Name Object<br /><br /> 0x20000d70 0x0000035c Zero RW 58 .bss bl_enet.o<br /> 0x200010cc 0x000000c0 Zero RW 158 .bss bl_startup_rvmdk.o<br /><br /><br />================================================================================<br /> 一开机就开始运行如下这段代码<br /><br />ProcessorInit<br /> ;<br /> ; Copy the code image from flash to SRAM.<br /> ;<br /> movs r0, #0x00000000<br /> ldr r1, =0x20000000<br /> import ||Image$$ZI$$Base||<br /> ldr r2, =||Image$$ZI$$Base||<br />copy_loop<br /> ldr r3, [r0], #4<br /> str r3, [r1], #4<br /> cmp r1, r2<br /> blt copy_loop<br /><br /> ;<br /> ; Zero fill the .bss section.<br /> ;<br /> movs r0, #0x00000000<br /> import ||Image$$ZI$$Limit||<br /> ldr r2, =||Image$$ZI$$Limit||<br />zero_loop<br /> str r0, [r1], #4<br /> cmp r1, r2<br /> blt zero_loop<br /><br /> ;<br /> ; Set the vector table pointer to the beginning of SRAM.<br /> ;<br /> ldr r0, =0xe000ed08<br /> ldr r1, =0x20000000<br /> str r1, [r0]<br /><br /> orr lr, lr, #0x20000000<br /> bx lr<br /> 在执行这段代码的时候,发现||Image$$ZI$$Limit||的值和||Image$$ZI$$Base||居然是一样的,都为0x20000d70。根据map的输出,这两个值不应该相等啊?<br /><br /> |
|