Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers crt0.c Source File

crt0.c

00001 /*
00002  * Pavel Kirienko, 2014 <pavel.kirienko@gmail.com>
00003  * ARM Cortex-M0(+)/M1/M3 startup file.
00004  */
00005 
00006 typedef void (*funptr_t)(void);
00007 
00008 #define fill32(start, end, filler) {   \
00009     unsigned *p1 = start;              \
00010     const unsigned * const p2 = end;   \
00011     while (p1 < p2)                    \
00012         *p1++ = filler;                \
00013 }
00014 
00015 extern const unsigned _etext;
00016 
00017 extern unsigned _data;
00018 extern unsigned _edata;
00019 
00020 extern unsigned _bss;
00021 extern unsigned _ebss;
00022 
00023 extern funptr_t __init_array_start;
00024 extern funptr_t __init_array_end;
00025 
00026 __attribute__((noreturn))
00027 extern int main(void);
00028 
00029 extern void SystemInit(void);
00030 
00031 #pragma GCC optimize 1
00032 
00033 /**
00034  * Prototypes for the functions below
00035  */
00036 void Reset_Handler(void);
00037 void Default_Handler(void);
00038 void NMI_Handler(void);
00039 void HardFault_Handler(void);
00040 void SVC_Handler(void);
00041 void PendSV_Handler(void);
00042 void SysTick_Handler(void);
00043 
00044 /**
00045  * Firmware entry point
00046  */
00047 __attribute__((naked, noreturn))
00048 void Reset_Handler(void)
00049 {
00050     // Data section
00051     {
00052         const unsigned* tp = &_etext;
00053         unsigned* dp = &_data;
00054         while (dp < &_edata)
00055         {
00056             *dp++ = *tp++;
00057         }
00058     }
00059 
00060     // BSS section
00061     fill32(&_bss, &_ebss, 0);
00062 
00063     SystemInit();
00064 
00065     // Constructors
00066     {
00067         funptr_t* fpp = &__init_array_start;
00068         while (fpp < &__init_array_end)
00069         {
00070             (*fpp)();
00071             fpp++;
00072         }
00073     }
00074 
00075     (void)main();
00076 
00077     while (1) { }
00078 }
00079 
00080 /**
00081  * Default handlers
00082  */
00083 __attribute__((weak))
00084 void Default_Handler(void)
00085 {
00086     while(1) { }
00087 }
00088 
00089 __attribute__((weak))
00090 void NMI_Handler(void)
00091 {
00092     while(1) { }
00093 }
00094 
00095 __attribute__((weak))
00096 void HardFault_Handler(void)
00097 {
00098     while(1) { }
00099 }
00100 
00101 __attribute__((weak))
00102 void SVC_Handler(void)
00103 {
00104     while(1) { }
00105 }
00106 
00107 __attribute__((weak))
00108 void PendSV_Handler(void)
00109 {
00110     while(1) { }
00111 }
00112 
00113 __attribute__((weak))
00114 void SysTick_Handler(void)
00115 {
00116     while(1) { }
00117 }
00118 
00119 /**
00120  * Default vectors for LPC11C24, to be overriden by the firmware as needed
00121  */
00122 #define ALIAS(f) __attribute__ ((weak, alias (#f)))
00123 
00124 void CAN_IRQHandler(void) ALIAS(Default_Handler);
00125 void SSP1_IRQHandler(void) ALIAS(Default_Handler);
00126 void I2C_IRQHandler(void) ALIAS(Default_Handler);
00127 void TIMER16_0_IRQHandler(void) ALIAS(Default_Handler);
00128 void TIMER16_1_IRQHandler(void) ALIAS(Default_Handler);
00129 void TIMER32_0_IRQHandler(void) ALIAS(Default_Handler);
00130 void TIMER32_1_IRQHandler(void) ALIAS(Default_Handler);
00131 void SSP0_IRQHandler(void) ALIAS(Default_Handler);
00132 void UART_IRQHandler(void) ALIAS(Default_Handler);
00133 void ADC_IRQHandler(void) ALIAS(Default_Handler);
00134 void WDT_IRQHandler(void) ALIAS(Default_Handler);
00135 void BOD_IRQHandler(void) ALIAS(Default_Handler);
00136 void PIOINT3_IRQHandler(void) ALIAS(Default_Handler);
00137 void PIOINT2_IRQHandler(void) ALIAS(Default_Handler);
00138 void PIOINT1_IRQHandler(void) ALIAS(Default_Handler);
00139 void PIOINT0_IRQHandler(void) ALIAS(Default_Handler);
00140 void WAKEUP_IRQHandler(void) ALIAS(Default_Handler);
00141 
00142 /**
00143  * Refer to the linker script
00144  */
00145 extern void __stack_end(void);
00146 
00147 /**
00148  * Vector table for LPC11Cxx
00149  * Must be explicitly defined 'used', otherwise LTO optimizer will discard it.
00150  */
00151 __attribute__ ((used, section("vectors")))
00152 void (* const VectorTable[64])(void) =
00153 {
00154     __stack_end,                            // The initial stack pointer
00155     Reset_Handler,                          // The reset handler
00156     NMI_Handler,                            // The NMI handler
00157     HardFault_Handler,                      // The hard fault handler
00158     0,                                      // Reserved
00159     0,                                      // Reserved
00160     0,                                      // Reserved
00161     0,                                      // Reserved
00162     0,                                      // Reserved
00163     0,                                      // Reserved
00164     0,                                      // Reserved
00165     SVC_Handler,                            // SVCall handler
00166     0,                                      // Reserved
00167     0,                                      // Reserved
00168     PendSV_Handler,                         // The PendSV handler
00169     SysTick_Handler,                        // The SysTick handler
00170 
00171     WAKEUP_IRQHandler,                      // PIO0_0  Wakeup
00172     WAKEUP_IRQHandler,                      // PIO0_1  Wakeup
00173     WAKEUP_IRQHandler,                      // PIO0_2  Wakeup
00174     WAKEUP_IRQHandler,                      // PIO0_3  Wakeup
00175     WAKEUP_IRQHandler,                      // PIO0_4  Wakeup
00176     WAKEUP_IRQHandler,                      // PIO0_5  Wakeup
00177     WAKEUP_IRQHandler,                      // PIO0_6  Wakeup
00178     WAKEUP_IRQHandler,                      // PIO0_7  Wakeup
00179     WAKEUP_IRQHandler,                      // PIO0_8  Wakeup
00180     WAKEUP_IRQHandler,                      // PIO0_9  Wakeup
00181     WAKEUP_IRQHandler,                      // PIO0_10 Wakeup
00182     WAKEUP_IRQHandler,                      // PIO0_11 Wakeup
00183     WAKEUP_IRQHandler,                      // PIO1_0  Wakeup
00184 
00185     CAN_IRQHandler,                         // C_CAN Interrupt
00186     SSP1_IRQHandler,                        // SPI/SSP1 Interrupt
00187     I2C_IRQHandler,                         // I2C0
00188     TIMER16_0_IRQHandler,                   // CT16B0 (16-bit Timer 0)
00189     TIMER16_1_IRQHandler,                   // CT16B1 (16-bit Timer 1)
00190     TIMER32_0_IRQHandler,                   // CT32B0 (32-bit Timer 0)
00191     TIMER32_1_IRQHandler,                   // CT32B1 (32-bit Timer 1)
00192     SSP0_IRQHandler,                        // SPI/SSP0 Interrupt
00193     UART_IRQHandler,                        // UART0
00194 
00195     0,                                      // Reserved
00196     0,                                      // Reserved
00197 
00198     ADC_IRQHandler,                         // ADC   (A/D Converter)
00199     WDT_IRQHandler,                         // WDT   (Watchdog Timer)
00200     BOD_IRQHandler,                         // BOD   (Brownout Detect)
00201     0,                                      // Reserved
00202     PIOINT3_IRQHandler,                     // PIO INT3
00203     PIOINT2_IRQHandler,                     // PIO INT2
00204     PIOINT1_IRQHandler,                     // PIO INT1
00205     PIOINT0_IRQHandler,                     // PIO INT0
00206 
00207     0,
00208     0,
00209     0,
00210     0,
00211     0,
00212     0,
00213     0,
00214     0,
00215     0,
00216     0,
00217     0,
00218     0,
00219     0,
00220     0,
00221     0,
00222     0
00223 };