S3C2440启动代码中应用程序执行环境的初始化
时间:11-22
来源:互联网
点击:
- 始化的全局变量,启动代码要将RO段和RW段复制到RAM中并将ZI段清零。编译器使用下列变量
- ;来记录各段的起始地址和结束地址。这些标号的值是通过编译器的设定来确定的如ADS中对ro-base和
- ;rw-base的设定。
- IMPORT|Image$RO$Base|;BaseofROMcode
- IMPORT|Image$RO$Limit|;EndofROMcode(=startofROMdata)
- IMPORT|Image$RW$Base|;BaseofRAMtoinitialise
- IMPORT|Image$ZI$Base|;Baseandlimitofarea
- IMPORT|Image$ZI$Limit|;tozeroinitialise
- ;===========================================================
- ldrr0,=BWSCON
- ldrr0,[r0]
- andsr0,r0,#6;通过判断OM[1:0]!=0,得知是NORFLashboot
- bnecopy_proc_beg;不用读取nandflash
- adrr0,ResetEntry;OM[1:0]==0,从NANDFLash启动
- cmpr0,#0;再比较入口是否为0地址处,如果不是则用了仿真器
- bnecopy_proc_beg;用仿真器的情况也不要用nandflash启动
- ;nop
- ;===========================================================
- nand_boot_beg;这一段代码完成从NAND读代码到RAM
- [{TRUE}
- blRdNF2SDRAM
- ]
- ldrpc,=copy_proc_beg;此时的PC已经在0x30000000以后,是copy_proc_beg连接时的地址
- ;这个标号下面的代码完成的功能就是把norflash的内容拷贝到ram当中。
- ;===========================================================
- copy_proc_beg
- adrr0,ResetEntry;装载地址,ResetEntry值->r0
- ldrr2,BaseOfROM;BaseOfROM值
- cmpr0,r2;比较RO,R2
- ldreqr0,TopOfROM;如果相等的话(说明在内存中运行),TopOfROM->r0当从NandFlash中启动时r0=r2,当从NorFlash启动时则不相等
- beqInitRam;同时跳到InitRam
- ;下面这个是针对代码在NORFLASH时的拷贝方法
- ;功能为把从ResetEntry起,TopOfROM-BaseOfROM大小的数据拷到BaseOfROM
- ;TopOfROM和BaseOfROM为|Image$RO$Limit|和|Image$RO$Base|
- ;|Image$RO$Limit|和|Image$RO$Base|由连接器生成为生成的代码的代码段运行时的起启和终止地址
- ;BaseOfBSS和BaseOfZero为|Image$RW$Base|和|Image$ZI$Base|
- ;|Image$RW$Base|和|Image$ZI$Base|也是由连接器生成,两者之间就是初始化数据的存放地放
- ldrr3,TopOfROM
- 0
- ldmiar0!,{r4-r7}
- stmiar2!,{r4-r7}
- cmpr2,r3
- bcc%B0
- subr2,r2,r3;这两句代码是修正字非对齐的情况,因为是按4个字节拷贝的,但RO段大小不一定是4个字节对齐的
- subr0,r0,r2
- InitRam
- ldrr2,BaseOfBSS
- ldrr3,BaseOfZero
- 0
- cmpr2,r3
- ldrccr1,[r0],#4
- strccr1,[r2],#4
- bcc%B0;这一段是对ResetEntry里面定义好的数据拷贝到RW段。
- movr0,#0
- ldrr3,EndOfBSS
- 1
- cmpr2,r3
- strccr0,[r2],#4
- bcc%B1;初始化ZI段
- ldrpc,=%F2;gotocompileraddress
- 2
- ;[CLKdiv_VAL>1;meansFclk:Hclkisnot1:1.
- ;blMMU_SetAsyncBusMode
- ;|
- ;blMMU_SetFastBusMode;defaultvalue.
- ;]
- [:LNOT:THUMBCODE
- blMain;不要用main()因为main()是ADS默认入口,编译器会添加其他代码
- b.;跳转到Main不成功则挂起
- ]
- [THUMBCODE;forstart-upcodeforThumbmode
- orrlr,pc,#1
- bxlr
- CODE16
- blMain;Donotusemain()because......
- b.
- CODE32
- ]
- BaseOfROMDCD|Image$RO$Base|
- TopOfROMDCD|Image$RO$Limit|
- BaseOfBSSDCD|Image$RW$Base|
- BaseOfZeroDCD|Image$ZI$Base|
- EndOfBSSDCD|Image$ZI$Limit|
S3C2440启动代码执行环 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)