1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
\r
3 ;; Part one of the system initialization code,
\r
4 ;; contains low-level
\r
7 ;; Copyright 2007 IAR Systems. All rights reserved.
\r
9 ;; $Revision: 49919 $
\r
14 ;; Forward declaration of sections.
\r
15 SECTION IRQ_STACK:DATA:NOROOT(3)
\r
16 SECTION FIQ_STACK:DATA:NOROOT(3)
\r
17 SECTION SVC_STACK:DATA:NOROOT(3)
\r
18 SECTION CSTACK:DATA:NOROOT(3)
\r
21 ; The module in this file are included in the libraries, and may be
\r
22 ; replaced by any user-defined modules that define the PUBLIC symbol
\r
23 ; __iar_program_start or a user defined start symbol.
\r
25 ; To override the cstartup defined in the library, simply add your
\r
26 ; modified version to the workbench project.
\r
28 SECTION .intvec:CODE:NOROOT(2)
\r
31 PUBLIC __iar_program_start
\r
32 EXTERN Undefined_Handler
\r
34 EXTERN Prefetch_Handler
\r
35 EXTERN Abort_Handler
\r
38 EXTERN LowLevelInitialisation
\r
42 __iar_init$$done: ; The vector table is not needed
\r
43 ; until after copy initialization is done
\r
45 __vector: ; Make this a DATA label, so that stack usage
\r
46 ; analysis doesn't consider it an uncalled fun
\r
50 ; All default exception handlers (except reset) are
\r
51 ; defined as weak symbol definitions.
\r
52 ; If a handler is defined by the application it will take precedence.
\r
53 LDR PC,Reset_Addr ; Reset
\r
54 LDR PC,Undefined_Addr ; Undefined instructions
\r
55 LDR PC,SWI_Addr ; Software interrupt (SWI/SVC)
\r
56 LDR PC,Prefetch_Addr ; Prefetch abort
\r
57 LDR PC,Abort_Addr ; Data abort
\r
59 LDR PC,IRQ_Addr ; IRQ
\r
60 LDR PC,FIQ_Addr ; FIQ
\r
64 Reset_Addr: DCD __iar_program_start
\r
65 Undefined_Addr: DCD Undefined_Handler
\r
66 SWI_Addr: DCD SWI_Handler
\r
67 Prefetch_Addr: DCD Prefetch_Handler
\r
68 Abort_Addr: DCD Abort_Handler
\r
69 IRQ_Addr: DCD IRQ_Handler
\r
70 FIQ_Addr: DCD FIQ_Handler
\r
73 ; --------------------------------------------------
\r
74 ; ?cstartup -- low-level system initialization code.
\r
76 ; After a reset execution starts here, the mode is ARM, supervisor
\r
77 ; with interrupts disabled.
\r
82 SECTION .text:CODE:NOROOT(2)
\r
86 EXTWEAK __iar_init_core
\r
87 EXTWEAK __iar_init_vfp
\r
92 __iar_program_start:
\r
96 ; Add initialization needed before setup of stackpointers here.
\r
100 ; Initialize the stack pointers.
\r
101 ; The pattern below can be used for any of the exception stacks:
\r
102 ; FIQ, IRQ, SVC, ABT, UND, SYS.
\r
103 ; The USR mode uses the same stack as SYS.
\r
104 ; The stack segments must be defined in the linker command file,
\r
105 ; and be declared above.
\r
109 ; --------------------
\r
110 ; Mode, correspords to bits 0-5 in CPSR
\r
112 #define MODE_MSK 0x1F ; Bit mask for mode bits in CPSR
\r
114 #define USR_MODE 0x10 ; User mode
\r
115 #define FIQ_MODE 0x11 ; Fast Interrupt Request mode
\r
116 #define IRQ_MODE 0x12 ; Interrupt Request mode
\r
117 #define SVC_MODE 0x13 ; Supervisor mode
\r
118 #define ABT_MODE 0x17 ; Abort mode
\r
119 #define UND_MODE 0x1B ; Undefined Instruction mode
\r
120 #define SYS_MODE 0x1F ; System mode
\r
123 MRS r0, cpsr ; Original PSR value
\r
125 ;; Set up the interrupt stack pointer.
\r
127 BIC r0, r0, #MODE_MSK ; Clear the mode bits
\r
128 ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits
\r
129 MSR cpsr_c, r0 ; Change the mode
\r
130 LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK
\r
131 BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
\r
133 ;; Set up the fast interrupt stack pointer.
\r
135 BIC r0, r0, #MODE_MSK ; Clear the mode bits
\r
136 ORR r0, r0, #FIQ_MODE ; Set FIR mode bits
\r
137 MSR cpsr_c, r0 ; Change the mode
\r
138 LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK
\r
139 BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
\r
141 ;; Set up the normal SVC pointer.
\r
143 ;; FreeRTOS does not need a System/User mode stack as only tasks run in
\r
144 ;; System/User mode, and their stack is allocated when the task is created.
\r
145 ;; Therefore the CSTACK allocated in the linker script is instead given to
\r
146 ;; Supervisor mode, and main() is called from Supervisor mode.
\r
147 BIC r0 ,r0, #MODE_MSK ; Clear the mode bits
\r
148 ORR r0 ,r0, #SVC_MODE ; Set System mode bits
\r
149 MSR cpsr_c, r0 ; Change the mode
\r
150 LDR sp, =SFE(CSTACK) ; End of CSTACK
\r
151 BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
\r
153 ;; Turn on core features assumed to be enabled.
\r
154 FUNCALL __iar_program_start, __iar_init_core
\r
157 ;; Initialize VFP (if needed).
\r
158 FUNCALL __iar_program_start, __iar_init_vfp
\r
161 ;; Chip and board specific configuration
\r
162 BL LowLevelInitialisation
\r
165 ;;; Add more initialization here
\r
168 ;;; Continue to __cmain for C-level initialization.
\r
170 FUNCALL __iar_program_start, __cmain
\r