Skip to content

Commit fa8dc64

Browse files
committed
GCC - Initialize RTOS before standard library
Initialize the RTOS before initializing the standard library. This allows C++ constructors to be called in a well defined thread context.
1 parent 307e2a8 commit fa8dc64

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

core/mbed-rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -523,19 +523,27 @@ __asm void __rt_entry (void) {
523523

524524
#elif defined (__GNUC__)
525525

526-
__attribute__((naked)) void software_init_hook (void) {
526+
__attribute__((naked)) void pre_main (void) {
527527
__asm (
528528
".syntax unified\n"
529529
".thumb\n"
530-
"movs r0,#0\n"
531-
"movs r1,#0\n"
532-
"mov r4,r0\n"
533-
"mov r5,r1\n"
530+
/* Save link register (keep 8 byte alignment with dummy r4) */
531+
"push {r4, lr}\n"
534532
"ldr r0,= __libc_fini_array\n"
535533
"bl atexit\n"
536534
"bl __libc_init_array\n"
537-
"mov r0,r4\n"
538-
"mov r1,r5\n"
535+
/* Restore link register and branch so when main returns it
536+
* goes to the thread destroy function.
537+
*/
538+
"pop {r4, lr}\n"
539+
"b main\n"
540+
);
541+
}
542+
543+
__attribute__((naked)) void software_init_hook (void) {
544+
__asm (
545+
".syntax unified\n"
546+
".thumb\n"
539547
"bl osKernelInitialize\n"
540548
#ifdef __MBED_CMSIS_RTOS_CM
541549
"bl set_main_stack\n"
@@ -544,7 +552,8 @@ __attribute__((naked)) void software_init_hook (void) {
544552
"movs r1,#0\n"
545553
"bl osThreadCreate\n"
546554
"bl osKernelStart\n"
547-
"bl exit\n"
555+
/* osKernelStart should not return */
556+
"B .\n"
548557
);
549558
}
550559

0 commit comments

Comments
 (0)