Startup.s
上传用户:ssllxx2007
上传日期:2022-06-12
资源大小:784k
文件大小:7k
源码类别:

uCOS

开发平台:

C/C++

  1. ;/*****************************************************************************
  2. ;*   startup.s: startup file for NXP LPC230x Family Microprocessors
  3. ;*
  4. ;*   Copyright(C) 2006, NXP Semiconductor
  5. ;*   All rights reserved.
  6. ;*
  7. ;*   History
  8. ;*   2006.09.01  ver 1.00    Prelimnary version, first Release
  9. ;*
  10. ;*****************************************************************************/
  11. PRESERVE8
  12. ;/*
  13. ; *  The STARTUP.S code is executed after CPU Reset. This file may be 
  14. ; *  translated with the following SET symbols. In uVision these SET 
  15. ; *  symbols are entered under Options - ASM - Define.
  16. ; *
  17. ; *  REMAP: when set the startup code initializes the register MEMMAP 
  18. ; *  which overwrites the settings of the CPU configuration pins. The 
  19. ; *  startup and interrupt vectors are remapped from:
  20. ; *     0x00000000  default setting (not remapped)
  21. ; *     0x40000000  when RAM_MODE is used
  22. ; *
  23. ; *  RAM_MODE: when set the device is configured for code execution
  24. ; *  from on-chip RAM starting at address 0x40000000. 
  25. ; */
  26. ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
  27. Mode_USR        EQU     0x10
  28. Mode_FIQ        EQU     0x11
  29. Mode_IRQ        EQU     0x12
  30. Mode_SVC        EQU     0x13
  31. Mode_ABT        EQU     0x17
  32. Mode_UND        EQU     0x1B
  33. Mode_SYS        EQU     0x1F
  34. I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
  35. F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled
  36. ;// <h> Stack Configuration (Stack Sizes in Bytes)
  37. ;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
  38. ;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>
  39. ;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
  40. ;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
  41. ;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
  42. ;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
  43. ;// </h>
  44. UND_Stack_Size  EQU     0x00000000
  45. SVC_Stack_Size  EQU     0x00000100
  46. ABT_Stack_Size  EQU     0x00000000
  47. FIQ_Stack_Size  EQU     0x00000000
  48. IRQ_Stack_Size  EQU     0x00000120               ;每层嵌套需要9个字堆栈,允许8层嵌套
  49. USR_Stack_Size  EQU     0x00000200
  50. Stack_Size      EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + 
  51.                          FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
  52.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  53. Stack_Mem       SPACE   Stack_Size
  54. StackUsr        EQU     Stack_Mem+USR_Stack_Size
  55. Stack_Top       EQU     Stack_Mem + Stack_Size
  56. EXPORT  StackUsr        ;声明为外部标号,供IRQ.S调用。
  57. ;// <h> Heap Configuration
  58. ;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>
  59. ;// </h>
  60. Heap_Size       EQU     0x00000001
  61.    
  62.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  63. Heap_Mem        SPACE   Heap_Size
  64. ; Area Definition and Entry Point
  65. ;  Startup Code must be linked first at Address at which it expects to run.
  66. ;引入的外部标号在这声明
  67.      IMPORT  FIQ_Exception                   ;快速中断异常处理程序
  68.      IMPORT  __main                          ;C语言主程序入口 
  69.      IMPORT  TargetResetInit                 ;目标板基本初始化
  70.      IMPORT  SoftwareInterrupt               ;软件中断的处理函数
  71.     
  72.                 AREA    RESET, CODE, READONLY
  73.                 ARM
  74. ; Exception Vectors
  75. ;  Mapped to Address 0.
  76. ;  Absolute addressing mode must be used.
  77. ;  Dummy Handlers are implemented as infinite loops which can be modified.
  78. ;;中断向量表
  79. ;;对于1.未定义指令 2.预取指中止 3.数据中止三种异常不做处理
  80. ;;
  81. Vectors         LDR     PC, Reset_Addr         
  82.                 LDR     PC, Undef_Addr
  83.                 LDR     PC, SWI_Addr
  84.                 LDR     PC, PAbt_Addr
  85.                 LDR     PC, DAbt_Addr
  86.                 NOP                            ; Reserved Vector 
  87. ;               LDR     PC, IRQ_Addr
  88.                 LDR     PC, [PC, #-0x0120]     ; Vector from VicVectAddr
  89.                 LDR     PC, FIQ_Addr
  90. Reset_Addr      DCD     Reset_Handler
  91. Undef_Addr      DCD     Undef_Handler
  92. SWI_Addr        DCD     SoftwareInterrupt
  93. PAbt_Addr       DCD     PAbt_Handler
  94. DAbt_Addr       DCD     DAbt_Handler
  95.                 ;DCD 0xB9206E28             ; Reserved Address 
  96. DCD 0xB9206E50    ;以保证前32字节指令相加和为0
  97. ;IRQ_Addr       DCD     IRQ_Handler
  98. FIQ_Addr        DCD     FIQ_Handler
  99. Undef_Handler   B       Undef_Handler
  100. ;SWI_Handler    B       SWI_Handler
  101. PAbt_Handler    B       PAbt_Handler
  102. DAbt_Handler    B       DAbt_Handler
  103. ;IRQ_Handler    B       IRQ_Handler
  104. FIQ_Handler
  105. STMFD   SP!, {R0-R3, LR}
  106. BL      FIQ_Exception
  107. LDMFD   SP!, {R0-R3, LR}
  108. SUBS    PC,  LR,  #4
  109. ; Reset Handler    
  110.                 EXPORT  Reset_Handler
  111. Reset_Handler   
  112. ; Setup Stack for each mode
  113.                 LDR     R0, =Stack_Top
  114. ;  Enter Undefined Instruction Mode and set its Stack Pointer
  115.                 MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
  116.                 MOV     SP, R0
  117.                 SUB     R0, R0, #UND_Stack_Size
  118. ;  Enter Abort Mode and set its Stack Pointer
  119.                 MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
  120.                 MOV     SP, R0
  121.                 SUB     R0, R0, #ABT_Stack_Size
  122. ;  Enter FIQ Mode and set its Stack Pointer
  123.                 MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
  124.                 MOV     SP, R0
  125.                 SUB     R0, R0, #FIQ_Stack_Size
  126. ;  Enter IRQ Mode and set its Stack Pointer
  127.                 MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
  128.                 MOV     SP, R0
  129.                 SUB     R0, R0, #IRQ_Stack_Size
  130. ;  Enter Supervisor Mode and set its Stack Pointer
  131.                 MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
  132.                 MOV     SP, R0
  133.                 SUB     R0, R0, #SVC_Stack_Size
  134. ;  Enter User Mode and set its Stack Pointer
  135.                 MSR     CPSR_c, #Mode_USR
  136.                 MOV     SP, R0
  137.                 SUB     SL, SP, #USR_Stack_Size
  138. ; IMPORT TargetResetInit
  139. BL TargetResetInit        ;在target.c文件中
  140. ; Enter the C code
  141. ;                IMPORT  __main
  142.                 LDR     R0, =__main
  143.                 BX      R0
  144. ; User Initial Stack & Heap
  145. ;;函数说明参考RV_CC.PDF文件P291
  146. ;;function:  __user_initial_stackheap
  147. ;;description:初始化堆栈(stack)和堆(heap),函数采用双存储器区域。
  148. ;;parameter:r0,sp,r2
  149. ;;return value:r0--堆的基址(heap base in r0)
  150. ;;r1--堆栈基址,堆栈区域的最高地址
  151. ;;r2--堆的限制地址(heap limit in r2)
  152. ;;r3--堆栈限制地址,堆栈区域的最低地址
  153. ;;
  154.                 AREA    |.text|, CODE, READONLY
  155.                 IMPORT  __use_two_region_memory           ;select memory model of two memory region
  156.                 EXPORT  __user_initial_stackheap
  157. __user_initial_stackheap
  158.                 LDR     R0, =  Heap_Mem
  159.                 LDR     R1, =(Stack_Mem + USR_Stack_Size)
  160.                 LDR     R2, = (Heap_Mem +      Heap_Size)
  161.                 LDR     R3, = Stack_Mem
  162.                 BX      LR
  163.                 END