]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup.s79
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / ARM7_AT91SAM7X256_Eclipse / RTOSDemo / SrcAtmel / Cstartup.s79
1 ;------------------------------------------------------------------------------\r
2 ;-         ATMEL Microcontroller Software Support  -  ROUSSET  -\r
3 ;------------------------------------------------------------------------------\r
4 ; The software is delivered "AS IS" without warranty or condition of any\r
5 ; kind, either express, implied or statutory. This includes without\r
6 ; limitation any warranty or condition with respect to merchantability or\r
7 ; fitness for any particular purpose, or against the infringements of\r
8 ; intellectual property rights of others.\r
9 ;-----------------------------------------------------------------------------\r
10 ;- File source          : Cstartup.s79\r
11 ;- Object               : Generic CStartup for IAR No Use REMAP\r
12 ;- Compilation flag     : None\r
13 ;-\r
14 ;- 1.0 15/Jun/04 JPP    : Creation\r
15 ;------------------------------------------------------------------------------\r
16 \r
17 #include "AT91SAM7X256_inc.h"\r
18 \r
19 ;------------------------------------------------------------------------------\r
20 ;- Area Definition\r
21 ;------------------------------------------------------------------------------\r
22 \r
23 ;---------------------------------------------------------------\r
24 ; ?RESET\r
25 ; Reset Vector.\r
26 ; Normally, segment INTVEC is linked at address 0.\r
27 ; For debugging purposes, INTVEC may be placed at other\r
28 ; addresses.\r
29 ; A debugger that honors the entry point will start the\r
30 ; program in a normal way even if INTVEC is not at address 0.\r
31 ;-------------------------------------------------------------\r
32 \r
33                 PROGRAM ?RESET\r
34                 RSEG    INTRAMSTART_REMAP\r
35                 RSEG    INTRAMEND_REMAP\r
36 \r
37                 EXTERN  vPortYieldProcessor\r
38 \r
39                 RSEG    ICODE:CODE:ROOT(2)\r
40                 CODE32  ; Always ARM mode after reset   \r
41                 org     0       \r
42 reset           \r
43 ;------------------------------------------------------------------------------\r
44 ;- Exception vectors\r
45 ;--------------------\r
46 ;- These vectors can be read at address 0 or at RAM address\r
47 ;- They ABSOLUTELY requires to be in relative addresssing mode in order to\r
48 ;- guarantee a valid jump. For the moment, all are just looping.\r
49 ;- If an exception occurs before remap, this would result in an infinite loop.\r
50 ;- To ensure if a exeption occurs before start application to infinite loop.\r
51 ;------------------------------------------------------------------------------\r
52 \r
53                 B           InitReset           ; 0x00 Reset handler\r
54 undefvec:\r
55                 B           undefvec            ; 0x04 Undefined Instruction\r
56 swivec:\r
57                 B           vPortYieldProcessor ; 0x08 Software Interrupt\r
58 pabtvec:\r
59                 B           pabtvec             ; 0x0C Prefetch Abort\r
60 dabtvec:\r
61                 B           dabtvec             ; 0x10 Data Abort\r
62 rsvdvec:\r
63                 B           rsvdvec             ; 0x14 reserved\r
64 irqvec:\r
65                                 LDR                     PC, [PC, #-0xF20]       ; Jump directly to the address given by the AIC\r
66 \r
67 fiqvec:                                                                 ; 0x1c FIQ\r
68 \r
69 ;------------------------------------------------------------------------------\r
70 ;- Function             : FIQ_Handler_Entry\r
71 ;- Treatments           : FIQ Controller Interrupt Handler.\r
72 ;- Called Functions     : AIC_FVR[interrupt]\r
73 ;------------------------------------------------------------------------------\r
74 \r
75 FIQ_Handler_Entry:\r
76 \r
77 ;- Switch in SVC/User Mode to allow User Stack access for C code\r
78 ; because the FIQ is not yet acknowledged\r
79 \r
80 ;- Save and r0 in FIQ_Register\r
81             mov         r9,r0\r
82                     ldr         r0 , [r8, #AIC_FVR]\r
83             msr         CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC\r
84 \r
85 ;- Save scratch/used registers and LR in User Stack\r
86             stmfd       sp!, { r1-r3, r12, lr}\r
87 \r
88 ;- Branch to the routine pointed by the AIC_FVR\r
89             mov         r14, pc\r
90             bx          r0\r
91 \r
92 ;- Restore scratch/used registers and LR from User Stack\r
93             ldmia       sp!, { r1-r3, r12, lr}\r
94 \r
95 ;- Leave Interrupts disabled \ 4and switch back in FIQ mode\r
96             msr         CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ\r
97 \r
98 ;- Restore the R0 ARM_MODE_SVC register\r
99             mov         r0,r9\r
100 \r
101 ;- Restore the Program Counter using the LR_fiq directly in the PC\r
102             subs        pc,lr,#4\r
103 \r
104 InitReset:\r
105 ;------------------------------------------------------------------------------\r
106 ;- Low level Init (PMC, AIC, ? ....) by C function AT91F_LowLevelInit\r
107 ;------------------------------------------------------------------------------\r
108                 EXTERN   AT91F_LowLevelInit\r
109 \r
110 #define  __iramend      SFB(INTRAMEND_REMAP)\r
111 \r
112 ;- minumum C initialization\r
113 ;- call  AT91F_LowLevelInit( void)\r
114 \r
115             ldr     r13,=__iramend            ; temporary stack in internal RAM\r
116 ;--Call Low level init function in ABSOLUTE through the Interworking\r
117                     ldr     r0,=AT91F_LowLevelInit\r
118             mov     lr, pc\r
119                     bx      r0\r
120 ;------------------------------------------------------------------------------\r
121 ;- Stack Sizes Definition\r
122 ;------------------------\r
123 ;- Interrupt Stack requires 2 words x 8 priority level x 4 bytes when using\r
124 ;- the vectoring. This assume that the IRQ management.\r
125 ;- The Interrupt Stack must be adjusted depending on the interrupt handlers.\r
126 ;- Fast Interrupt not requires stack If in your application it required you must\r
127 ;- be definehere.\r
128 ;- The System stack size is not defined and is limited by the free internal\r
129 ;- SRAM.\r
130 ;------------------------------------------------------------------------------\r
131 \r
132 ;------------------------------------------------------------------------------\r
133 ;- Top of Stack Definition\r
134 ;-------------------------\r
135 ;- Interrupt and Supervisor Stack are located at the top of internal memory in\r
136 ;- order to speed the exception handling context saving and restoring.\r
137 ;- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory.\r
138 ;------------------------------------------------------------------------------\r
139 \r
140 IRQ_STACK_SIZE          EQU     300\r
141 \r
142 ARM_MODE_FIQ            EQU     0x11\r
143 ARM_MODE_IRQ            EQU     0x12\r
144 ARM_MODE_SVC            EQU     0x13\r
145 \r
146 I_BIT                   EQU     0x80\r
147 F_BIT                   EQU     0x40\r
148 \r
149 ;------------------------------------------------------------------------------\r
150 ;- Setup the stack for each mode\r
151 ;-------------------------------\r
152                 ldr     r0, =__iramend\r
153 \r
154 ;- Set up Fast Interrupt Mode and set FIQ Mode Stack\r
155                 msr     CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT\r
156 ;- Init the FIQ register\r
157                 ldr     r8, =AT91C_BASE_AIC\r
158 \r
159 ;- Set up Interrupt Mode and set IRQ Mode Stack\r
160                 msr     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT\r
161                 mov     r13, r0                     ; Init stack IRQ\r
162                 sub     r0, r0, #IRQ_STACK_SIZE\r
163 \r
164 ;- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack\r
165                 msr     CPSR_c, #ARM_MODE_SVC\r
166                 mov     r13, r0\r
167 \r
168 \r
169 ;---------------------------------------------------------------\r
170 ; ?CSTARTUP\r
171 ;---------------------------------------------------------------\r
172                 EXTERN  __segment_init\r
173                 EXTERN  main\r
174 ; Initialize segments.\r
175 ; __segment_init is assumed to use\r
176 ; instruction set and to be reachable by BL from the ICODE segment\r
177 ; (it is safest to link them in segment ICODE).\r
178                 ldr     r0,=__segment_init\r
179                 mov     lr, pc\r
180                 bx      r0\r
181 \r
182                 PUBLIC  __main\r
183 ?jump_to_main:\r
184                 ldr     lr,=?call_exit\r
185                 ldr     r0,=main\r
186 __main:\r
187                 bx      r0\r
188 \r
189 ;------------------------------------------------------------------------------\r
190 ;- Loop for ever\r
191 ;---------------\r
192 ;- End of application. Normally, never occur.\r
193 ;- Could jump on Software Reset ( B 0x0 ).\r
194 ;------------------------------------------------------------------------------\r
195 ?call_exit:\r
196 End\r
197             b       End\r
198 \r
199 \r
200 \r
201 ;---------------------------------------------------------------\r
202 ; ?EXEPTION_VECTOR\r
203 ; This module is only linked if needed for closing files.\r
204 ;---------------------------------------------------------------\r
205                 PUBLIC  AT91F_Default_FIQ_handler\r
206                 PUBLIC  AT91F_Default_IRQ_handler\r
207                 PUBLIC  AT91F_Spurious_handler\r
208 \r
209                 CODE32  ; Always ARM mode after exeption        \r
210 \r
211 AT91F_Default_FIQ_handler\r
212             b     AT91F_Default_FIQ_handler\r
213 \r
214 AT91F_Default_IRQ_handler\r
215             b     AT91F_Default_IRQ_handler\r
216 \r
217 AT91F_Spurious_handler\r
218             b     AT91F_Spurious_handler\r
219 \r
220         ENDMOD\r
221 \r
222         END\r
223 \r