1 /******************************************************************************
\r
2 * author: Freddie Chopin, http://www.freddiechopin.info/
\r
4 * last change: 2012-03-18
\r
6 * chip: ARMv7-M(E) (Cortex-M3 / Cortex-M4)
\r
7 * compiler: arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.6.2
\r
8 * 20110921 (release) [ARM/embedded-4_6-branch revision 182083]
\r
11 * ARMv7-M(E) (Cortex-M3 / Cortex-M4) assembly startup code
\r
12 ******************************************************************************/
\r
15 #define PRIMASK_MASK_EXCEPTIONS_bit 0
\r
16 #define PRIMASK_MASK_EXCEPTIONS (1 << PRIMASK_MASK_EXCEPTIONS_bit)
\r
17 #define FAULTMASK_MASK_EXCEPTIONS_bit 0
\r
18 #define FAULTMASK_MASK_EXCEPTIONS (1 << FAULTMASK_MASK_EXCEPTIONS_bit)
\r
19 #define CONTROL_THREAD_UNPRIVILEGED_bit 0
\r
20 #define CONTROL_ALTERNATE_STACK_bit 1
\r
21 #define CONTROL_THREAD_UNPRIVILEGED (1 << CONTROL_THREAD_UNPRIVILEGED_bit)
\r
22 #define CONTROL_ALTERNATE_STACK (1 << CONTROL_ALTERNATE_STACK_bit)
\r
26 +=============================================================================+
\r
27 | ARMv7-M(E) (Cortex-M3 / Cortex-M4) startup code
\r
28 +=============================================================================+
\r
36 .global Reset_Handler
\r
41 +-----------------------------------------------------------------------------+
\r
42 | Initialize the process stack pointer
\r
43 +-----------------------------------------------------------------------------+
\r
46 ldr r0, =__process_stack_end
\r
50 +-----------------------------------------------------------------------------+
\r
51 | Thread mode uses process stack (PSP) and is privileged
\r
52 +-----------------------------------------------------------------------------+
\r
55 movs r0, #CONTROL_ALTERNATE_STACK
\r
60 +-----------------------------------------------------------------------------+
\r
61 | Branch to low_level_init_0() function (.data and .bss are not initialized!)
\r
62 +-----------------------------------------------------------------------------+
\r
65 ldr r0, =low_level_init_0
\r
69 +-----------------------------------------------------------------------------+
\r
70 | Initialize .data section
\r
71 +-----------------------------------------------------------------------------+
\r
74 ldr r1, =__data_init_start
\r
75 ldr r2, =__data_start
\r
85 +-----------------------------------------------------------------------------+
\r
86 | Zero-init .bss section
\r
87 +-----------------------------------------------------------------------------+
\r
91 ldr r1, =__bss_start
\r
100 +-----------------------------------------------------------------------------+
\r
101 | Call C++ constructors for global and static objects
\r
102 +-----------------------------------------------------------------------------+
\r
105 ldr r0, =__libc_init_array
\r
110 +-----------------------------------------------------------------------------+
\r
111 | Branch to low_level_init_1() function
\r
112 +-----------------------------------------------------------------------------+
\r
115 ldr r0, =low_level_init_1
\r
119 +-----------------------------------------------------------------------------+
\r
120 | Branch to main() with link
\r
121 +-----------------------------------------------------------------------------+
\r
128 +-----------------------------------------------------------------------------+
\r
129 | Call C++ destructors for global and static objects
\r
130 +-----------------------------------------------------------------------------+
\r
133 ldr r0, =__libc_fini_array
\r
138 +-----------------------------------------------------------------------------+
\r
139 | On return - loop till the end of the world
\r
140 +-----------------------------------------------------------------------------+
\r
146 +=============================================================================+
\r
147 | __default_low_level_init() - replacement for undefined low_level_init_0()
\r
148 | and/or low_level_init_1(). This function just returns.
\r
149 +=============================================================================+
\r
157 .global __default_low_level_init
\r
159 __default_low_level_init:
\r
163 +=============================================================================+
\r
164 | assign undefined low_level_init_0() and/or low_level_init_1() to
\r
165 | __default_low_level_init()
\r
166 +=============================================================================+
\r
169 .weak low_level_init_0
\r
170 .global low_level_init_0
\r
171 .set low_level_init_0, __default_low_level_init
\r
173 .weak low_level_init_1
\r
174 .global low_level_init_1
\r
175 .set low_level_init_1, __default_low_level_init
\r
177 /******************************************************************************
\r
179 ******************************************************************************/
\r