Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15576
  • 博文数量: 5
  • 博客积分: 147
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 00:25
文章分类
文章存档

2013年(1)

2012年(4)

我的朋友

分类: 嵌入式

2012-11-08 22:31:22

arm程序代码可以从norflash启动,也可以从nandflash启动。norflash接在arm总线bank0上,程序可以直接在norflash上执行,但这仅仅是RO部分,RW和ZI部分则必须复制到SDRAM上。nandflash上不能直接运行程序,但是arm会把nandflash前4K代码搬移到内部的4Ksdram中,然后从内部4KSDRAM中执行。如果程序在nandflash中,那么前4K代码中必须把RO,RW,ZI都复制到SDRAM中。如果程序在norflash中,则程序必须把RW,ZI复制到SDRAM中,但是,为了提高运行速度,也会把RO段复制到SDRAM中。
 ldr r0, =BWSCON
 ldr r0, [r0]
 ands r0, r0, #6        ;判断是否从norflash启动
 bne copy_proc_beg      ;若是,跳转到copy_proc_beg
 adr r0, ResetEntry     ;
 cmp r0, #0             ;判断,是从nandflash中启动,还是仿真器启动 
 bne copy_proc_beg      ;若是仿真器,跳转
nand_boot_beg           ;若是nandflash,执行RDNF2SDRAM
 [ {TRUE}
  bl RdNF2SDRAM         ;复制代码从nandflash到SDRAM,源代码在Nand.c文件
 ]
 ldr pc, =copy_proc_beg ;绝对地址跳转,然后代码在SDRAM中执行
copy_proc_beg          
 adr r0, ResetEntry
 ldr r2, BaseOfROM
 cmp r0, r2             ;判断此时是否在SDRAM中运行,
 ldreq r0, TopOfROM     ;若是,说明是从nandflash中启动,代码已经复制,直接跳到InitRam去复制RW段
 beq InitRam            ;若不是,说明从norflash中启动,代码还未复制,则复制RO段代码
 ldr r3, TopOfROM

 ldmia r0!, {r4-r7}     ;复制RO段代码
 stmia r2!, {r4-r7}
 cmp r2, r3
 bcc %B0
 
 sub r2, r2, r3         ;考虑RO段代码长度不是4的倍数,调整RW段开始地址
 sub r0, r0, r2    
  
InitRam                 ;复制RW段
 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      ;清零ZI段

 cmp r2, r3
 strcc r0, [r2], #4
 bcc %B1
 
ldr pc, =%F2           ;ldr:跳转到SDRAM
阅读(543) | 评论(1) | 转发(0) |
0

上一篇:LDM/STM指令

下一篇:加载域与执行域

给主人留下些什么吧!~~

hbxm9772012-11-21 16:32:09

蛮好的!