@@ -395,18 +395,22 @@ void __iar_system_Mtxunlock(__iar_Rmtx *mutex)
395
395
*---------------------------------------------------------------------------*/
396
396
397
397
/* Main Thread definition */
398
- extern int main (void );
398
+ extern void pre_main (void );
399
399
#ifdef __MBED_CMSIS_RTOS_CA9
400
400
uint32_t os_thread_def_stack_main [(4 * OS_MAINSTKSIZE ) / sizeof (uint32_t )];
401
- osThreadDef_t os_thread_def_main = {(os_pthread )main , osPriorityNormal , 1 , 4 * OS_MAINSTKSIZE , os_thread_def_stack_main };
401
+ osThreadDef_t os_thread_def_main = {(os_pthread )pre_main , osPriorityNormal , 1 , 4 * OS_MAINSTKSIZE , os_thread_def_stack_main };
402
402
#else
403
- osThreadDef_t os_thread_def_main = {(os_pthread )main , osPriorityNormal , 1 , 4 * OS_MAINSTKSIZE };
403
+ osThreadDef_t os_thread_def_main = {(os_pthread )pre_main , osPriorityNormal , 1 , 4 * OS_MAINSTKSIZE };
404
404
#endif
405
405
406
406
#if defined (__CC_ARM )
407
407
408
408
#ifdef __MICROLIB
409
+
410
+ int main (void );
409
411
void _main_init (void ) __attribute__((section (".ARM.Collect$$$$000000FF" )));
412
+ void $Super$$__cpp_initialize__aeabi_ (void );
413
+
410
414
#if __TARGET_ARCH_ARM
411
415
#pragma push
412
416
#pragma arm
@@ -420,66 +424,134 @@ void _main_init (void) {
420
424
#if __TARGET_ARCH_ARM
421
425
#pragma pop
422
426
#endif
427
+
428
+ void $Sub$$__cpp_initialize__aeabi_ (void )
429
+ {
430
+ // this should invoke C++ initializers prior _main_init, we keep this empty and
431
+ // invoke them after _main_init (=starts RTX kernel)
432
+ }
433
+
434
+ void pre_main ()
435
+ {
436
+ $Super$$__cpp_initialize__aeabi_ ();
437
+ main ();
438
+ }
439
+
423
440
#else
441
+
442
+ void * armcc_heap_base ;
443
+ void * armcc_heap_top ;
444
+
445
+ __asm void pre_main (void )
446
+ {
447
+ IMPORT __rt_lib_init
448
+ IMPORT main
449
+ IMPORT armcc_heap_base
450
+ IMPORT armcc_heap_top
451
+
452
+ LDR R0 ,= armcc_heap_base
453
+ LDR R1 ,= armcc_heap_top
454
+ LDR R0 , [R0 ]
455
+ LDR R1 , [R1 ]
456
+ /* Save link register (keep 8 byte alignment with dummy R4) */
457
+ PUSH {R4 , LR }
458
+ BL __rt_lib_init
459
+ BL main
460
+ /* Return to the thread destroy function.
461
+ */
462
+ POP {R4 , PC }
463
+ ALIGN
464
+ }
465
+
424
466
__asm void __rt_entry (void ) {
425
467
426
468
IMPORT __user_setup_stackheap
427
- IMPORT __rt_lib_init
428
469
IMPORT os_thread_def_main
470
+ IMPORT armcc_heap_base
471
+ IMPORT armcc_heap_top
429
472
IMPORT osKernelInitialize
430
473
IMPORT osKernelStart
431
474
IMPORT osThreadCreate
432
- IMPORT exit
433
475
434
476
BL __user_setup_stackheap
435
- MOV R1 ,R2
436
- BL __rt_lib_init
477
+ LDR R3 ,= armcc_heap_base
478
+ LDR R4 ,= armcc_heap_top
479
+ STR R0 , [R3 ]
480
+ STR R2 , [R4 ]
437
481
BL osKernelInitialize
438
482
LDR R0 ,= os_thread_def_main
439
483
MOVS R1 ,#0
440
484
BL osThreadCreate
441
485
BL osKernelStart
442
- BL exit
486
+ /* osKernelStart should not return */
487
+ B .
443
488
444
489
ALIGN
445
490
}
446
491
#endif
447
492
448
493
#elif defined (__GNUC__ )
494
+ extern void __libc_fini_array (void );
495
+ extern void __libc_init_array (void );
496
+ extern int main (int argc , char * * argv );
497
+
498
+ void pre_main (void ) {
499
+ atexit (__libc_fini_array );
500
+ __libc_init_array ();
501
+ main (0 , NULL );
502
+ }
449
503
450
504
__attribute__((naked )) void software_init_hook_rtos (void ) {
451
505
__asm (
452
506
".syntax unified\n"
453
507
".arm\n"
454
- "movs r0,#0\n"
455
- "movs r1,#0\n"
456
- "mov r4,r0\n"
457
- "mov r5,r1\n"
458
- "ldr r0,= __libc_fini_array\n"
459
- "bl atexit\n"
460
- "bl __libc_init_array\n"
461
- "mov r0,r4\n"
462
- "mov r1,r5\n"
463
508
"bl osKernelInitialize\n"
464
509
"ldr r0,=os_thread_def_main\n"
465
510
"movs r1,#0\n"
466
511
"bl osThreadCreate\n"
467
512
"bl osKernelStart\n"
468
- "bl exit\n"
513
+ /* osKernelStart should not return */
514
+ "B .\n"
469
515
);
470
516
}
471
517
472
518
#elif defined (__ICCARM__)
519
+ extern void * __vector_core_a9 ;
520
+ extern int __low_level_init (void );
521
+ extern void __iar_data_init3 (void );
522
+ extern __weak void __iar_init_core ( void );
523
+ extern __weak void __iar_init_vfp ( void );
524
+ extern void __iar_dynamic_initialization (void );
525
+ extern void mbed_sdk_init (void );
526
+ static uint8_t low_level_init_needed ;
527
+
528
+ void pre_main (void ) {
529
+ if (low_level_init_needed ) {
530
+ __iar_dynamic_initialization ();
531
+ }
532
+ main ();
533
+ }
473
534
474
- extern void exit (int arg );
475
-
476
- void mbed_main (void ) {
477
- int a ;
478
-
535
+ #pragma required=__vector_core_a9
536
+ void __iar_program_start ( void )
537
+ {
538
+ __iar_init_core ();
539
+ __iar_init_vfp ();
540
+
541
+ uint8_t low_level_init_needed_local ;
542
+
543
+ low_level_init_needed_local = __low_level_init ();
544
+ if (low_level_init_needed_local ) {
545
+ __iar_data_init3 ();
546
+ mbed_sdk_init ();
547
+ }
548
+ /* Store in a global variable after RAM has been initialized */
549
+ low_level_init_needed = low_level_init_needed_local ;
479
550
osKernelInitialize ();
480
551
osThreadCreate (& os_thread_def_main , NULL );
481
- a = osKernelStart ();
482
- exit (a );
552
+ osKernelStart ();
553
+ /* osKernelStart should not return */
554
+ while (1 );
483
555
}
484
556
485
557
#endif
0 commit comments