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中去,执行RAM中的拷贝程序,将FLASH中的代码拷贝到RAM中去.. |