forked
Fork of mbed-rtos by
Diff: rtx/TARGET_ARM7/RTX_CM_lib.h
- Revision:
- 116:0788b1a76461
- Parent:
- 80:2dab120a94c2
- Child:
- 118:6635230e06ba
--- a/rtx/TARGET_ARM7/RTX_CM_lib.h Tue May 17 13:00:14 2016 +0100 +++ b/rtx/TARGET_ARM7/RTX_CM_lib.h Mon May 23 10:00:41 2016 +0100 @@ -195,8 +195,8 @@ *---------------------------------------------------------------------------*/ /* Main Thread definition */ -extern int main (void); -osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 0, NULL}; +extern void pre_main (void); +osThreadDef_t os_thread_def_main = {(os_pthread)pre_main, osPriorityNormal, 0, NULL}; // This define should be probably moved to the CMSIS layer @@ -230,7 +230,11 @@ #if defined (__CC_ARM) #ifdef __MICROLIB + +int main(void); void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF"))); +void $Super$$__cpp_initialize__aeabi_(void); + void _main_init (void) { osKernelInitialize(); set_main_stack(); @@ -238,8 +242,45 @@ osKernelStart(); for (;;); } + +void $Sub$$__cpp_initialize__aeabi_(void) +{ + // this should invoke C++ initializers prior _main_init, we keep this empty and + // invoke them after _main_init (=starts RTX kernel) +} + +void pre_main() +{ + $Super$$__cpp_initialize__aeabi_(); + main(); +} + #else +void * armcc_heap_base; +void * armcc_heap_top; + +__asm void pre_main (void) +{ + IMPORT __rt_lib_init + IMPORT main + IMPORT armcc_heap_base + IMPORT armcc_heap_top + + LDR R0,=armcc_heap_base + LDR R1,=armcc_heap_top + LDR R0,[R0] + LDR R1,[R1] + /* Save link register (keep 8 byte alignment with dummy R4) */ + PUSH {R4, LR} + BL __rt_lib_init + BL main + /* Return to the thread destroy function. + */ + POP {R4, PC} + ALIGN +} + /* The single memory model is checking for stack collision at run time, verifing that the heap pointer is underneath the stack pointer. @@ -251,127 +292,109 @@ __asm void __rt_entry (void) { IMPORT __user_setup_stackheap - IMPORT __rt_lib_init + IMPORT armcc_heap_base + IMPORT armcc_heap_top IMPORT os_thread_def_main IMPORT osKernelInitialize IMPORT set_main_stack IMPORT osKernelStart IMPORT osThreadCreate - IMPORT exit + /* __user_setup_stackheap returns: + * - Heap base in r0 (if the program uses the heap). + * - Stack base in sp. + * - Heap limit in r2 (if the program uses the heap and uses two-region memory). + * + * More info can be found in: + * ARM Compiler ARM C and C++ Libraries and Floating-Point Support User Guide + */ BL __user_setup_stackheap - MOV R1,R2 - BL __rt_lib_init + LDR R3,=armcc_heap_base + LDR R4,=armcc_heap_top + STR R0,[R3] + STR R2,[R4] BL osKernelInitialize BL set_main_stack LDR R0,=os_thread_def_main MOVS R1,#0 BL osThreadCreate BL osKernelStart - BL exit + /* osKernelStart should not return */ + B . ALIGN } + #endif #elif defined (__GNUC__) -#ifdef __CS3__ - -/* CS3 start_c routine. - * - * Copyright (c) 2006, 2007 CodeSourcery Inc - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - -#include "cs3.h" - +extern void __libc_fini_array(void); extern void __libc_init_array (void); - -__attribute ((noreturn)) void __cs3_start_c (void){ - unsigned regions = __cs3_region_num; - const struct __cs3_region *rptr = __cs3_regions; +extern int main(int argc, char **argv); - /* Initialize memory */ - for (regions = __cs3_region_num, rptr = __cs3_regions; regions--; rptr++) { - long long *src = (long long *)rptr->init; - long long *dst = (long long *)rptr->data; - unsigned limit = rptr->init_size; - unsigned count; - - if (src != dst) - for (count = 0; count != limit; count += sizeof (long long)) - *dst++ = *src++; - else - dst = (long long *)((char *)dst + limit); - limit = rptr->zero_size; - for (count = 0; count != limit; count += sizeof (long long)) - *dst++ = 0; - } - - /* Run initializers. */ - __libc_init_array (); - - osKernelInitialize(); - set_main_stack(); - osThreadCreate(&os_thread_def_main, NULL); - osKernelStart(); - for (;;); +void pre_main(void) { + atexit(__libc_fini_array); + __libc_init_array(); + main(0, NULL); } -#else - __attribute__((naked)) void software_init_hook (void) { __asm ( ".syntax unified\n" ".thumb\n" - "movs r0,#0\n" - "movs r1,#0\n" - "mov r8,r0\n" - "mov r9,r1\n" - "ldr r0,= __libc_fini_array\n" - "bl atexit\n" - "bl __libc_init_array\n" - "mov r0,r8\n" - "mov r1,r9\n" "bl osKernelInitialize\n" "bl set_main_stack\n" "ldr r0,=os_thread_def_main\n" "movs r1,#0\n" "bl osThreadCreate\n" "bl osKernelStart\n" - "bl exit\n" + /* osKernelStart should not return */ + "B .\n" ); } -#endif - #elif defined (__ICCARM__) +extern void* __vector_table; extern int __low_level_init(void); extern void __iar_data_init3(void); +extern __weak void __iar_init_core( void ); +extern __weak void __iar_init_vfp( void ); +extern void __iar_dynamic_initialization(void); +extern void mbed_sdk_init(void); extern void exit(int arg); -__noreturn __stackless void __cmain(void) { - int a; +static uint8_t low_level_init_needed; + +void pre_main(void) { + if (low_level_init_needed) { + __iar_dynamic_initialization(); + } + main(); +} - if (__low_level_init() != 0) { +#pragma required=__vector_table +void __iar_program_start( void ) +{ + __iar_init_core(); + __iar_init_vfp(); + + uint8_t low_level_init_needed_local; + + low_level_init_needed_local = __low_level_init(); + if (low_level_init_needed_local) { __iar_data_init3(); + mbed_sdk_init(); } + /* Store in a global variable after RAM has been initialized */ + low_level_init_needed = low_level_init_needed_local; osKernelInitialize(); set_main_stack(); osThreadCreate(&os_thread_def_main, NULL); - a = osKernelStart(); - exit(a); + osKernelStart(); + /* osKernelStart should not return */ + while (1); } #endif