2 ** @(#)cstart.c 1.9 $E%
\r
4 ** Copyright 1997-2013 Altium BV *
\r
8 ** The system startup code initializes the processor's registers
\r
9 ** and the application C variables.
\r
14 #pragma profiling off /* prevent profiling information on cstart */
\r
15 #pragma optimize abcefgIJKlopRsUy /* preset optimization level */
\r
16 #pragma tradeoff 4 /* preset tradeoff level */
\r
17 #pragma runtime BCMSZ /* disable runtime error checking for cstart */
\r
18 #pragma warning 750 /* do not warn about unsaved registers */
\r
19 #pragma section .text=cstart /* use: .text.cstart as the section name */
\r
24 #define VTOR (*(volatile unsigned int *)0xE000ED08)
\r
25 #define PREF_FCON (*(volatile unsigned int *)0x58002014)
\r
26 #define SCU_GCU_PEEN (*(volatile unsigned int *)0x5000413C)
\r
27 #define SCU_GCU_PEFLAG (*(volatile unsigned int *)0x50004150)
\r
29 /* In the absence of DAVE code engine, CMSIS SystemInit() must perform clock
\r
32 This decision routine defined here will always return TRUE.
\r
34 When overridden by a definition defined in DAVE code engine, this routine
\r
35 returns FALSE indicating that the code engine has performed the clock setup
\r
37 #pragma weak AllowPLLInitByStartup
\r
38 uint32_t AllowPLLInitByStartup( void )
\r
45 extern unsigned char _lc_ub_stack[];
\r
46 extern unsigned char _lc_vtor_value[];
\r
49 #pragma extern _Exit
\r
51 extern int main( int argc, char *argv[] );
\r
52 extern void SystemInit( void );
\r
53 extern void __init( void );
\r
55 extern void __prof_init( void );
\r
59 extern void * _posix_boot_stack_top;
\r
60 extern int posix_main( void );
\r
63 #ifdef __USE_ARGC_ARGV
\r
64 #ifndef __ARGCV_BUFSIZE
\r
65 #define __ARGCV_BUFSIZE 256
\r
67 static char argcv[__ARGCV_BUFSIZE];
\r
70 void __interrupt() __frame() Reset_Handler( void )
\r
72 /* Set flash wait states to 3 */
\r
73 PREF_FCON = (PREF_FCON & 0xFFFFFFF0) | 0x00000003;
\r
74 SCU_GCU_PEFLAG =0xFFFFFFFF; /* Clear existing parity errors if any */
\r
75 SCU_GCU_PEEN = 0; /* Disable parity */
\r
78 * Anticipate possible ROM/RAM remapping
\r
79 * by loading the 'real' program address.
\r
83 * Initialize stack pointer.
\r
85 __setsp( _lc_ub_stack );
\r
87 * Call a user function which initializes hardware,
\r
88 * such as ROM/RAM re-mapping or MMU configuration.
\r
92 * Copy initialized sections from ROM to RAM
\r
93 * and clear uninitialized data sections in RAM.
\r
96 __asm( "_cptable_handled:" ); /* symbol may be used by debugger */
\r
99 * Load VTOR register with the actual vector table
\r
102 VTOR = (unsigned int)_lc_vtor_value;
\r
105 __setsp( _posix_boot_stack_top );
\r
107 #if __PROF_ENABLE__
\r
111 exit( posix_main() );
\r
112 #elif defined __USE_ARGC_ARGV
\r
113 exit( main( _argcv( argcv, __ARGCV_BUFSIZE ), (char **)argcv ) );
\r
115 exit( main( 0, NULL ) );
\r