mbed library sources
Dependents: frdm_kl05z_gpio_test
Fork of mbed-src by
targets/cmsis/TARGET_NXP/TARGET_LPC408X/TOOLCHAIN_GCC_CR/startup_lpc407x_8x.cpp@67:78dfdb5b4d9e, 2013-12-24 (annotated)
- Committer:
- mbed_official
- Date:
- Tue Dec 24 21:15:05 2013 +0000
- Revision:
- 67:78dfdb5b4d9e
- Parent:
- 15:4892fe388435
Synchronized with git revision 82aa7b7f2b67dfdef90373b703bb8b2f33ea4e57
Full URL: https://github.com/mbedmicro/mbed/commit/82aa7b7f2b67dfdef90373b703bb8b2f33ea4e57/
1. Provide the required __end__ symbol
2. Call software_init_hook() if present, which in turn starts the RTOS
The fix was applied for all targets with a TOOLCHAIN_GCC_CR folder,
but it only works with LPC1768 and LPC4088 because of incomplete or
missing support for GCC_CR and/or the RTOS for the other targets.
Tested by running RTOS_1, RTOS_2 and RTOS_3 with LPC1768 and LPC4088.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bogdanm | 15:4892fe388435 | 1 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 2 | // +--+ |
bogdanm | 15:4892fe388435 | 3 | // | ++----+ |
bogdanm | 15:4892fe388435 | 4 | // +-++ | |
bogdanm | 15:4892fe388435 | 5 | // | | |
bogdanm | 15:4892fe388435 | 6 | // +-+--+ | |
bogdanm | 15:4892fe388435 | 7 | // | +--+--+ |
bogdanm | 15:4892fe388435 | 8 | // +----+ Copyright (c) 2012 Code Red Technologies Ltd. |
bogdanm | 15:4892fe388435 | 9 | // |
bogdanm | 15:4892fe388435 | 10 | // LPC407x_8x Microcontroller Startup code for use with Red Suite |
bogdanm | 15:4892fe388435 | 11 | // |
bogdanm | 15:4892fe388435 | 12 | // Version : 120624 |
bogdanm | 15:4892fe388435 | 13 | // |
bogdanm | 15:4892fe388435 | 14 | // Software License Agreement |
bogdanm | 15:4892fe388435 | 15 | // |
bogdanm | 15:4892fe388435 | 16 | // The software is owned by Code Red Technologies and/or its suppliers, and is |
bogdanm | 15:4892fe388435 | 17 | // protected under applicable copyright laws. All rights are reserved. Any |
bogdanm | 15:4892fe388435 | 18 | // use in violation of the foregoing restrictions may subject the user to criminal |
bogdanm | 15:4892fe388435 | 19 | // sanctions under applicable laws, as well as to civil liability for the breach |
bogdanm | 15:4892fe388435 | 20 | // of the terms and conditions of this license. |
bogdanm | 15:4892fe388435 | 21 | // |
bogdanm | 15:4892fe388435 | 22 | // THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED |
bogdanm | 15:4892fe388435 | 23 | // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF |
bogdanm | 15:4892fe388435 | 24 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. |
bogdanm | 15:4892fe388435 | 25 | // USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT |
bogdanm | 15:4892fe388435 | 26 | // TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH |
bogdanm | 15:4892fe388435 | 27 | // CODE RED TECHNOLOGIES LTD. |
bogdanm | 15:4892fe388435 | 28 | // |
bogdanm | 15:4892fe388435 | 29 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 30 | #if defined (__cplusplus) |
bogdanm | 15:4892fe388435 | 31 | #ifdef __REDLIB__ |
bogdanm | 15:4892fe388435 | 32 | #error Redlib does not support C++ |
bogdanm | 15:4892fe388435 | 33 | #else |
bogdanm | 15:4892fe388435 | 34 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 35 | // |
bogdanm | 15:4892fe388435 | 36 | // The entry point for the C++ library startup |
bogdanm | 15:4892fe388435 | 37 | // |
bogdanm | 15:4892fe388435 | 38 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 39 | extern "C" { |
bogdanm | 15:4892fe388435 | 40 | extern void __libc_init_array(void); |
bogdanm | 15:4892fe388435 | 41 | } |
bogdanm | 15:4892fe388435 | 42 | #endif |
bogdanm | 15:4892fe388435 | 43 | #endif |
bogdanm | 15:4892fe388435 | 44 | |
bogdanm | 15:4892fe388435 | 45 | #define WEAK __attribute__ ((weak)) |
bogdanm | 15:4892fe388435 | 46 | #define ALIAS(f) __attribute__ ((weak, alias (#f))) |
bogdanm | 15:4892fe388435 | 47 | |
bogdanm | 15:4892fe388435 | 48 | //#if defined (__USE_CMSIS) |
bogdanm | 15:4892fe388435 | 49 | #include "LPC407x_8x_177x_8x.h" |
bogdanm | 15:4892fe388435 | 50 | //#endif |
bogdanm | 15:4892fe388435 | 51 | |
bogdanm | 15:4892fe388435 | 52 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 53 | #if defined (__cplusplus) |
bogdanm | 15:4892fe388435 | 54 | extern "C" { |
bogdanm | 15:4892fe388435 | 55 | #endif |
bogdanm | 15:4892fe388435 | 56 | |
bogdanm | 15:4892fe388435 | 57 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 58 | // |
bogdanm | 15:4892fe388435 | 59 | // Forward declaration of the default handlers. These are aliased. |
bogdanm | 15:4892fe388435 | 60 | // When the application defines a handler (with the same name), this will |
bogdanm | 15:4892fe388435 | 61 | // automatically take precedence over these weak definitions |
bogdanm | 15:4892fe388435 | 62 | // |
bogdanm | 15:4892fe388435 | 63 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 64 | void ResetISR(void); |
bogdanm | 15:4892fe388435 | 65 | WEAK void NMI_Handler(void); |
bogdanm | 15:4892fe388435 | 66 | WEAK void HardFault_Handler(void); |
bogdanm | 15:4892fe388435 | 67 | WEAK void MemManage_Handler(void); |
bogdanm | 15:4892fe388435 | 68 | WEAK void BusFault_Handler(void); |
bogdanm | 15:4892fe388435 | 69 | WEAK void UsageFault_Handler(void); |
bogdanm | 15:4892fe388435 | 70 | WEAK void SVC_Handler(void); |
bogdanm | 15:4892fe388435 | 71 | WEAK void DebugMon_Handler(void); |
bogdanm | 15:4892fe388435 | 72 | WEAK void PendSV_Handler(void); |
bogdanm | 15:4892fe388435 | 73 | WEAK void SysTick_Handler(void); |
bogdanm | 15:4892fe388435 | 74 | WEAK void IntDefaultHandler(void); |
bogdanm | 15:4892fe388435 | 75 | |
bogdanm | 15:4892fe388435 | 76 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 77 | // |
bogdanm | 15:4892fe388435 | 78 | // Forward declaration of the specific IRQ handlers. These are aliased |
bogdanm | 15:4892fe388435 | 79 | // to the IntDefaultHandler, which is a 'forever' loop. When the application |
bogdanm | 15:4892fe388435 | 80 | // defines a handler (with the same name), this will automatically take |
bogdanm | 15:4892fe388435 | 81 | // precedence over these weak definitions |
bogdanm | 15:4892fe388435 | 82 | // |
bogdanm | 15:4892fe388435 | 83 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 84 | void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 85 | void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 86 | void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 87 | void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 88 | void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 89 | void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 90 | void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 91 | void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 92 | void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 93 | void PWM1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 94 | void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 95 | void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 96 | void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 97 | void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 98 | void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 99 | void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 100 | void PLL0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 101 | void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 102 | void EINT0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 103 | void EINT1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 104 | void EINT2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 105 | void EINT3_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 106 | void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 107 | void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 108 | void USB_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 109 | void CAN_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 110 | void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 111 | void I2S_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 112 | void ENET_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 113 | void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 114 | void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 115 | void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 116 | void PLL1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 117 | void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 118 | void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 119 | void MCI_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 120 | void UART4_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 121 | void SSP2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 122 | void LCD_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 123 | void GPIO_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 124 | void PWM0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 125 | void EEPROM_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 15:4892fe388435 | 126 | |
bogdanm | 15:4892fe388435 | 127 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 128 | // |
bogdanm | 15:4892fe388435 | 129 | // The entry point for the application. |
bogdanm | 15:4892fe388435 | 130 | // __main() is the entry point for Redlib based applications |
bogdanm | 15:4892fe388435 | 131 | // main() is the entry point for Newlib based applications |
bogdanm | 15:4892fe388435 | 132 | // |
bogdanm | 15:4892fe388435 | 133 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 134 | #if defined (__REDLIB__) |
bogdanm | 15:4892fe388435 | 135 | extern void __main(void); |
bogdanm | 15:4892fe388435 | 136 | #endif |
bogdanm | 15:4892fe388435 | 137 | extern int main(void); |
bogdanm | 15:4892fe388435 | 138 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 139 | // |
bogdanm | 15:4892fe388435 | 140 | // External declaration for the pointer to the stack top from the Linker Script |
bogdanm | 15:4892fe388435 | 141 | // |
bogdanm | 15:4892fe388435 | 142 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 143 | extern void _vStackTop(void); |
bogdanm | 15:4892fe388435 | 144 | |
bogdanm | 15:4892fe388435 | 145 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 146 | #if defined (__cplusplus) |
bogdanm | 15:4892fe388435 | 147 | } // extern "C" |
bogdanm | 15:4892fe388435 | 148 | #endif |
bogdanm | 15:4892fe388435 | 149 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 150 | // |
bogdanm | 15:4892fe388435 | 151 | // The vector table. |
bogdanm | 15:4892fe388435 | 152 | // This relies on the linker script to place at correct location in memory. |
bogdanm | 15:4892fe388435 | 153 | // |
bogdanm | 15:4892fe388435 | 154 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 155 | extern void (* const g_pfnVectors[])(void); |
bogdanm | 15:4892fe388435 | 156 | __attribute__ ((section(".isr_vector"))) |
bogdanm | 15:4892fe388435 | 157 | void (* const g_pfnVectors[])(void) = { |
bogdanm | 15:4892fe388435 | 158 | // Core Level - CM3 |
bogdanm | 15:4892fe388435 | 159 | &_vStackTop, // The initial stack pointer |
bogdanm | 15:4892fe388435 | 160 | ResetISR, // The reset handler |
bogdanm | 15:4892fe388435 | 161 | NMI_Handler, // The NMI handler |
bogdanm | 15:4892fe388435 | 162 | HardFault_Handler, // The hard fault handler |
bogdanm | 15:4892fe388435 | 163 | MemManage_Handler, // The MPU fault handler |
bogdanm | 15:4892fe388435 | 164 | BusFault_Handler, // The bus fault handler |
bogdanm | 15:4892fe388435 | 165 | UsageFault_Handler, // The usage fault handler |
bogdanm | 15:4892fe388435 | 166 | 0, // Reserved |
bogdanm | 15:4892fe388435 | 167 | 0, // Reserved |
bogdanm | 15:4892fe388435 | 168 | 0, // Reserved |
bogdanm | 15:4892fe388435 | 169 | 0, // Reserved |
bogdanm | 15:4892fe388435 | 170 | SVC_Handler, // SVCall handler |
bogdanm | 15:4892fe388435 | 171 | DebugMon_Handler, // Debug monitor handler |
bogdanm | 15:4892fe388435 | 172 | 0, // Reserved |
bogdanm | 15:4892fe388435 | 173 | PendSV_Handler, // The PendSV handler |
bogdanm | 15:4892fe388435 | 174 | SysTick_Handler, // The SysTick handler |
bogdanm | 15:4892fe388435 | 175 | |
bogdanm | 15:4892fe388435 | 176 | // Chip Level - LPC17 |
bogdanm | 15:4892fe388435 | 177 | WDT_IRQHandler, // 16, 0x40 - WDT |
bogdanm | 15:4892fe388435 | 178 | TIMER0_IRQHandler, // 17, 0x44 - TIMER0 |
bogdanm | 15:4892fe388435 | 179 | TIMER1_IRQHandler, // 18, 0x48 - TIMER1 |
bogdanm | 15:4892fe388435 | 180 | TIMER2_IRQHandler, // 19, 0x4c - TIMER2 |
bogdanm | 15:4892fe388435 | 181 | TIMER3_IRQHandler, // 20, 0x50 - TIMER3 |
bogdanm | 15:4892fe388435 | 182 | UART0_IRQHandler, // 21, 0x54 - UART0 |
bogdanm | 15:4892fe388435 | 183 | UART1_IRQHandler, // 22, 0x58 - UART1 |
bogdanm | 15:4892fe388435 | 184 | UART2_IRQHandler, // 23, 0x5c - UART2 |
bogdanm | 15:4892fe388435 | 185 | UART3_IRQHandler, // 24, 0x60 - UART3 |
bogdanm | 15:4892fe388435 | 186 | PWM1_IRQHandler, // 25, 0x64 - PWM1 |
bogdanm | 15:4892fe388435 | 187 | I2C0_IRQHandler, // 26, 0x68 - I2C0 |
bogdanm | 15:4892fe388435 | 188 | I2C1_IRQHandler, // 27, 0x6c - I2C1 |
bogdanm | 15:4892fe388435 | 189 | I2C2_IRQHandler, // 28, 0x70 - I2C2 |
bogdanm | 15:4892fe388435 | 190 | IntDefaultHandler, // 29, Not used |
bogdanm | 15:4892fe388435 | 191 | SSP0_IRQHandler, // 30, 0x78 - SSP0 |
bogdanm | 15:4892fe388435 | 192 | SSP1_IRQHandler, // 31, 0x7c - SSP1 |
bogdanm | 15:4892fe388435 | 193 | PLL0_IRQHandler, // 32, 0x80 - PLL0 (Main PLL) |
bogdanm | 15:4892fe388435 | 194 | RTC_IRQHandler, // 33, 0x84 - RTC |
bogdanm | 15:4892fe388435 | 195 | EINT0_IRQHandler, // 34, 0x88 - EINT0 |
bogdanm | 15:4892fe388435 | 196 | EINT1_IRQHandler, // 35, 0x8c - EINT1 |
bogdanm | 15:4892fe388435 | 197 | EINT2_IRQHandler, // 36, 0x90 - EINT2 |
bogdanm | 15:4892fe388435 | 198 | EINT3_IRQHandler, // 37, 0x94 - EINT3 |
bogdanm | 15:4892fe388435 | 199 | ADC_IRQHandler, // 38, 0x98 - ADC |
bogdanm | 15:4892fe388435 | 200 | BOD_IRQHandler, // 39, 0x9c - BOD |
bogdanm | 15:4892fe388435 | 201 | USB_IRQHandler, // 40, 0xA0 - USB |
bogdanm | 15:4892fe388435 | 202 | CAN_IRQHandler, // 41, 0xa4 - CAN |
bogdanm | 15:4892fe388435 | 203 | DMA_IRQHandler, // 42, 0xa8 - GP DMA |
bogdanm | 15:4892fe388435 | 204 | I2S_IRQHandler, // 43, 0xac - I2S |
bogdanm | 15:4892fe388435 | 205 | ENET_IRQHandler, // 44, 0xb0 - Ethernet |
bogdanm | 15:4892fe388435 | 206 | MCI_IRQHandler, // 45, 0xb4 - SD/MMC card I/F |
bogdanm | 15:4892fe388435 | 207 | MCPWM_IRQHandler, // 46, 0xb8 - Motor Control PWM |
bogdanm | 15:4892fe388435 | 208 | QEI_IRQHandler, // 47, 0xbc - Quadrature Encoder |
bogdanm | 15:4892fe388435 | 209 | PLL1_IRQHandler, // 48, 0xc0 - PLL1 (USB PLL) |
bogdanm | 15:4892fe388435 | 210 | USBActivity_IRQHandler, // 49, 0xc4 - USB Activity interrupt to wakeup |
bogdanm | 15:4892fe388435 | 211 | CANActivity_IRQHandler, // 50, 0xc8 - CAN Activity interrupt to wakeup |
bogdanm | 15:4892fe388435 | 212 | UART4_IRQHandler, // 51, 0xcc - UART4 |
bogdanm | 15:4892fe388435 | 213 | |
bogdanm | 15:4892fe388435 | 214 | SSP2_IRQHandler, // 52, 0xd0 - SSP2 |
bogdanm | 15:4892fe388435 | 215 | LCD_IRQHandler, // 53, 0xd4 - LCD |
bogdanm | 15:4892fe388435 | 216 | GPIO_IRQHandler, // 54, 0xd8 - GPIO |
bogdanm | 15:4892fe388435 | 217 | PWM0_IRQHandler, // 55, 0xdc - PWM0 |
bogdanm | 15:4892fe388435 | 218 | EEPROM_IRQHandler, // 56, 0xe0 - EEPROM |
bogdanm | 15:4892fe388435 | 219 | |
bogdanm | 15:4892fe388435 | 220 | }; |
bogdanm | 15:4892fe388435 | 221 | |
bogdanm | 15:4892fe388435 | 222 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 223 | // Functions to carry out the initialization of RW and BSS data sections. These |
bogdanm | 15:4892fe388435 | 224 | // are written as separate functions rather than being inlined within the |
bogdanm | 15:4892fe388435 | 225 | // ResetISR() function in order to cope with MCUs with multiple banks of |
bogdanm | 15:4892fe388435 | 226 | // memory. |
bogdanm | 15:4892fe388435 | 227 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 228 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 229 | void data_init(unsigned int romstart, unsigned int start, unsigned int len) { |
bogdanm | 15:4892fe388435 | 230 | unsigned int *pulDest = (unsigned int*) start; |
bogdanm | 15:4892fe388435 | 231 | unsigned int *pulSrc = (unsigned int*) romstart; |
bogdanm | 15:4892fe388435 | 232 | unsigned int loop; |
bogdanm | 15:4892fe388435 | 233 | for (loop = 0; loop < len; loop = loop + 4) |
bogdanm | 15:4892fe388435 | 234 | *pulDest++ = *pulSrc++; |
bogdanm | 15:4892fe388435 | 235 | } |
bogdanm | 15:4892fe388435 | 236 | |
bogdanm | 15:4892fe388435 | 237 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 238 | void bss_init(unsigned int start, unsigned int len) { |
bogdanm | 15:4892fe388435 | 239 | unsigned int *pulDest = (unsigned int*) start; |
bogdanm | 15:4892fe388435 | 240 | unsigned int loop; |
bogdanm | 15:4892fe388435 | 241 | for (loop = 0; loop < len; loop = loop + 4) |
bogdanm | 15:4892fe388435 | 242 | *pulDest++ = 0; |
bogdanm | 15:4892fe388435 | 243 | } |
bogdanm | 15:4892fe388435 | 244 | |
bogdanm | 15:4892fe388435 | 245 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 246 | // The following symbols are constructs generated by the linker, indicating |
bogdanm | 15:4892fe388435 | 247 | // the location of various points in the "Global Section Table". This table is |
bogdanm | 15:4892fe388435 | 248 | // created by the linker via the Code Red managed linker script mechanism. It |
bogdanm | 15:4892fe388435 | 249 | // contains the load address, execution address and length of each RW data |
bogdanm | 15:4892fe388435 | 250 | // section and the execution and length of each BSS (zero initialized) section. |
bogdanm | 15:4892fe388435 | 251 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 252 | extern unsigned int __data_section_table; |
bogdanm | 15:4892fe388435 | 253 | extern unsigned int __data_section_table_end; |
bogdanm | 15:4892fe388435 | 254 | extern unsigned int __bss_section_table; |
bogdanm | 15:4892fe388435 | 255 | extern unsigned int __bss_section_table_end; |
bogdanm | 15:4892fe388435 | 256 | |
bogdanm | 15:4892fe388435 | 257 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 258 | // Reset entry point for your code. |
bogdanm | 15:4892fe388435 | 259 | // Sets up a simple runtime environment and initializes the C/C++ |
bogdanm | 15:4892fe388435 | 260 | // library. |
bogdanm | 15:4892fe388435 | 261 | //***************************************************************************** |
mbed_official | 67:78dfdb5b4d9e | 262 | |
mbed_official | 67:78dfdb5b4d9e | 263 | extern "C" void software_init_hook(void) __attribute__((weak)); |
mbed_official | 67:78dfdb5b4d9e | 264 | |
bogdanm | 15:4892fe388435 | 265 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 266 | void |
bogdanm | 15:4892fe388435 | 267 | ResetISR(void) { |
bogdanm | 15:4892fe388435 | 268 | |
bogdanm | 15:4892fe388435 | 269 | // |
bogdanm | 15:4892fe388435 | 270 | // Copy the data sections from flash to SRAM. |
bogdanm | 15:4892fe388435 | 271 | // |
bogdanm | 15:4892fe388435 | 272 | unsigned int LoadAddr, ExeAddr, SectionLen; |
bogdanm | 15:4892fe388435 | 273 | unsigned int *SectionTableAddr; |
bogdanm | 15:4892fe388435 | 274 | |
bogdanm | 15:4892fe388435 | 275 | // Load base address of Global Section Table |
bogdanm | 15:4892fe388435 | 276 | SectionTableAddr = &__data_section_table; |
bogdanm | 15:4892fe388435 | 277 | |
bogdanm | 15:4892fe388435 | 278 | // Copy the data sections from flash to SRAM. |
bogdanm | 15:4892fe388435 | 279 | while (SectionTableAddr < &__data_section_table_end) { |
bogdanm | 15:4892fe388435 | 280 | LoadAddr = *SectionTableAddr++; |
bogdanm | 15:4892fe388435 | 281 | ExeAddr = *SectionTableAddr++; |
bogdanm | 15:4892fe388435 | 282 | SectionLen = *SectionTableAddr++; |
bogdanm | 15:4892fe388435 | 283 | data_init(LoadAddr, ExeAddr, SectionLen); |
bogdanm | 15:4892fe388435 | 284 | } |
bogdanm | 15:4892fe388435 | 285 | // At this point, SectionTableAddr = &__bss_section_table; |
bogdanm | 15:4892fe388435 | 286 | // Zero fill the bss segment |
bogdanm | 15:4892fe388435 | 287 | while (SectionTableAddr < &__bss_section_table_end) { |
bogdanm | 15:4892fe388435 | 288 | ExeAddr = *SectionTableAddr++; |
bogdanm | 15:4892fe388435 | 289 | SectionLen = *SectionTableAddr++; |
bogdanm | 15:4892fe388435 | 290 | bss_init(ExeAddr, SectionLen); |
bogdanm | 15:4892fe388435 | 291 | } |
bogdanm | 15:4892fe388435 | 292 | |
bogdanm | 15:4892fe388435 | 293 | #if defined (__VFP_FP__) && !defined (__SOFTFP__) |
bogdanm | 15:4892fe388435 | 294 | /* |
bogdanm | 15:4892fe388435 | 295 | * Code to enable the Cortex-M4 FPU only included |
bogdanm | 15:4892fe388435 | 296 | * if appropriate build options have been selected. |
bogdanm | 15:4892fe388435 | 297 | * Code taken from Section 7.1, Cortex-M4 TRM (DDI0439C) |
bogdanm | 15:4892fe388435 | 298 | */ |
bogdanm | 15:4892fe388435 | 299 | // Read CPACR (located at address 0xE000ED88) |
bogdanm | 15:4892fe388435 | 300 | // Set bits 20-23 to enable CP10 and CP11 coprocessors |
bogdanm | 15:4892fe388435 | 301 | // Write back the modified value to the CPACR |
bogdanm | 15:4892fe388435 | 302 | asm volatile ("LDR.W R0, =0xE000ED88\n\t" |
bogdanm | 15:4892fe388435 | 303 | "LDR R1, [R0]\n\t" |
bogdanm | 15:4892fe388435 | 304 | "ORR R1, R1, #(0xF << 20)\n\t" |
bogdanm | 15:4892fe388435 | 305 | "STR R1, [R0]"); |
bogdanm | 15:4892fe388435 | 306 | #endif // (__VFP_FP__) && !(__SOFTFP__) |
bogdanm | 15:4892fe388435 | 307 | |
bogdanm | 15:4892fe388435 | 308 | // Check to see if we are running the code from a non-zero |
bogdanm | 15:4892fe388435 | 309 | // address (eg RAM, external flash), in which case we need |
bogdanm | 15:4892fe388435 | 310 | // to modify the VTOR register to tell the CPU that the |
bogdanm | 15:4892fe388435 | 311 | // vector table is located at a non-0x0 address. |
bogdanm | 15:4892fe388435 | 312 | |
bogdanm | 15:4892fe388435 | 313 | // Note that we do not use the CMSIS register access mechanism, |
bogdanm | 15:4892fe388435 | 314 | // as there is no guarantee that the project has been configured |
bogdanm | 15:4892fe388435 | 315 | // to use CMSIS. |
bogdanm | 15:4892fe388435 | 316 | unsigned int * pSCB_VTOR = (unsigned int *) 0xE000ED08; |
bogdanm | 15:4892fe388435 | 317 | if ((unsigned int *)g_pfnVectors!=(unsigned int *) 0x00000000) { |
bogdanm | 15:4892fe388435 | 318 | // CMSIS : SCB->VTOR = <address of vector table> |
bogdanm | 15:4892fe388435 | 319 | *pSCB_VTOR = (unsigned int)g_pfnVectors; |
bogdanm | 15:4892fe388435 | 320 | } |
bogdanm | 15:4892fe388435 | 321 | |
bogdanm | 15:4892fe388435 | 322 | //#ifdef __USE_CMSIS |
bogdanm | 15:4892fe388435 | 323 | SystemInit(); |
bogdanm | 15:4892fe388435 | 324 | //#endif |
mbed_official | 67:78dfdb5b4d9e | 325 | if (software_init_hook) // give control to the RTOS |
mbed_official | 67:78dfdb5b4d9e | 326 | software_init_hook(); // this will also call __libc_init_array |
mbed_official | 67:78dfdb5b4d9e | 327 | else { |
bogdanm | 15:4892fe388435 | 328 | #if defined (__cplusplus) |
mbed_official | 67:78dfdb5b4d9e | 329 | // |
mbed_official | 67:78dfdb5b4d9e | 330 | // Call C++ library initialisation |
mbed_official | 67:78dfdb5b4d9e | 331 | // |
mbed_official | 67:78dfdb5b4d9e | 332 | __libc_init_array(); |
bogdanm | 15:4892fe388435 | 333 | #endif |
bogdanm | 15:4892fe388435 | 334 | |
bogdanm | 15:4892fe388435 | 335 | #if defined (__REDLIB__) |
mbed_official | 67:78dfdb5b4d9e | 336 | // Call the Redlib library, which in turn calls main() |
mbed_official | 67:78dfdb5b4d9e | 337 | __main() ; |
bogdanm | 15:4892fe388435 | 338 | #else |
mbed_official | 67:78dfdb5b4d9e | 339 | main(); |
bogdanm | 15:4892fe388435 | 340 | #endif |
mbed_official | 67:78dfdb5b4d9e | 341 | } |
bogdanm | 15:4892fe388435 | 342 | // |
bogdanm | 15:4892fe388435 | 343 | // main() shouldn't return, but if it does, we'll just enter an infinite loop |
bogdanm | 15:4892fe388435 | 344 | // |
bogdanm | 15:4892fe388435 | 345 | while (1) { |
bogdanm | 15:4892fe388435 | 346 | ; |
bogdanm | 15:4892fe388435 | 347 | } |
bogdanm | 15:4892fe388435 | 348 | } |
bogdanm | 15:4892fe388435 | 349 | |
bogdanm | 15:4892fe388435 | 350 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 351 | // Default exception handlers. Override the ones here by defining your own |
bogdanm | 15:4892fe388435 | 352 | // handler routines in your application code. |
bogdanm | 15:4892fe388435 | 353 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 354 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 355 | void NMI_Handler(void) |
bogdanm | 15:4892fe388435 | 356 | { |
bogdanm | 15:4892fe388435 | 357 | while(1) |
bogdanm | 15:4892fe388435 | 358 | { |
bogdanm | 15:4892fe388435 | 359 | } |
bogdanm | 15:4892fe388435 | 360 | } |
bogdanm | 15:4892fe388435 | 361 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 362 | void HardFault_Handler(void) |
bogdanm | 15:4892fe388435 | 363 | { |
bogdanm | 15:4892fe388435 | 364 | while(1) |
bogdanm | 15:4892fe388435 | 365 | { |
bogdanm | 15:4892fe388435 | 366 | } |
bogdanm | 15:4892fe388435 | 367 | } |
bogdanm | 15:4892fe388435 | 368 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 369 | void MemManage_Handler(void) |
bogdanm | 15:4892fe388435 | 370 | { |
bogdanm | 15:4892fe388435 | 371 | while(1) |
bogdanm | 15:4892fe388435 | 372 | { |
bogdanm | 15:4892fe388435 | 373 | } |
bogdanm | 15:4892fe388435 | 374 | } |
bogdanm | 15:4892fe388435 | 375 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 376 | void BusFault_Handler(void) |
bogdanm | 15:4892fe388435 | 377 | { |
bogdanm | 15:4892fe388435 | 378 | while(1) |
bogdanm | 15:4892fe388435 | 379 | { |
bogdanm | 15:4892fe388435 | 380 | } |
bogdanm | 15:4892fe388435 | 381 | } |
bogdanm | 15:4892fe388435 | 382 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 383 | void UsageFault_Handler(void) |
bogdanm | 15:4892fe388435 | 384 | { |
bogdanm | 15:4892fe388435 | 385 | while(1) |
bogdanm | 15:4892fe388435 | 386 | { |
bogdanm | 15:4892fe388435 | 387 | } |
bogdanm | 15:4892fe388435 | 388 | } |
bogdanm | 15:4892fe388435 | 389 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 390 | void SVC_Handler(void) |
bogdanm | 15:4892fe388435 | 391 | { |
bogdanm | 15:4892fe388435 | 392 | while(1) |
bogdanm | 15:4892fe388435 | 393 | { |
bogdanm | 15:4892fe388435 | 394 | } |
bogdanm | 15:4892fe388435 | 395 | } |
bogdanm | 15:4892fe388435 | 396 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 397 | void DebugMon_Handler(void) |
bogdanm | 15:4892fe388435 | 398 | { |
bogdanm | 15:4892fe388435 | 399 | while(1) |
bogdanm | 15:4892fe388435 | 400 | { |
bogdanm | 15:4892fe388435 | 401 | } |
bogdanm | 15:4892fe388435 | 402 | } |
bogdanm | 15:4892fe388435 | 403 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 404 | void PendSV_Handler(void) |
bogdanm | 15:4892fe388435 | 405 | { |
bogdanm | 15:4892fe388435 | 406 | while(1) |
bogdanm | 15:4892fe388435 | 407 | { |
bogdanm | 15:4892fe388435 | 408 | } |
bogdanm | 15:4892fe388435 | 409 | } |
bogdanm | 15:4892fe388435 | 410 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 411 | void SysTick_Handler(void) |
bogdanm | 15:4892fe388435 | 412 | { |
bogdanm | 15:4892fe388435 | 413 | while(1) |
bogdanm | 15:4892fe388435 | 414 | { |
bogdanm | 15:4892fe388435 | 415 | } |
bogdanm | 15:4892fe388435 | 416 | } |
bogdanm | 15:4892fe388435 | 417 | |
bogdanm | 15:4892fe388435 | 418 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 419 | // |
bogdanm | 15:4892fe388435 | 420 | // Processor ends up here if an unexpected interrupt occurs or a specific |
bogdanm | 15:4892fe388435 | 421 | // handler is not present in the application code. |
bogdanm | 15:4892fe388435 | 422 | // |
bogdanm | 15:4892fe388435 | 423 | //***************************************************************************** |
bogdanm | 15:4892fe388435 | 424 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 15:4892fe388435 | 425 | void IntDefaultHandler(void) |
bogdanm | 15:4892fe388435 | 426 | { |
bogdanm | 15:4892fe388435 | 427 | while(1) |
bogdanm | 15:4892fe388435 | 428 | { |
bogdanm | 15:4892fe388435 | 429 | } |
bogdanm | 15:4892fe388435 | 430 | } |
bogdanm | 15:4892fe388435 | 431 | |
bogdanm | 15:4892fe388435 | 432 | #include <stdlib.h> |
bogdanm | 15:4892fe388435 | 433 | |
bogdanm | 15:4892fe388435 | 434 | void *operator new(size_t size) {return malloc(size);} |
bogdanm | 15:4892fe388435 | 435 | void *operator new[](size_t size){return malloc(size);} |
bogdanm | 15:4892fe388435 | 436 | |
bogdanm | 15:4892fe388435 | 437 | void operator delete(void *p) {free(p);} |
bogdanm | 15:4892fe388435 | 438 | void operator delete[](void *p) {free(p);} |