微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440启动代码分析

S3C2440启动代码分析

时间:11-21 来源:互联网 点击:
  1. ;==;=========================================
  2. ;NAME:2440INIT.S
  3. ;DESC:Cstartupcodes
  4. ;Configurememory,ISR,stacks
  5. ;InitializeC-variables
  6. ;完全注释;=========================================
  7. ;NAME:2440INIT.S
  8. ;DESC:Cstartupcodes
  9. ;Configurememory,ISR,stacks
  10. ;InitializeC-variables
  11. ;完全注释
  12. ;HISTORY:
  13. ;2002.02.25:kwtark:ver0.0
  14. ;2002.03.20:purnnamu:AddsomefunctionsfortestingSTOP,Sleepmode
  15. ;2003.03.14:DonGo:Modifiedfor2440.
  16. ;200906.24:TinkoModified
  17. ;=========================================
  18. ;汇编不能使用include包含头文件,所有用Get
  19. ;汇编也不认识*.h文件,所有只能用*.inc
  20. GEToption.inc;定义芯片相关的配置
  21. GETmemcfg.inc;定义存储器配置
  22. GET2440addr.inc;定义了寄存器符号
  23. ;REFRESH寄存器[22]bit:0-autorefresh;1-selfrefresh
  24. BIT_SELFREFRESHEQU(1<22);用于节电模式中,SDRAM自动刷新
  25. ;处理器模式常量:CPSR寄存器的后5位决定目前处理器模式M[4:0]
  26. USERMODEEQU0x10
  27. FIQMODEEQU0x11
  28. IRQMODEEQU0x12
  29. SVCMODEEQU0x13
  30. ABORTMODEEQU0x17
  31. UNDEFMODEEQU0x1b
  32. MODEMASKEQU0x1f;M[4:0]
  33. NOINTEQU0xc0
  34. ;定义处理器各模式下堆栈地址常量
  35. UserStackEQU(_STACK_BASEADDRESS-0x3800);0x33ff4800~_STACK_BASEADDRESS定义在option.inc中
  36. SVCStackEQU(_STACK_BASEADDRESS-0x2800);0x33ff5800~
  37. UndefStackEQU(_STACK_BASEADDRESS-0x2400);0x33ff5c00~
  38. AbortStackEQU(_STACK_BASEADDRESS-0x2000);0x33ff6000~
  39. IRQStackEQU(_STACK_BASEADDRESS-0x1000);0x33ff7000~
  40. FIQStackEQU(_STACK_BASEADDRESS-0x0);0x33ff8000~
  41. ;arm处理器有两种工作状态1.arm:32位这种工作状态下执行字对准的arm指令2.Thumb:16位这种工作状
  42. ;态执行半字对准的Thumb指令
  43. ;因为处理器分为16位32位两种工作状态程序的编译器也是分16位和32两种编译方式所以下面的程序用
  44. ;于根据处理器工作状态确定编译器编译方式
  45. ;code16伪指令指示汇编编译器后面的指令为16位的thumb指令
  46. ;code32伪指令指示汇编编译器后面的指令为32位的arm指令
  47. ;
  48. ;Arm上电时处于ARM状态,故无论指令为ARM集或Thumb集,都先强制成ARM集,待init.s初始化完成后
  49. ;再根据用户的编译配置转换成相应的指令模式。为此,定义变量THUMBCODE作为指示,跳转到main之前
  50. ;根据其值切换指令模式
  51. ;
  52. ;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译
  53. ;Checkiftasm.exe(armasm-16...@ADS1.0)isused.
  54. GBLLTHUMBCODE;定义THUMBCODE全局变量注意EQU所定义的宏与变量的区别
  55. [{CONFIG}=16;如果发现是在用16位代码的话(编译选项中指定使用thumb指令)
  56. THUMBCODESETL{TRUE};一方面把THUMBCODE设置为TURE
  57. CODE32;另一方面暂且把处理器设置成为ARM模式,以方便初始化
  58. |;(|表示else)如果编译选项本来就指定为ARM模式
  59. THUMBCODESETL{FALSE};把THUMBCODE设置为FALSE就行了
  60. ];结束
  61. MACRO;一个根据THUMBCODE把PC寄存的值保存到LR的宏
  62. MOV_PC_LR;宏名称
  63. [THUMBCODE;如果定义了THUMBCODE,则
  64. bxlr;在ARM模式中要使用BX指令转跳到THUMB指令,并转换模式.bx指令会根据PC最后1位来确定是否进入thumb状态
  65. |;否则,
  66. movpc,lr;如果目标地址也是ARM指令的话就采用这种方式
  67. ]
  68. MEND;宏定义结束标志
  69. MACRO;和上面的宏一样,只是多了一个相等的条件
  70. MOVEQ_PC_LR
  71. [THUMBCODE
  72. bxeqlr
  73. |
  74. moveqpc,lr
  75. ]
  76. MEND
  77. ;=======================================================================================
  78. ;下面这个宏是用于第一次查表过程的实现中断向量的重定向,如果你比较细心的话就是发现
  79. ;在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表是采用型如Handle***的方式的.
  80. ;而在程序的ENTRY处(程序开始处)采用的是bHandler***的方式.
  81. ;在这里Handler***就是通过HANDLER这个宏和Handle***建立联系的.
  82. ;这种方式的优点就是正真定义的向量数据在内存空间里,而不是在ENTRY处的ROM(FLASH)空间里,
  83. ;这样,我们就可以在程序里灵活的改动向量的数据了.
  84. ;========================================================================================
  85. ;;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
  86. ;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字
  87. ;空间都有一个标号,以Handle***命名。
  88. ;在向量中断模式下使用“加载程序”来执行中断服务程序。
  89. ;这里就必须讲一下向量中断模式和非向量中断模式的概念
  90. ;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时

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

网站地图

Top