RO Base设置为0xc000000 RW Base设置为0xc5f0000,可是BIOS不是要放0X0000000的吗
注意:如果是用44B0,那么44B0上电复位后PC的值是0,
AREA Init,CODE,READONLY
ENTRY
ResetEntry
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ
b HandlerFIQ
系统上电后第一条指令执行的是b ResetHandler (在0地址处)这是一条相对跳转指令,也就是说,这条指令和RO的设置无关
跳转到ResetHandler处,进行一些初始化动作后,就要进行代码拷贝,就是把FLASH里的代码拷贝到RO指定的地址处,代码拷贝是这样实现的:
;****************************************************
;拷贝并粘贴 RW data/zero initialized data *
;****************************************************
adr r0, ResetEntry
ldr r1,BaseOfROM
cmp r0,r1
ldreq r0, TopOfROM
beq InitRamData
;****************************************************
;计算拷贝程序在FLASH中的实际位置 *
;****************************************************
ldr r2,=CopyProcBeg
sub r1, r2, r1;r2-r1->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 ;装入绝对地址(指到RAM中去的)
b 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
;===================================================================
adr r0, ResetEntry
ldr r1,BaseOfROM
cmp r0,r1
请注意这几条语句,尤其是adr r0, ResetEntry,这条语句当你反汇编后发现是一条这样的指令
;[0xe24f0f5d] sub r0,pc,#0x174 ; #0xc008000
也是一条与位置无关的指令,ResetEntry的值同PC的值相关联,
当然,PC一上电的值为0,所以这里ResetEntry的值也为0,所以
ldr r1,BaseOfROM
cmp r0,r1
比较的结果就是R0 != R1于是进行代码拷贝,将复制程序拷贝完后,就可以跳转到RAM中去,执
搬运啊搬运
最新推荐文章于 2024-09-28 13:15:47 发布