]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A9_RZ_R7S72100_IAR_DS-5/IAR/cstartup.s
RZ RVDS and IAR projects.
[freertos] / FreeRTOS / Demo / CORTEX_A9_RZ_R7S72100_IAR_DS-5 / IAR / cstartup.s
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
2 ;;\r
3 ;; Part one of the system initialization code,\r
4 ;; contains low-level\r
5 ;; initialization.\r
6 ;;\r
7 ;; Copyright 2007 IAR Systems. All rights reserved.\r
8 ;;\r
9 ;; $Revision: 49919 $\r
10 ;;\r
11 \r
12         MODULE  ?cstartup\r
13 \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
19 \r
20 ;\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
24 ;\r
25 ; To override the cstartup defined in the library, simply add your\r
26 ; modified version to the workbench project.\r
27 \r
28         SECTION .intvec:CODE:NOROOT(2)\r
29 \r
30         PUBLIC  __vector\r
31         PUBLIC  __iar_program_start\r
32         EXTERN  Undefined_Handler\r
33         EXTERN  SWI_Handler\r
34         EXTERN  Prefetch_Handler\r
35         EXTERN  Abort_Handler\r
36         EXTERN  IRQ_Handler\r
37         EXTERN  FIQ_Handler\r
38                 EXTERN  LowLevelInitialisation\r
39 \r
40         DATA\r
41 \r
42 __iar_init$$done:               ; The vector table is not needed\r
43                                 ; until after copy initialization is done\r
44 \r
45 __vector:                       ; Make this a DATA label, so that stack usage\r
46                                 ; analysis doesn't consider it an uncalled fun\r
47 \r
48         ARM\r
49 \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
58         DCD     0                       ; RESERVED\r
59         LDR     PC,IRQ_Addr             ; IRQ\r
60         LDR     PC,FIQ_Addr             ; FIQ\r
61 \r
62         DATA\r
63 \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
71 \r
72 \r
73 ; --------------------------------------------------\r
74 ; ?cstartup -- low-level system initialization code.\r
75 ;\r
76 ; After a reset execution starts here, the mode is ARM, supervisor\r
77 ; with interrupts disabled.\r
78 ;\r
79 \r
80 \r
81 \r
82         SECTION .text:CODE:NOROOT(2)\r
83 \r
84         EXTERN  __cmain\r
85         REQUIRE __vector\r
86         EXTWEAK __iar_init_core\r
87         EXTWEAK __iar_init_vfp\r
88 \r
89 \r
90         ARM\r
91 \r
92 __iar_program_start:\r
93 ?cstartup:\r
94 \r
95 ;\r
96 ; Add initialization needed before setup of stackpointers here.\r
97 ;\r
98 \r
99 ;\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
106 ;\r
107 \r
108 \r
109 ; --------------------\r
110 ; Mode, correspords to bits 0-5 in CPSR\r
111 \r
112 #define MODE_MSK 0x1F            ; Bit mask for mode bits in CPSR\r
113 \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
121 \r
122 \r
123         MRS     r0, cpsr                ; Original PSR value\r
124 \r
125         ;; Set up the interrupt stack pointer.\r
126 \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
132 \r
133         ;; Set up the fast interrupt stack pointer.\r
134 \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
140 \r
141         ;; Set up the normal SVC pointer.\r
142 ;; FreeRTOS Note:\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
152 \r
153         ;; Turn on core features assumed to be enabled.\r
154           FUNCALL __iar_program_start, __iar_init_core\r
155         BL      __iar_init_core\r
156 \r
157         ;; Initialize VFP (if needed).\r
158           FUNCALL __iar_program_start, __iar_init_vfp\r
159         BL      __iar_init_vfp\r
160 \r
161                 ;; Chip and board specific configuration\r
162                 BL              LowLevelInitialisation\r
163 \r
164 ;;;\r
165 ;;; Add more initialization here\r
166 ;;;\r
167 \r
168 ;;; Continue to __cmain for C-level initialization.\r
169 \r
170           FUNCALL __iar_program_start, __cmain\r
171         B       __cmain\r
172 \r
173         END\r