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

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.2.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. MAMCR     DEFINE  0xE01FC000    ; MAM Control Register
  37. MAMTIM    DEFINE  0xE01FC004    ; MAM Timing register
  38. ;---------------------------------------------------------------
  39. ; ?RESET
  40. ; Reset Vector.
  41. ; Normally, segment INTVEC is linked at address 0.
  42. ; For debugging purposes, INTVEC may be placed at other
  43. ; addresses.
  44. ; A debugger that honors the entry point will start the
  45. ; program in a normal way even if INTVEC is not at address 0.
  46. ;---------------------------------------------------------------
  47.     MODULE  ?RESET
  48.     COMMON  INTVEC:CODE:NOROOT(2)
  49.     PUBLIC  __program_start
  50.     EXTERN  ?cstartup
  51.     EXTERN  undef_handler, swi_handler, prefetch_handler
  52.     EXTERN  data_handler, irq_handler, fiq_handler
  53.     CODE32  ; Always ARM mode after reset
  54.     org 0x00
  55. __program_start
  56.     ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte
  57. ;   ldr b,?cstartup ; Relative branch allows remap, limited to 32 MByte
  58.                 ; Vectors can be enabled by removing the comments below or by
  59.                 ; using #pragma vector from C code.
  60.     org 0x04
  61. __undef_handler
  62.     ldr pc,[pc,#24] ; Branch to undef_handler
  63.     org 0x08
  64. __swi_handler
  65.     ldr pc,[pc,#24] ; Branch to swi_handler
  66.     org 0x0c
  67. __prefetch_handler
  68.     ldr pc,[pc,#24] ; Branch to prefetch_handler
  69.     org 0x10
  70. __data_handler
  71.     ldr pc,[pc,#24] ; Branch to data_handler
  72.     org 0x18
  73. __irq_handler
  74.     ldr pc,[pc,#24] ; Branch to irq_handler
  75.     org 0x1c
  76. __fiq_handler
  77.    ldr pc,[pc,#24] ; Branch to fiq_handler
  78.     ; Constant table entries (for ldr pc) will be placed at 0x20
  79.                 ; Exception vectors can be specified in C code by #pragma vector or by filling
  80.                 ; in the vectors below. The vector address is the ARM vector number + 0x20.
  81.     org 0x20
  82.                 dc32  ?cstartup
  83.     org 0x24
  84.                 dc32 __undef_handler
  85.     org 0x28
  86.                 dc32 __swi_handler
  87.     org 0x2c
  88.                 dc32 __prefetch_handler
  89.     org 0x30
  90.                 dc32 __data_handler
  91.     org 0x38
  92.                 dc32 irq_handler
  93.     org 0x3c
  94.                 dc32 fiq_handler
  95.     LTORG
  96. ;   ENDMOD  __program_start
  97.                 ENDMOD
  98. ;---------------------------------------------------------------
  99. ; ?CSTARTUP
  100. ;---------------------------------------------------------------
  101.     MODULE  ?CSTARTUP
  102.     RSEG  IRQ_STACK:DATA(2)
  103.     RSEG  ABT_STACK:DATA:NOROOT(2)
  104.     RSEG  UND_STACK:DATA:NOROOT(2)
  105.     RSEG  FIR_STACK:DATA:NOROOT(2)
  106.     RSEG  SVC_STACK:DATA:NOROOT(2)
  107.     RSEG  CSTACK:DATA(2)
  108.     RSEG  ICODE:CODE:NOROOT(2)
  109.     PUBLIC  ?cstartup
  110.     EXTERN  ?main
  111. ; Execution starts here.
  112. ; After a reset, the mode is ARM, Supervisor, interrupts disabled.
  113.     CODE32
  114. ?cstartup
  115. ; Add initialization nedded before setup of stackpointers here
  116. ; LPC2148 Errata
  117. ; Date: August 5, 2005
  118. ; Document Release: Version 1.0
  119. ; Device Affected: LPC2148
  120. ; Incorrect read of data from SRAM after Reset and MAM is not enabled or partially enabled MAM.1
  121. ; Init MAM before acsses to SRAM
  122.                 ldr   r0,=MAMCR
  123.                 ldr   r1,=MAMTIM
  124.                 ldr   r2,=0
  125.                 str   r2,[r0]
  126.                 ldr   r2,=7
  127.                 str   r2,[r1]
  128.                 ldr   r2,=2
  129.                 str   r2,[r0]
  130. ; Initialize the stack pointers.
  131. ; The pattern below can be used for any of the exception stacks:
  132. ; FIQ, IRQ, SVC, ABT, UND, SYS.
  133. ; The USR mode uses the same stack as SYS.
  134. ; The stack segments must be defined in the linker command file,
  135. ; and be declared above.
  136.                 mrs     r0,cpsr                             ; Original PSR value
  137.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  138.                 orr     r0,r0,#IRQ_MODE                     ; Set IRQ mode bits
  139.                 msr     cpsr_c,r0                           ; Change the mode
  140.                 ldr     sp,=SFE(IRQ_STACK) & 0xFFFFFFF8     ; End of IRQ_STACK
  141.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  142.                 orr     r0,r0,#ABT_MODE                     ; Set Abort mode bits
  143.                 msr     cpsr_c,r0                           ; Change the mode
  144.                 ldr     sp,=SFE(ABT_STACK) & 0xFFFFFFF8     ; End of ABT_STACK
  145.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  146.                 orr     r0,r0,#SVC_MODE                     ; Set Supervisor mode bits
  147.                 msr     cpsr_c,r0                           ; Change the mode
  148.                 ldr     sp,=SFE(SVC_STACK) & 0xFFFFFFF8     ; End of SVC_STACK
  149.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  150.                 orr     r0,r0,#UND_MODE                     ; Set Undefined mode bits
  151.                 msr     cpsr_c,r0                           ; Change the mode
  152.                 ldr     sp,=SFE(UND_STACK) & 0xFFFFFFF8     ; End of FIR_STACK
  153.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  154.                 orr     r0,r0,#FIQ_MODE                     ; Set FIR mode bits
  155.                 msr     cpsr_c,r0                           ; Change the mode
  156.                 ldr     sp,=SFE(FIR_STACK) & 0xFFFFFFF8     ; End of FIR_STACK
  157.                 bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
  158.                 orr     r0,r0,#SYS_MODE                     ; Set System mode bits
  159.                 msr     cpsr_c,r0                           ; Change the mode
  160.                 ldr     sp,=SFE(CSTACK) & 0xFFFFFFF8        ; End of CSTACK
  161. #ifdef __ARMVFP__
  162. ; Enable the VFP coprocessor.
  163.                 mov     r0, #0x40000000                 ; Set EN bit in VFP
  164.                 fmxr    fpexc, r0                       ; FPEXC, clear others.
  165. ; Disable underflow exceptions by setting flush to zero mode.
  166. ; For full IEEE 754 underflow compliance this code should be removed
  167. ; and the appropriate exception handler installed.
  168.                 mov     r0, #0x01000000           ; Set FZ bit in VFP
  169.                 fmxr    fpscr, r0                       ; FPSCR, clear others.
  170. #endif
  171. ; Add more initialization here
  172. ; Continue to ?main for more IAR specific system startup
  173.                 ldr     r0,=?main
  174.                 bx      r0
  175.                 LTORG
  176.                 ENDMOD
  177.                 END