首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM-S3C2440启动文件init.s解析(10)

ARM-S3C2440启动文件init.s解析(10)

ldr r3, TopOfROM
0
ldmia r0!, {r4-r7}     ;开始时,r0 = ResetEntry --- source
stmia r2!, {r4-r7}     ;开始时,r2 = BaseOfROM  --- destination
cmp r2, r3       ;终止条件:复制了TopOfROM-BaseOfROM大小
bcc %B0
;---------------------------------------------------------------
; 下面2行,根据理解,由tinko添加
; 猜测上面的代码不应该用" ! ",以至于地址被修改。这里重新赋值
;---------------------------------------------------------------
adrl r0, ResetEntry   ;don't use adr, 'cause out of range error occures
ldr r2, BaseOfROM
       ;旨在计算出正确的RW区起始位置
; 下面2行目的是为了计算正确的r0(必须使之指向code区中的rw域开始处)
sub r2, r2, r3    ;r2=BaseOfROM-TopOfROM=(-)代码长度
sub r0, r0, r2    ;r0=ResetEntry-(-)代码长度=ResetEntry+代码长度

InitRam
;复制代码加载位置中的RM区到|Image$$RW$$Base|
ldr r2, BaseOfBSS   ;BaseOfBSS->r2 ,  BaseOfBSS = |Image$$RW$$Base|
ldr r3, BaseOfZero   ;BaseOfZero->r3 , BaseOfZero = |Image$$ZI$$Base|
0
cmp r2, r3   ;比较BaseOfBSS和BaseOfZero
ldrcc r1, [r0], #4     ;当代码在内存中运行时,r0(初始值) = TopOfROM.
   ;这之后的BaseOfZero-BaseOfBSS仍属于code,需拷贝到BaseOfBSS
strcc r1, [r2], #4
bcc %B0

;用0初始化ZI区
mov r0, #0
ldr r3, EndOfBSS   ;EndOfBSS = |Image$$ZI$$Limit|
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
;要是r21   ; means Fclk:Hclk is not 1:1.
; bl MMU_SetAsyncBusMode
; |
; bl MMU_SetFastBusMode ; default value.
; ]
;bl Led_Test
;===========================================================
; 进入C语言前的最后一步了,就是把我们用说查二级向量表
; 的中断例程安装到一级向量表(异常向量表)里.
;//5.设置缺省中断处理函数
   ; Setup IRQ handler
ldr r0,=HandleIRQ       ;This routine is needed
ldr r1,=IsrIRQ   ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
str r1,[r0]
;//initialize the IRQ 将普通中断判断程序的入口地址给HandleIRQ

;/////////////////////////////////////////////////////////
;注意,以下这段可能不需要!!!!!!!!!!!!!!!!!!
;//6.将数据段拷贝到ram中 将零初始化数据段清零 跳入C语言的main函数执行到这步结束bootloader初步引导结束
;If main() is used, the variable initialization will be done in __main().
[ {FALSE}           ;by tinko -- 最外面的条件由tinko添加,实际上不再执行这段
    [ NOT:USE_MAIN ;initialized {FALSE}
        ;Copy and paste RW data/zero initialized data

LDR     r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
LDR     r1, =|Image$$RW$$Base|  ; and RAM copy
LDR     r3, =|Image$$ZI$$Base|

;Zero init base => top of initialised data
CMP     r0, r1      ; Check that they are different just for debug????????
BEQ     %F2
1     
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     %B1
2     
LDR     r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV     r2, #0
3     
CMP     r3, r1      ; Zero init
STRCC   r2, [r3], #4
BCC     %B3
    ]
    ]
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;***************************************
继承事业,薪火相传
返回列表