Skip to content

Commit 3062999

Browse files
committed
Separated the c data initialization and c++ to call mbed_sdk_init before c++ data. So that the c variables are updated before the c++ objects are initialized. Had to rename the cmain override in RTX_CM_lib.h to __iar_program_start because there can not be two __cmain overrides in the project. The ewps had to be updated to add the linker command --skip_dynamic_initialization which stalls the c++ data init until __iar_dynamic_initialization which is called right after mbed_sdk_init.
1 parent 490dd0d commit 3062999

34 files changed

+160
-66
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/**************************************************
2+
*
3+
* Part two of the system initialization code, contains C-level
4+
* initialization, thumb-2 only variant.
5+
*
6+
* Copyright 2006 IAR Systems. All rights reserved.
7+
*
8+
* $Revision: 59783 $
9+
*
10+
**************************************************/
11+
12+
13+
; --------------------------------------------------
14+
; Module ?cmain, C-level initialization.
15+
;
16+
17+
18+
SECTION SHT$$PREINIT_ARRAY:CONST:NOROOT(2)
19+
SECTION SHT$$INIT_ARRAY:CONST:NOROOT(2)
20+
21+
SECTION .text:CODE:NOROOT(2)
22+
23+
PUBLIC __cmain
24+
;; Keep ?main for legacy reasons, it is accessed in countless instances of cstartup.s around the world...
25+
PUBLIC ?main
26+
EXTWEAK __iar_data_init3
27+
EXTWEAK __iar_argc_argv
28+
EXTERN __low_level_init
29+
EXTERN __call_ctors
30+
EXTERN main
31+
EXTERN exit
32+
EXTERN __iar_dynamic_initialization
33+
EXTERN mbed_sdk_init
34+
EXTERN SystemInit
35+
36+
THUMB
37+
__cmain:
38+
?main:
39+
40+
; Initialize segments.
41+
; __segment_init and __low_level_init are assumed to use the same
42+
; instruction set and to be reachable by BL from the ICODE segment
43+
; (it is safest to link them in segment ICODE).
44+
45+
FUNCALL __cmain, __low_level_init
46+
bl __low_level_init
47+
cmp r0,#0
48+
beq ?l1
49+
FUNCALL __cmain, __iar_data_init3
50+
bl __iar_data_init3
51+
MOVS r0,#0 ; No parameters
52+
FUNCALL __cmain, mbed_sdk_init
53+
BL mbed_sdk_init
54+
MOVS r0,#0 ; No parameters
55+
FUNCALL __cmain, __iar_dynamic_initialization
56+
BL __iar_dynamic_initialization ; C++ dynamic initialization
57+
58+
?l1:
59+
REQUIRE ?l3
60+
61+
SECTION .text:CODE:NOROOT(2)
62+
63+
PUBLIC _main
64+
PUBLIC _call_main
65+
THUMB
66+
67+
__iar_init$$done: ; Copy initialization is done
68+
69+
?l3:
70+
_call_main:
71+
MOVS r0,#0 ; No parameters
72+
FUNCALL __cmain, __iar_argc_argv
73+
BL __iar_argc_argv ; Maybe setup command line
74+
75+
FUNCALL __cmain, main
76+
BL main
77+
_main:
78+
FUNCALL __cmain, exit
79+
BL exit
80+
81+
END

libraries/rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -436,21 +436,34 @@ __attribute__((naked)) void software_init_hook (void) {
436436

437437
#elif defined (__ICCARM__)
438438

439+
extern void* __vector_table;
439440
extern int __low_level_init(void);
440441
extern void __iar_data_init3(void);
442+
extern __weak void __iar_init_core( void );
443+
extern __weak void __iar_init_vfp( void );
444+
extern void __iar_dynamic_initialization(void);
445+
extern void mbed_sdk_init(void);
441446
extern void exit(int arg);
442447

443-
__noreturn __stackless void __cmain(void) {
448+
#pragma required=__vector_table
449+
void __iar_program_start( void )
450+
{
451+
__iar_init_core();
452+
__iar_init_vfp();
453+
444454
int a;
445455

446456
if (__low_level_init() != 0) {
447457
__iar_data_init3();
448-
}
458+
mbed_sdk_init();
459+
__iar_dynamic_initialization();
460+
}
449461
osKernelInitialize();
450462
set_main_stack();
451463
osThreadCreate(&os_thread_def_main, NULL);
452464
a = osKernelStart();
453-
exit(a);
465+
exit(a);
466+
454467
}
455468

456469
#endif

workspace_tools/export/iar_arch_pro.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -722,11 +722,11 @@
722722
</option>
723723
<option>
724724
<name>IlinkUseExtraOptions</name>
725-
<state>0</state>
725+
<state>1</state>
726726
</option>
727727
<option>
728728
<name>IlinkExtraOptions</name>
729-
<state></state>
729+
<state>--skip_dynamic_initialization</state>
730730
</option>
731731
<option>
732732
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_k20d50m.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_k22f.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_k64f.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_kl05z.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_kl25z.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_kl46z.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

workspace_tools/export/iar_lpc1114.ewp.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,11 +743,11 @@
743743
</option>
744744
<option>
745745
<name>IlinkUseExtraOptions</name>
746-
<state>0</state>
746+
<state>1</state>
747747
</option>
748748
<option>
749749
<name>IlinkExtraOptions</name>
750-
<state></state>
750+
<state>--skip_dynamic_initialization</state>
751751
</option>
752752
<option>
753753
<name>IlinkLowLevelInterfaceSlave</name>

0 commit comments

Comments
 (0)