Startup.s
上传用户:gzxf2008
上传日期:2016-10-05
资源大小:181k
文件大小:5k
源码类别:

单片机开发

开发平台:

C/C++

  1. ;********************************************************************************************************/
  2. ;define the stack size
  3. ;定义堆栈的大小
  4. SVC_STACK_LEGTH         EQU         0
  5. FIQ_STACK_LEGTH         EQU         0
  6. IRQ_STACK_LEGTH         EQU         256
  7. ABT_STACK_LEGTH         EQU         0
  8. UND_STACK_LEGTH         EQU         0
  9. NoInt       EQU 0x80
  10. USR32Mode   EQU 0x10
  11. SVC32Mode   EQU 0x13
  12. SYS32Mode   EQU 0x1f
  13. IRQ32Mode   EQU 0x12
  14. FIQ32Mode   EQU 0x11
  15.     IMPORT __use_no_semihosting_swi
  16. ;The imported labels
  17. ;引入的外部标号在这声明
  18.     IMPORT  FIQ_Exception                   ;Fast interrupt exceptions handler 快速中断异常处理程序
  19.     IMPORT  __main                          ;The entry point to the main function C语言主程序入口 
  20.     IMPORT  TargetResetInit                 ;initialize the target board 目标板基本初始化
  21. ;The emported labels
  22. ;给外部使用的标号在这声明
  23.     EXPORT  bottom_of_heap
  24.     EXPORT  StackUsr
  25.     
  26.     EXPORT  Reset
  27.     EXPORT __user_initial_stackheap
  28.     CODE32
  29.     PRESERVE8
  30.     AREA    vectors,CODE,READONLY
  31.         ENTRY
  32. ;interrupt vectors
  33. ;中断向量表
  34. Reset
  35.         LDR     PC, ResetAddr
  36.         LDR     PC, UndefinedAddr
  37.         LDR     PC, SWI_Addr
  38.         LDR     PC, PrefetchAddr
  39.         LDR     PC, DataAbortAddr
  40.         DCD     0xb9205f80
  41.         LDR     PC, [PC, #-0xff0]
  42.         LDR     PC, FIQ_Addr
  43. ResetAddr           DCD     ResetInit
  44. UndefinedAddr       DCD     Undefined
  45. SWI_Addr            DCD     SoftwareInterrupt
  46. PrefetchAddr        DCD     PrefetchAbort
  47. DataAbortAddr       DCD     DataAbort
  48. Nouse               DCD     0
  49. IRQ_Addr            DCD     0
  50. FIQ_Addr            DCD     FIQ_Handler
  51. ;未定义指令
  52. Undefined
  53.         B       Undefined
  54. ;软中断
  55. SoftwareInterrupt
  56.         B       SoftwareInterrupt
  57. ;取指令中止
  58. PrefetchAbort
  59.         B       PrefetchAbort
  60. ;取数据中止
  61. DataAbort
  62.         B       DataAbort
  63. ;快速中断
  64. FIQ_Handler
  65.         STMFD   SP!, {R0-R3,R12,LR}
  66.         BL      FIQ_Exception
  67.         LDMFD   SP!, {R0-R3,R12,LR}
  68.         SUBS    PC,  LR,  #4
  69.         
  70. ;********************************************************************************************************/
  71. InitStack    
  72.         MOV     R0, LR
  73. ;Build the SVC stack
  74. ;设置管理模式堆栈
  75.         MSR     CPSR_c, #0xd3
  76.         LDR     SP, StackSvc
  77. ;Build the IRQ stack
  78. ;设置中断模式堆栈
  79.         MSR     CPSR_c, #0xd2
  80.         LDR     SP, StackIrq
  81. ;Build the FIQ stack
  82. ;设置快速中断模式堆栈
  83.         MSR     CPSR_c, #0xd1
  84.         LDR     SP, StackFiq
  85. ;Build the DATAABORT stack
  86. ;设置中止模式堆栈
  87.         MSR     CPSR_c, #0xd7
  88.         LDR     SP, StackAbt
  89. ;Build the UDF stack
  90. ;设置未定义模式堆栈
  91.         MSR     CPSR_c, #0xdb
  92.         LDR     SP, StackUnd
  93. ;Build the SYS stack
  94. ;设置系统模式堆栈
  95.         MSR     CPSR_c, #0x5f
  96.         LDR     SP, =StackUsr
  97.         MOV     PC, R0
  98. ;********************************************************************************************************/
  99. ResetInit
  100.         
  101.         BL      InitStack               ;初始化堆栈 Initialize the stack
  102.         BL      TargetResetInit         ;目标板基本初始化 Initialize the target board
  103.                                         ;跳转到c语言入口 Jump to the entry point of C program
  104.         B       __main
  105. ;********************************************************************************************************/
  106. __user_initial_stackheap    
  107.     LDR   r0,=bottom_of_heap
  108. ;    LDR   r1,=StackUsr
  109.     MOV   pc,lr
  110. StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
  111. StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
  112. StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
  113. StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
  114. StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
  115.     
  116. ;/* 分配堆栈空间 */
  117.         AREA    MyStacks, DATA, NOINIT, ALIGN=2
  118. SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;Stack spaces for Administration Mode 管理模式堆栈空间
  119. IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间
  120. FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间
  121. AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;Stack spaces for Suspend Mode 中止义模式堆栈空间
  122. UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;Stack spaces for Undefined Mode 未定义模式堆栈
  123.         AREA    Heap, DATA, NOINIT
  124. bottom_of_heap    SPACE   1
  125.         AREA    Stacks, DATA, NOINIT
  126. StackUsr
  127.     END
  128. ;/*********************************************************************************************************
  129. ;**                            End Of File
  130. ;********************************************************************************************************/