lpc2xxx_cstartup.s79
上传用户:sourcesun
上传日期:2013-09-23
资源大小:362k
文件大小:7k
源码类别:

DNA

开发平台:

Asm

  1. ;-----------------------------------------------------------------------------
  2. ; This file contains the startup code used by the ICCARM C compiler.
  3. ;
  4. ; The modules in this file are included in the libraries, and may be replaced
  5. ; by any user-defined modules that define the PUBLIC symbol _program_start or
  6. ; a user defined start symbol.
  7. ; To override the cstartup defined in the library, simply add your modified
  8. ; version to the workbench project.
  9. ;
  10. ; All code in the modules (except ?RESET) will be placed in the ICODE segment.
  11. ;
  12. ; $Revision: 1.1 $
  13. ;
  14. ;-----------------------------------------------------------------------------
  15. ;
  16. ; Naming covention of labels in this file:
  17. ;
  18. ;  ?xxx   - External labels only accessed from assembler.
  19. ;  __xxx  - External labels accessed from or defined in C.
  20. ;  xxx   - Labels local to one module (note: this file contains
  21. ;           several modules).
  22. ;  main   - The starting point of the user program.
  23. ;
  24. ;---------------------------------------------------------------
  25. ; Macros and definitions for the whole file
  26. ;---------------------------------------------------------------
  27. ; Mode, correspords to bits 0-5 in CPSR
  28. MODE_BITS DEFINE 0x1F ; Bit mask for mode bits in CPSR
  29. USR_MODE DEFINE 0x10 ; User mode
  30. FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode
  31. IRQ_MODE DEFINE 0x12 ; Interrupt Request mode
  32. SVC_MODE DEFINE 0x13 ; Supervisor mode
  33. ABT_MODE DEFINE 0x17 ; Abort mode
  34. UND_MODE DEFINE 0x1B ; Undefined Instruction mode
  35. SYS_MODE DEFINE 0x1F ; System mode
  36. ;---------------------------------------------------------------
  37. ; ?RESET
  38. ; Reset Vector.
  39. ; Normally, segment INTVEC is linked at address 0.
  40. ; For debugging purposes, INTVEC may be placed at other
  41. ; addresses.
  42. ; A debugger that honors the entry point will start the
  43. ; program in a normal way even if INTVEC is not at address 0.
  44. ;---------------------------------------------------------------
  45. MODULE ?RESET
  46. COMMON INTVEC:CODE:NOROOT(2)
  47. PUBLIC  __program_start
  48. EXTERN ?cstartup
  49. EXTERN undef_handler, swi_handler, prefetch_handler
  50. EXTERN data_handler, irq_handler, fiq_handler
  51.                 CODE32 ; Always ARM mode after reset
  52. org 0x00
  53. __program_start
  54. ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte
  55. ; ldr b,?cstartup ; Relative branch allows remap, limited to 32 MByte
  56.                 ; Vectors can be enabled by removing the comments below or by
  57.                 ; using #pragma vector from C code.
  58. org 0x04
  59. ; ldr pc,[pc,#24] ; Branch to undef_handler
  60. org 0x08
  61. ; ldr pc,[pc,#24] ; Branch to swi_handler
  62. org 0x0c
  63. ; ldr pc,[pc,#24] ; Branch to prefetch_handler
  64. org 0x10
  65. ; ldr pc,[pc,#24] ; Branch to data_handler
  66. org 0x18
  67. ; ldr pc,[pc,#24] ; Branch to irq_handler
  68. org 0x1c
  69. ; ldr pc,[pc,#24] ; Branch to fiq_handler
  70. ; Constant table entries (for ldr pc) will be placed at 0x20
  71.                 ; Exception vectors can be specified in C code by #pragma vector or by filling
  72.                 ; in the vectors below. The vector address is the ARM vector number + 0x20.
  73. org 0x20
  74.                 dc32 ?cstartup
  75. org 0x24
  76. ;                dc32 undef_handler
  77. org 0x28
  78. ;                dc32 swi_handler
  79. org 0x2c
  80. ;                dc32 prefetch_handler
  81. org 0x30
  82. ;                dc32 data_handler
  83. org 0x38
  84. ;                dc32 irq_handler
  85. org 0x3c
  86. ;                dc32 fiq_handler
  87. LTORG
  88. ; ENDMOD __program_start
  89.                 ENDMOD
  90. ;---------------------------------------------------------------
  91. ; ?CSTARTUP
  92. ;---------------------------------------------------------------
  93. MODULE ?CSTARTUP
  94. RSEG IRQ_STACK:DATA(2)
  95. RSEG ABT_STACK:DATA:NOROOT(2)
  96. RSEG UND_STACK:DATA:NOROOT(2)
  97. RSEG FIR_STACK:DATA:NOROOT(2)
  98. RSEG SVC_STACK:DATA:NOROOT(2)
  99. RSEG CSTACK:DATA(2)
  100. RSEG ICODE:CODE:NOROOT(2)
  101. PUBLIC ?cstartup
  102. EXTERN ?main
  103. ; Execution starts here.
  104. ; After a reset, the mode is ARM, Supervisor, interrupts disabled.
  105. CODE32
  106. ?cstartup
  107. ; Add initialization nedded before setup of stackpointers here
  108. ; Initialize the stack pointers.
  109. ; The pattern below can be used for any of the exception stacks:
  110. ; FIQ, IRQ, SVC, ABT, UND, SYS.
  111. ; The USR mode uses the same stack as SYS.
  112. ; The stack segments must be defined in the linker command file,
  113. ; and be declared above.
  114.                 mrs     r0,cpsr                             ; Original PSR value
  115.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  116.                 orr     r0,r0,#IRQ_MODE                     ; Set IRQ mode bits
  117.                 msr     cpsr_c,r0                           ; Change the mode
  118.                 ldr     sp,=SFE(IRQ_STACK) & 0xFFFFFFF8     ; End of IRQ_STACK
  119.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  120.                 orr     r0,r0,#ABT_MODE                     ; Set Abort mode bits
  121.                 msr     cpsr_c,r0                           ; Change the mode
  122.                 ldr     sp,=SFE(ABT_STACK) & 0xFFFFFFF8     ; End of ABT_STACK
  123.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  124.                 orr     r0,r0,#SVC_MODE                     ; Set Supervisor mode bits
  125.                 msr     cpsr_c,r0                           ; Change the mode
  126.                 ldr     sp,=SFE(SVC_STACK) & 0xFFFFFFF8     ; End of SVC_STACK
  127.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  128.                 orr     r0,r0,#UND_MODE                     ; Set Undefined mode bits
  129.                 msr     cpsr_c,r0                           ; Change the mode
  130.                 ldr     sp,=SFE(UND_STACK) & 0xFFFFFFF8     ; End of FIR_STACK
  131.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  132.                 orr     r0,r0,#FIQ_MODE                     ; Set FIR mode bits
  133.                 msr     cpsr_c,r0                           ; Change the mode
  134.                 ldr     sp,=SFE(FIR_STACK) & 0xFFFFFFF8     ; End of FIR_STACK
  135.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  136.                 orr     r0,r0,#SYS_MODE                     ; Set System mode bits
  137.                 msr     cpsr_c,r0                           ; Change the mode
  138.                 ldr     sp,=SFE(CSTACK) & 0xFFFFFFF8        ; End of CSTACK
  139. #ifdef __ARMVFP__
  140. ; Enable the VFP coprocessor.
  141.                 mov     r0, #0x40000000                 ; Set EN bit in VFP
  142.                 fmxr    fpexc, r0                       ; FPEXC, clear others.
  143. ; Disable underflow exceptions by setting flush to zero mode.
  144. ; For full IEEE 754 underflow compliance this code should be removed
  145. ; and the appropriate exception handler installed.
  146.                 mov     r0, #0x01000000         ; Set FZ bit in VFP
  147.                 fmxr    fpscr, r0                       ; FPSCR, clear others.
  148. #endif
  149. ; Add more initialization here
  150. ; Continue to ?main for more IAR specific system startup
  151.                 ldr     r0,=?main
  152.                 bx      r0
  153.                 LTORG
  154.                 ENDMOD
  155.                 END