微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440启动代码中应用程序执行环境的初始化

S3C2440启动代码中应用程序执行环境的初始化

时间:11-22 来源:互联网 点击:

  1. 始化的全局变量,启动代码要将RO段和RW段复制到RAM中并将ZI段清零。编译器使用下列变量
  2. ;来记录各段的起始地址和结束地址。这些标号的值是通过编译器的设定来确定的如ADS中对ro-base和
  3. ;rw-base的设定。
  4. IMPORT|Image$RO$Base|;BaseofROMcode
  5. IMPORT|Image$RO$Limit|;EndofROMcode(=startofROMdata)
  6. IMPORT|Image$RW$Base|;BaseofRAMtoinitialise
  7. IMPORT|Image$ZI$Base|;Baseandlimitofarea
  8. IMPORT|Image$ZI$Limit|;tozeroinitialise
  9. ;===========================================================
  10. ldrr0,=BWSCON
  11. ldrr0,[r0]
  12. andsr0,r0,#6;通过判断OM[1:0]!=0,得知是NORFLashboot
  13. bnecopy_proc_beg;不用读取nandflash
  14. adrr0,ResetEntry;OM[1:0]==0,从NANDFLash启动
  15. cmpr0,#0;再比较入口是否为0地址处,如果不是则用了仿真器
  16. bnecopy_proc_beg;用仿真器的情况也不要用nandflash启动
  17. ;nop
  18. ;===========================================================
  19. nand_boot_beg;这一段代码完成从NAND读代码到RAM
  20. [{TRUE}
  21. blRdNF2SDRAM
  22. ]
  23. ldrpc,=copy_proc_beg;此时的PC已经在0x30000000以后,是copy_proc_beg连接时的地址
  24. ;这个标号下面的代码完成的功能就是把norflash的内容拷贝到ram当中。
  25. ;===========================================================
  26. copy_proc_beg
  27. adrr0,ResetEntry;装载地址,ResetEntry值->r0
  28. ldrr2,BaseOfROM;BaseOfROM值
  29. cmpr0,r2;比较RO,R2
  30. ldreqr0,TopOfROM;如果相等的话(说明在内存中运行),TopOfROM->r0当从NandFlash中启动时r0=r2,当从NorFlash启动时则不相等
  31. beqInitRam;同时跳到InitRam
  32. ;下面这个是针对代码在NORFLASH时的拷贝方法
  33. ;功能为把从ResetEntry起,TopOfROM-BaseOfROM大小的数据拷到BaseOfROM
  34. ;TopOfROM和BaseOfROM为|Image$RO$Limit|和|Image$RO$Base|
  35. ;|Image$RO$Limit|和|Image$RO$Base|由连接器生成为生成的代码的代码段运行时的起启和终止地址
  36. ;BaseOfBSS和BaseOfZero为|Image$RW$Base|和|Image$ZI$Base|
  37. ;|Image$RW$Base|和|Image$ZI$Base|也是由连接器生成,两者之间就是初始化数据的存放地放
  38. ldrr3,TopOfROM
  39. 0
  40. ldmiar0!,{r4-r7}
  41. stmiar2!,{r4-r7}
  42. cmpr2,r3
  43. bcc%B0
  44. subr2,r2,r3;这两句代码是修正字非对齐的情况,因为是按4个字节拷贝的,但RO段大小不一定是4个字节对齐的
  45. subr0,r0,r2
  46. InitRam
  47. ldrr2,BaseOfBSS
  48. ldrr3,BaseOfZero
  49. 0
  50. cmpr2,r3
  51. ldrccr1,[r0],#4
  52. strccr1,[r2],#4
  53. bcc%B0;这一段是对ResetEntry里面定义好的数据拷贝到RW段。
  54. movr0,#0
  55. ldrr3,EndOfBSS
  56. 1
  57. cmpr2,r3
  58. strccr0,[r2],#4
  59. bcc%B1;初始化ZI段
  60. ldrpc,=%F2;gotocompileraddress
  61. 2
  62. ;[CLKdiv_VAL>1;meansFclk:Hclkisnot1:1.
  63. ;blMMU_SetAsyncBusMode
  64. ;|
  65. ;blMMU_SetFastBusMode;defaultvalue.
  66. ;]
  67. [:LNOT:THUMBCODE
  68. blMain;不要用main()因为main()是ADS默认入口,编译器会添加其他代码
  69. b.;跳转到Main不成功则挂起
  70. ]
  71. [THUMBCODE;forstart-upcodeforThumbmode
  72. orrlr,pc,#1
  73. bxlr
  74. CODE16
  75. blMain;Donotusemain()because......
  76. b.
  77. CODE32
  78. ]
  79. BaseOfROMDCD|Image$RO$Base|
  80. TopOfROMDCD|Image$RO$Limit|
  81. BaseOfBSSDCD|Image$RW$Base|
  82. BaseOfZeroDCD|Image$ZI$Base|
  83. EndOfBSSDCD|Image$ZI$Limit|


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top