diff --git a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11U6X/TOOLCHAIN_GCC_CR/TARGET_LPC11U68/startup_LPC11U68.cpp b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11U6X/TOOLCHAIN_GCC_CR/TARGET_LPC11U68/startup_LPC11U68.cpp index 2acd2af4abc..6faa114bc23 100644 --- a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11U6X/TOOLCHAIN_GCC_CR/TARGET_LPC11U68/startup_LPC11U68.cpp +++ b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11U6X/TOOLCHAIN_GCC_CR/TARGET_LPC11U68/startup_LPC11U68.cpp @@ -137,7 +137,8 @@ AFTER_VECTORS void bss_init(unsigned int start, unsigned int len) { /* Reset entry point*/ -extern "C" void software_init_hook(void) __attribute__((weak)); +extern "C" void software_init_hook(void); +extern "C" void pre_main(void) __attribute__((weak)); AFTER_VECTORS void ResetISR(void) { unsigned int LoadAddr, ExeAddr, SectionLen; @@ -169,9 +170,10 @@ AFTER_VECTORS void ResetISR(void) { SystemInit(); - if (software_init_hook) - software_init_hook(); - else { + if (pre_main) { // give control to the RTOS + software_init_hook(); // this will also call __libc_init_array + } + else { // for BareMetal (non-RTOS) build __libc_init_array(); main(); } diff --git a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_CR/startup_LPC11xx.cpp b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_CR/startup_LPC11xx.cpp index 8aa0d83fe41..a9ffaf6250d 100644 --- a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_CR/startup_LPC11xx.cpp +++ b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_CR/startup_LPC11xx.cpp @@ -113,7 +113,8 @@ extern unsigned int __data_section_table; extern unsigned int __data_section_table_end; extern unsigned int __bss_section_table_end; -extern "C" void software_init_hook(void) __attribute__((weak)); +extern "C" void software_init_hook(void); +extern "C" void pre_main(void) __attribute__((weak)); AFTER_VECTORS void ResetISR(void) { unsigned int LoadAddr, ExeAddr, SectionLen; @@ -136,9 +137,10 @@ AFTER_VECTORS void ResetISR(void) { } SystemInit(); - if (software_init_hook) // give control to the RTOS + if (pre_main) { // give control to the RTOS software_init_hook(); // this will also call __libc_init_array - else { + } + else { // for BareMetal (non-RTOS) build __libc_init_array(); main(); } diff --git a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11XX_11CXX/TOOLCHAIN_GCC_CR/TARGET_LPC11XX/startup_LPC11xx.cpp b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11XX_11CXX/TOOLCHAIN_GCC_CR/TARGET_LPC11XX/startup_LPC11xx.cpp index 5532eadc917..c8807ea9b08 100644 --- a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11XX_11CXX/TOOLCHAIN_GCC_CR/TARGET_LPC11XX/startup_LPC11xx.cpp +++ b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC11XX_11CXX/TOOLCHAIN_GCC_CR/TARGET_LPC11XX/startup_LPC11xx.cpp @@ -113,7 +113,8 @@ extern unsigned int __data_section_table; extern unsigned int __data_section_table_end; extern unsigned int __bss_section_table_end; -extern "C" void software_init_hook(void) __attribute__((weak)); +extern "C" void software_init_hook(void); +extern "C" void pre_main(void) __attribute__((weak)); AFTER_VECTORS void ResetISR(void) { unsigned int LoadAddr, ExeAddr, SectionLen; @@ -136,9 +137,10 @@ AFTER_VECTORS void ResetISR(void) { } SystemInit(); - if (software_init_hook) // give control to the RTOS + if (pre_main) { // give control to the RTOS software_init_hook(); // this will also call __libc_init_array - else { + } + else { // for BareMetal (non-RTOS) build __libc_init_array(); main(); } @@ -147,7 +149,7 @@ AFTER_VECTORS void ResetISR(void) { AFTER_VECTORS void NMI_Handler (void) {while(1){}} AFTER_VECTORS void HardFault_Handler(void) {while(1){}} -AFTER_VECTORS void SVC_Handler (void) {while(1){}} +AFTER_VECTORS void SVC_Handler (void) {while(1){}} AFTER_VECTORS void PendSV_Handler (void) {while(1){}} AFTER_VECTORS void SysTick_Handler (void) {while(1){}} AFTER_VECTORS void IntDefaultHandler(void) {while(1){}} diff --git a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC15XX/TOOLCHAIN_GCC_CR/startup_LPC15xx.cpp b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC15XX/TOOLCHAIN_GCC_CR/startup_LPC15xx.cpp index 3712091f14d..d0e6e2111ba 100644 --- a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC15XX/TOOLCHAIN_GCC_CR/startup_LPC15xx.cpp +++ b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC15XX/TOOLCHAIN_GCC_CR/startup_LPC15xx.cpp @@ -166,7 +166,8 @@ AFTER_VECTORS void bss_init(unsigned int start, unsigned int len) { /* Reset entry point*/ -extern "C" void software_init_hook(void) __attribute__((weak)); +extern "C" void software_init_hook(void); +extern "C" void pre_main(void) __attribute__((weak)); AFTER_VECTORS void ResetISR(void) { unsigned int LoadAddr, ExeAddr, SectionLen; @@ -187,9 +188,10 @@ AFTER_VECTORS void ResetISR(void) { } SystemInit(); - if (software_init_hook) - software_init_hook(); - else { + if (pre_main) { // give control to the RTOS + software_init_hook(); // this will also call __libc_init_array + } + else { // for BareMetal (non-RTOS) build __libc_init_array(); main(); } diff --git a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC176X/TOOLCHAIN_GCC_CR/startup_LPC17xx.cpp b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC176X/TOOLCHAIN_GCC_CR/startup_LPC17xx.cpp index ebf805d76e0..569ae39f18c 100644 --- a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC176X/TOOLCHAIN_GCC_CR/startup_LPC17xx.cpp +++ b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC176X/TOOLCHAIN_GCC_CR/startup_LPC17xx.cpp @@ -130,7 +130,8 @@ AFTER_VECTORS void bss_init(unsigned int start, unsigned int len) { for (loop = 0; loop < len; loop = loop + 4) *pulDest++ = 0; } -extern "C" void software_init_hook(void) __attribute__((weak)); +extern "C" void software_init_hook(void); +extern "C" void pre_main(void) __attribute__((weak)); AFTER_VECTORS void ResetISR(void) { unsigned int LoadAddr, ExeAddr, SectionLen; @@ -151,9 +152,10 @@ AFTER_VECTORS void ResetISR(void) { } SystemInit(); - if (software_init_hook) // give control to the RTOS + if (pre_main) { // give control to the RTOS software_init_hook(); // this will also call __libc_init_array - else { + } + else { // for BareMetal (non-RTOS) build __libc_init_array(); main(); } diff --git a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC408X/TOOLCHAIN_GCC_CR/startup_lpc407x_8x.cpp b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC408X/TOOLCHAIN_GCC_CR/startup_lpc407x_8x.cpp index 56cf9768e2b..571e6abca3b 100644 --- a/hal/targets/cmsis/TARGET_NXP/TARGET_LPC408X/TOOLCHAIN_GCC_CR/startup_lpc407x_8x.cpp +++ b/hal/targets/cmsis/TARGET_NXP/TARGET_LPC408X/TOOLCHAIN_GCC_CR/startup_lpc407x_8x.cpp @@ -260,7 +260,8 @@ extern unsigned int __bss_section_table_end; // library. //***************************************************************************** -extern "C" void software_init_hook(void) __attribute__((weak)); +extern "C" void software_init_hook(void); +extern "C" void pre_main(void) __attribute__((weak)); __attribute__ ((section(".after_vectors"))) void @@ -319,26 +320,15 @@ ResetISR(void) { *pSCB_VTOR = (unsigned int)g_pfnVectors; } -//#ifdef __USE_CMSIS - SystemInit(); -//#endif - if (software_init_hook) // give control to the RTOS - software_init_hook(); // this will also call __libc_init_array - else { -#if defined (__cplusplus) - // - // Call C++ library initialisation - // - __libc_init_array(); -#endif - -#if defined (__REDLIB__) - // Call the Redlib library, which in turn calls main() - __main() ; -#else - main(); + SystemInit(); + if (pre_main) { // give control to the RTOS + software_init_hook(); // this will also call __libc_init_array + } + else { // for BareMetal (non-RTOS) build + __libc_init_array(); + main(); #endif - } + } // // main() shouldn't return, but if it does, we'll just enter an infinite loop //