crt0.c
Go to the documentation of this file.
1 /*
2  * Pavel Kirienko, 2014 <pavel.kirienko@gmail.com>
3  * ARM Cortex-M0(+)/M1/M3 startup file.
4  */
5 
6 typedef void (*funptr_t)(void);
7 
8 #define fill32(start, end, filler) { \
9  unsigned *p1 = start; \
10  const unsigned * const p2 = end; \
11  while (p1 < p2) \
12  *p1++ = filler; \
13 }
14 
15 extern const unsigned _etext;
16 
17 extern unsigned _data;
18 extern unsigned _edata;
19 
20 extern unsigned _bss;
21 extern unsigned _ebss;
22 
25 
26 __attribute__((noreturn))
27 extern int main(void);
28 
29 extern void SystemInit(void);
30 
31 #pragma GCC optimize 1
32 
36 void Reset_Handler(void);
37 void Default_Handler(void);
38 void NMI_Handler(void);
39 void HardFault_Handler(void);
40 void SVC_Handler(void);
41 void PendSV_Handler(void);
42 void SysTick_Handler(void);
43 
47 __attribute__((naked, noreturn))
48 void Reset_Handler(void)
49 {
50  // Data section
51  {
52  const unsigned* tp = &_etext;
53  unsigned* dp = &_data;
54  while (dp < &_edata)
55  {
56  *dp++ = *tp++;
57  }
58  }
59 
60  // BSS section
61  fill32(&_bss, &_ebss, 0);
62 
63  SystemInit();
64 
65  // Constructors
66  {
68  while (fpp < &__init_array_end)
69  {
70  (*fpp)();
71  fpp++;
72  }
73  }
74 
75  (void)main();
76 
77  while (1) { }
78 }
79 
84 void Default_Handler(void)
85 {
86  while(1) { }
87 }
88 
89 __attribute__((weak))
90 void NMI_Handler(void)
91 {
92  while(1) { }
93 }
94 
95 __attribute__((weak))
96 void HardFault_Handler(void)
97 {
98  while(1) { }
99 }
100 
101 __attribute__((weak))
102 void SVC_Handler(void)
103 {
104  while(1) { }
105 }
106 
107 __attribute__((weak))
108 void PendSV_Handler(void)
109 {
110  while(1) { }
111 }
112 
113 __attribute__((weak))
114 void SysTick_Handler(void)
115 {
116  while(1) { }
117 }
118 
122 #define ALIAS(f) __attribute__ ((weak, alias (#f)))
123 
124 void CAN_IRQHandler(void) ALIAS(Default_Handler);
125 void SSP1_IRQHandler(void) ALIAS(Default_Handler);
126 void I2C_IRQHandler(void) ALIAS(Default_Handler);
127 void TIMER16_0_IRQHandler(void) ALIAS(Default_Handler);
128 void TIMER16_1_IRQHandler(void) ALIAS(Default_Handler);
129 void TIMER32_0_IRQHandler(void) ALIAS(Default_Handler);
130 void TIMER32_1_IRQHandler(void) ALIAS(Default_Handler);
131 void SSP0_IRQHandler(void) ALIAS(Default_Handler);
132 void UART_IRQHandler(void) ALIAS(Default_Handler);
133 void ADC_IRQHandler(void) ALIAS(Default_Handler);
134 void WDT_IRQHandler(void) ALIAS(Default_Handler);
135 void BOD_IRQHandler(void) ALIAS(Default_Handler);
136 void PIOINT3_IRQHandler(void) ALIAS(Default_Handler);
137 void PIOINT2_IRQHandler(void) ALIAS(Default_Handler);
138 void PIOINT1_IRQHandler(void) ALIAS(Default_Handler);
139 void PIOINT0_IRQHandler(void) ALIAS(Default_Handler);
140 void WAKEUP_IRQHandler(void) ALIAS(Default_Handler);
141 
145 extern void __stack_end(void);
146 
151 __attribute__ ((used, section("vectors")))
152 void (* const VectorTable[64])(void) =
153 {
154  __stack_end, // The initial stack pointer
155  Reset_Handler, // The reset handler
156  NMI_Handler, // The NMI handler
157  HardFault_Handler, // The hard fault handler
158  0, // Reserved
159  0, // Reserved
160  0, // Reserved
161  0, // Reserved
162  0, // Reserved
163  0, // Reserved
164  0, // Reserved
165  SVC_Handler, // SVCall handler
166  0, // Reserved
167  0, // Reserved
168  PendSV_Handler, // The PendSV handler
169  SysTick_Handler, // The SysTick handler
170 
171  WAKEUP_IRQHandler, // PIO0_0 Wakeup
172  WAKEUP_IRQHandler, // PIO0_1 Wakeup
173  WAKEUP_IRQHandler, // PIO0_2 Wakeup
174  WAKEUP_IRQHandler, // PIO0_3 Wakeup
175  WAKEUP_IRQHandler, // PIO0_4 Wakeup
176  WAKEUP_IRQHandler, // PIO0_5 Wakeup
177  WAKEUP_IRQHandler, // PIO0_6 Wakeup
178  WAKEUP_IRQHandler, // PIO0_7 Wakeup
179  WAKEUP_IRQHandler, // PIO0_8 Wakeup
180  WAKEUP_IRQHandler, // PIO0_9 Wakeup
181  WAKEUP_IRQHandler, // PIO0_10 Wakeup
182  WAKEUP_IRQHandler, // PIO0_11 Wakeup
183  WAKEUP_IRQHandler, // PIO1_0 Wakeup
184 
185  CAN_IRQHandler, // C_CAN Interrupt
186  SSP1_IRQHandler, // SPI/SSP1 Interrupt
187  I2C_IRQHandler, // I2C0
188  TIMER16_0_IRQHandler, // CT16B0 (16-bit Timer 0)
189  TIMER16_1_IRQHandler, // CT16B1 (16-bit Timer 1)
190  TIMER32_0_IRQHandler, // CT32B0 (32-bit Timer 0)
191  TIMER32_1_IRQHandler, // CT32B1 (32-bit Timer 1)
192  SSP0_IRQHandler, // SPI/SSP0 Interrupt
193  UART_IRQHandler, // UART0
194 
195  0, // Reserved
196  0, // Reserved
197 
198  ADC_IRQHandler, // ADC (A/D Converter)
199  WDT_IRQHandler, // WDT (Watchdog Timer)
200  BOD_IRQHandler, // BOD (Brownout Detect)
201  0, // Reserved
202  PIOINT3_IRQHandler, // PIO INT3
203  PIOINT2_IRQHandler, // PIO INT2
204  PIOINT1_IRQHandler, // PIO INT1
205  PIOINT0_IRQHandler, // PIO INT0
206 
207  0,
208  0,
209  0,
210  0,
211  0,
212  0,
213  0,
214  0,
215  0,
216  0,
217  0,
218  0,
219  0,
220  0,
221  0,
222  0
223 };
SystemInit
void SystemInit()
Definition: board.cpp:190
main
int main(int argc, char **argv)
Definition: test_main.cpp:24
ALIAS
#define ALIAS(f)
Definition: crt0.c:122
_etext
const unsigned _etext
__init_array_start
funptr_t __init_array_start
funptr_t
void(* funptr_t)(void)
Definition: crt0.c:6
__attribute__
__attribute__((noreturn))
Definition: crt0.c:26
_edata
unsigned _edata
_bss
unsigned _bss
fill32
#define fill32(start, end, filler)
Definition: crt0.c:8
CAN_IRQHandler
void CAN_IRQHandler(void SSP1_IRQHandler() ALIAS(Default_Handler) void)
Definition: crt0.c:124
_data
unsigned _data
__init_array_end
funptr_t __init_array_end
SysTick_Handler
void SysTick_Handler()
Definition: clock.cpp:172
_ebss
unsigned _ebss


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02