|
又糊涂了
现在做实验,现象是这样的: 如果设置 RO BASE 为 0X0C00 0000 的话,我把UC/OS2 的.HEX代码直接 烧到FLASH ,结果串口有正确输出。如果设置 RO BASE 为 0X0000 0000 的话 ,就没串口输出了。
问: ADS里设置的RO BASE 和 RW BASE 这2个地址到底干嘛用的?
而且,在程序里写 |Image$$RO$$Limit| 和 BaseOfROM ,系统都能识别 。为什么?
附UC/OS2 的 那段拷贝程序:
;****************************************************
;拷贝并粘贴 RW data/zero initialized data *
;****************************************************
adr r0, ResetEntry ; 为小范围的地址读取伪指令。ADR指令将基于PC相对偏移的地址值读取到寄存器
ldr r1, BaseOfROM ; 为大范围的地址读取伪指令。
cmp r0, r1
ldreq r0, TopOfROM
beq InitRamData
;****************************************************
;计算拷贝程序在flash中的实际位置 *
;****************************************************
ldr r2, =CopyProcBeg
sub r1, r2, r1
add r0, r0, r1
ldr r3, =CopyProcEnd
;****************************************************
;将拷贝程序复制到ram中 *
;****************************************************
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
;********************************************************
;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中 *
;********************************************************
ldr r3, TopOfROM
ldr pc, =CopyProcBeg
;********************************************************
;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置 *
;只拷贝CopyProcEnd以后的代码 *
;********************************************************
CopyProcBeg
0
ldmia r0!, {r4-r11}
stmia r2!, {r4-r11}
cmp r2, r3
bcc %B0
CopyProcEnd
sub r1, r2, r3
sub r0, r0, r1
InitRamData
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
mov r0, #0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
|
|