embkernel
 All Classes Functions Variables Typedefs Groups Pages
RtosStartup.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "RtosInterrupt.hpp"
7 #include <stdint.h>
8 
9 extern "C" void entryPoint(void);
10 extern "C" void __libc_init_array(void);
11 extern int main(void);
12 
13 #ifndef RTOS_CFG_MAIN_STACK_SIZE
14 #define RTOS_CFG_MAIN_STACK_SIZE 128
15 #endif
16 volatile static unsigned long mainStack[RTOS_CFG_MAIN_STACK_SIZE] __attribute__ ((section(".stack")));
17 
18 __attribute__ ((section(".isr_vector"), used)) uint32_t vectorsTable[] = {
19  //CM3 default handlers
20  ((uint32_t) mainStack) + sizeof(mainStack), // 00: The initial stack pointer
21  (uint32_t) entryPoint, //
22  (uint32_t) RtosInterrupt::IRQ_NonMaskableInt, //
23  (uint32_t) RtosInterrupt::IRQ_HardFault, //
24  (uint32_t) RtosInterrupt::IRQ_MemoryManagement, //
25  (uint32_t) RtosInterrupt::IRQ_BusFault, //
26  (uint32_t) RtosInterrupt::IRQ_UsageFault, //
27  (uint32_t) 0, // 07: Reserved
28  (uint32_t) 0, // 08: Reserved
29  (uint32_t) 0, // 09: Reserved
30  (uint32_t) 0, // 10: Reserved
31  (uint32_t) RtosInterrupt::IRQ_SVCall, //
32  (uint32_t) RtosInterrupt::IRQ_DebugMonitor, //
33  (uint32_t) 0, // 13: Reserved
34  (uint32_t) RtosInterrupt::IRQ_PendSV, //
35  (uint32_t) RtosInterrupt::IRQ_SysTick, //
36 
38  (uint32_t) RtosInterrupt::IRQ_WWDG, //Window WatchDog Interrupt
39  (uint32_t) RtosInterrupt::IRQ_PVD, //PVD through EXTI Line detection Interrupt
40  (uint32_t) RtosInterrupt::IRQ_TAMP_STAMP, //Tamper and TimeStamp interrupts through the EXTI line
41  (uint32_t) RtosInterrupt::IRQ_RTC_WKUP, //RTC Wakeup interrupt through the EXTI line
42  (uint32_t) RtosInterrupt::IRQ_FLASH, //FLASH global Interrupt
43  (uint32_t) RtosInterrupt::IRQ_RCC, //RCC global Interrupt
44  (uint32_t) RtosInterrupt::IRQ_EXTI0, //EXTI Line0 Interrupt
45  (uint32_t) RtosInterrupt::IRQ_EXTI1, //EXTI Line1 Interrupt
46  (uint32_t) RtosInterrupt::IRQ_EXTI2, //EXTI Line2 Interrupt
47  (uint32_t) RtosInterrupt::IRQ_EXTI3, //EXTI Line3 Interrupt
48  (uint32_t) RtosInterrupt::IRQ_EXTI4, //EXTI Line4 Interrupt
49  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream0, //DMA1 Stream 0 global Interrupt
50  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream1, //DMA1 Stream 1 global Interrupt
51  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream2, //DMA1 Stream 2 global Interrupt
52  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream3, //DMA1 Stream 3 global Interrupt
53  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream4, //DMA1 Stream 4 global Interrupt
54  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream5, //DMA1 Stream 5 global Interrupt
55  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream6, //DMA1 Stream 6 global Interrupt
56  (uint32_t) RtosInterrupt::IRQ_ADC, //ADC1, ADC2 and ADC3 global Interrupts
57  (uint32_t) RtosInterrupt::IRQ_CAN1_TX, //CAN1 TX Interrupt
58  (uint32_t) RtosInterrupt::IRQ_CAN1_RX0, //CAN1 RX0 Interrupt
59  (uint32_t) RtosInterrupt::IRQ_CAN1_RX1, //CAN1 RX1 Interrupt
60  (uint32_t) RtosInterrupt::IRQ_CAN1_SCE, //CAN1 SCE Interrupt
61  (uint32_t) RtosInterrupt::IRQ_EXTI9_5, //External Line[9:5] Interrupts
62  (uint32_t) RtosInterrupt::IRQ_TIM1_BRK_TIM9, //TIM1 Break interrupt and TIM9 global interrupt
63  (uint32_t) RtosInterrupt::IRQ_TIM1_UP_TIM10, //TIM1 Update Interrupt and TIM10 global interrupt
64  (uint32_t) RtosInterrupt::IRQ_TIM1_TRG_COM_TIM11, //TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt
65  (uint32_t) RtosInterrupt::IRQ_TIM1_CC, //TIM1 Capture Compare Interrupt
66  (uint32_t) RtosInterrupt::IRQ_TIM2, //TIM2 global Interrupt
67  (uint32_t) RtosInterrupt::IRQ_TIM3, //TIM3 global Interrupt
68  (uint32_t) RtosInterrupt::IRQ_TIM4, //TIM4 global Interrupt
69  (uint32_t) RtosInterrupt::IRQ_I2C1_EV, //I2C1 Event Interrupt
70  (uint32_t) RtosInterrupt::IRQ_I2C1_ER, //I2C1 Error Interrupt
71  (uint32_t) RtosInterrupt::IRQ_I2C2_EV, //I2C2 Event Interrupt
72  (uint32_t) RtosInterrupt::IRQ_I2C2_ER, //I2C2 Error Interrupt
73  (uint32_t) RtosInterrupt::IRQ_SPI1, //SPI1 global Interrupt
74  (uint32_t) RtosInterrupt::IRQ_SPI2, //SPI2 global Interrupt
75  (uint32_t) RtosInterrupt::IRQ_USART1, //USART1 global Interrupt
76  (uint32_t) RtosInterrupt::IRQ_USART2, //USART2 global Interrupt
77  (uint32_t) RtosInterrupt::IRQ_USART3, //USART3 global Interrupt
78  (uint32_t) RtosInterrupt::IRQ_EXTI15_10, //External Line[15:10] Interrupts
79  (uint32_t) RtosInterrupt::IRQ_RTC_Alarm, //RTC Alarm (A and B) through EXTI Line Interrupt
80  (uint32_t) RtosInterrupt::IRQ_OTG_FS_WKUP, //USB OTG FS Wakeup through EXTI line interrupt
81  (uint32_t) RtosInterrupt::IRQ_TIM8_BRK_TIM12, //TIM8 Break Interrupt and TIM12 global interrupt
82  (uint32_t) RtosInterrupt::IRQ_TIM8_UP_TIM13, //TIM8 Update Interrupt and TIM13 global interrupt
83  (uint32_t) RtosInterrupt::IRQ_TIM8_TRG_COM_TIM14, //TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt
84  (uint32_t) RtosInterrupt::IRQ_TIM8_CC, //TIM8 Capture Compare Interrupt
85  (uint32_t) RtosInterrupt::IRQ_DMA1_Stream7, //DMA1 Stream7 Interrupt
86  (uint32_t) RtosInterrupt::IRQ_FSMC, //FSMC global Interrupt
87  (uint32_t) RtosInterrupt::IRQ_SDIO, //SDIO global Interrupt
88  (uint32_t) RtosInterrupt::IRQ_TIM5, //TIM5 global Interrupt
89  (uint32_t) RtosInterrupt::IRQ_SPI3, //SPI3 global Interrupt
90  (uint32_t) RtosInterrupt::IRQ_UART4, //UART4 global Interrupt
91  (uint32_t) RtosInterrupt::IRQ_UART5, //UART5 global Interrupt
92  (uint32_t) RtosInterrupt::IRQ_TIM6_DAC, //TIM6 global and DAC1&2 underrun error interrupts
93  (uint32_t) RtosInterrupt::IRQ_TIM7, //TIM7 global interrupt
94  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream0, //DMA2 Stream 0 global Interrupt
95  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream1, //DMA2 Stream 1 global Interrupt
96  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream2, //DMA2 Stream 2 global Interrupt
97  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream3, //DMA2 Stream 3 global Interrupt
98  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream4, //DMA2 Stream 4 global Interrupt
99  (uint32_t) RtosInterrupt::IRQ_ETH, //Ethernet global Interrupt
100  (uint32_t) RtosInterrupt::IRQ_ETH_WKUP, //Ethernet Wakeup through EXTI line Interrupt
101  (uint32_t) RtosInterrupt::IRQ_CAN2_TX, //CAN2 TX Interrupt
102  (uint32_t) RtosInterrupt::IRQ_CAN2_RX0, //CAN2 RX0 Interrupt
103  (uint32_t) RtosInterrupt::IRQ_CAN2_RX1, //CAN2 RX1 Interrupt
104  (uint32_t) RtosInterrupt::IRQ_CAN2_SCE, //CAN2 SCE Interrupt
105  (uint32_t) RtosInterrupt::IRQ_OTG_FS, //USB OTG FS global Interrupt
106  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream5, //DMA2 Stream 5 global interrupt
107  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream6, //DMA2 Stream 6 global interrupt
108  (uint32_t) RtosInterrupt::IRQ_DMA2_Stream7, //DMA2 Stream 7 global interrupt
109  (uint32_t) RtosInterrupt::IRQ_USART6, //USART6 global interrupt
110  (uint32_t) RtosInterrupt::IRQ_I2C3_EV, //I2C3 event interrupt
111  (uint32_t) RtosInterrupt::IRQ_I2C3_ER, //I2C3 error interrupt
112  (uint32_t) RtosInterrupt::IRQ_OTG_HS_EP1_OUT, //USB OTG HS End Point 1 Out global interrupt
113  (uint32_t) RtosInterrupt::IRQ_OTG_HS_EP1_IN, //USB OTG HS End Point 1 In global interrupt
114  (uint32_t) RtosInterrupt::IRQ_OTG_HS_WKUP, //USB OTG HS Wakeup through EXTI interrupt
115  (uint32_t) RtosInterrupt::IRQ_OTG_HS, //USB OTG HS global interrupt
116  (uint32_t) RtosInterrupt::IRQ_DCMI, //DCMI global interrupt
117  (uint32_t) RtosInterrupt::IRQ_CRYP, //CRYP crypto global interrupt
118  (uint32_t) RtosInterrupt::IRQ_HASH_RNG, //Hash and Rng global interrupt
119  (uint32_t) RtosInterrupt::IRQ_FPU //FPU global interrupt
120  };
121 
122 extern unsigned long _flash_data;
123 extern unsigned long _data;
124 extern unsigned long _edata;
125 extern unsigned long _bss;
126 extern unsigned long _ebss;
127 
128 __attribute__ ((naked,used)) void entryPoint(void) {
129 
130  //To remove warnings
131  (void) _flash_data;
132  (void) _data;
133  (void) _edata;
134  (void) _bss;
135  (void) _ebss;
136 
137  // Copy the data segment initializers from flash to SRAM.
138  __asm(
139  " .thumb_func \n"
140  " ldr r0, =_flash_data \n"
141  " ldr r1, =_data \n"
142  " ldr r2, =_edata \n"
143  "loopData: \n"
144  " cmp r1, r2 \n"
145  " it eq \n"
146  " beq end \n"
147  " ldr r3, [r0], #4 \n"
148  " str r3, [r1], #4 \n"
149  " blt loopData \n"
150  "end: \n"
151  :::"r0","r1","r2","r3");
152 
153  // Zero fill the bss segment
154  __asm(
155  " .thumb_func \n"
156  " ldr r0, =_bss \n"
157  " ldr r1, =_ebss \n"
158  " mov r2, #0 \n"
159  "loopBss: \n"
160  " cmp r0, r1 \n"
161  " it lt \n"
162  " strlt r2, [r0], #4 \n"
163  " blt loopBss \n"
164  :::"r0","r1","r2");
165 
166  // Restore stack pointer
167  __asm(
168  " .thumb_func \n"
169  " ldr r13, =vectorsTable \n"
170  " ldr r13, [r13] \n"
171  :::);
172 
173  //Call the global objets constructors
174  __libc_init_array();
175 
176  // Call the application's entry point.
177  main();
178 }