|

楼主 |
发表于 2013-12-26 10:27:44
|
显示全部楼层
为什么要有bootloader,有几种原因,一种是升级方便,类似IAP之类的。还有一种是代码存放到ROM中,而执行的时候是SDRAM中运行的,网上2440的bootloader大多是后面这种
上传我之前整理的一段代码,就是拷贝RO,RW,ZI段代码到SDRAM的,然后跳转到SDRAM运行
IMPORT |Image$$RO$$Base| ;符号导入
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
RO,RW,ZI这些应该是编译的时候决定的
- adr r0,ResetEntry
- ldr r1,RO_Base
- cmp r0,r1
- ldreq r0,RO_Limit
- beq InitRam
- ldr r2,RO_Limit
- 1 ;把RO段拷贝到其运行时地址
- ldmia r0!,{r4-r7}
- stmia r1!,{r4-r7}
- cmp r1,r2
- bcc %B1
-
- sub r1,r1,r2 ;把r0定位为RO段末地址即RW段起始地址
- sub r0,r0,r1
- InitRam ;r0=0+(RO_Limit-RO_Base)
- ldr r1,RW_Base
- ldr r2,RW_Limit
- ; ldr r2,ZI_Base
- 2 ;把RW段拷贝到其运行时地址
- cmp r1,r2
- ldrcc r3,[r0],#4
- strcc r3,[r1],#4
- bcc %B2
-
- ; sub r1,r1,r2
- ; sub r0,r0,r1
- mov r0,#0
- ldr r1,ZI_Base
- ldr r2,ZI_Limit
- 3 ;初始化ZI运行时域
- cmp r1,r2
- strcc r0,[r1],#4
- bcc %B3
-
- ldr r1,=GSTATUS2
- ldr r0,[r1]
- str r0,[r1]
-
- ldr pc,=Main ;为什么这里的main就是在SDRAM里,这个就是关键,网上很多人理解都不正确 ,这里的ldr是个伪指令,ldr pc, =Main和ldr pc, Main是不一样的。
- ;ldr pc, =Main是跳转到绝对地址(位于SDRAM),用仿真器调试就知道了。(ps,我好久没研究它了,不知道有没说反)
- b .
复制代码 |
|