blob: c268e3b6cff6c5871941754df77a450dbc1fa00a [file] [log] [blame] [edit]
/*
** @(#)cstart.c 1.9 $E%
**
** Copyright 1997-2013 Altium BV *
**
** DESCRIPTION:
**
** The system startup code initializes the processor's registers
** and the application C variables.
**
*/
#pragma nomisrac
#pragma profiling off /* prevent profiling information on cstart */
#pragma optimize abcefgIJKlopRsUy /* preset optimization level */
#pragma tradeoff 4 /* preset tradeoff level */
#pragma runtime BCMSZ /* disable runtime error checking for cstart */
#pragma warning 750 /* do not warn about unsaved registers */
#pragma section .text=cstart /* use: .text.cstart as the section name */
#include <stdlib.h>
#include <dbg.h>
#define VTOR (*(volatile unsigned int *)0xE000ED08)
#define PREF_FCON (*(volatile unsigned int *)0x58002014)
#define SCU_GCU_PEEN (*(volatile unsigned int *)0x5000413C)
#define SCU_GCU_PEFLAG (*(volatile unsigned int *)0x50004150)
/* In the absence of DAVE code engine, CMSIS SystemInit() must perform clock
tree setup.
This decision routine defined here will always return TRUE.
When overridden by a definition defined in DAVE code engine, this routine
returns FALSE indicating that the code engine has performed the clock setup
*/
#pragma weak AllowPLLInitByStartup
uint32_t AllowPLLInitByStartup( void )
{
return 1;
}
extern unsigned char _lc_ub_stack[];
extern unsigned char _lc_vtor_value[];
#pragma weak exit
#pragma extern _Exit
#pragma extern main
extern int main( int argc, char *argv[] );
extern void SystemInit( void );
extern void __init( void );
#if __PROF_ENABLE__
extern void __prof_init( void );
#endif
#ifdef __POSIX__
extern void * _posix_boot_stack_top;
extern int posix_main( void );
#endif
#ifdef __USE_ARGC_ARGV
#ifndef __ARGCV_BUFSIZE
#define __ARGCV_BUFSIZE 256
#endif
static char argcv[__ARGCV_BUFSIZE];
#endif
void __interrupt() __frame() Reset_Handler( void )
{
/* Set flash wait states to 3 */
PREF_FCON = (PREF_FCON & 0xFFFFFFF0) | 0x00000003;
SCU_GCU_PEFLAG =0xFFFFFFFF; /* Clear existing parity errors if any */
SCU_GCU_PEEN = 0; /* Disable parity */
/*
* Anticipate possible ROM/RAM remapping
* by loading the 'real' program address.
*/
__remap_pc();
/*
* Initialize stack pointer.
*/
__setsp( _lc_ub_stack );
/*
* Call a user function which initializes hardware,
* such as ROM/RAM re-mapping or MMU configuration.
*/
SystemInit();
/*
* Copy initialized sections from ROM to RAM
* and clear uninitialized data sections in RAM.
*/
__init();
__asm( "_cptable_handled:" ); /* symbol may be used by debugger */
/*
* Load VTOR register with the actual vector table
* start address
*/
VTOR = (unsigned int)_lc_vtor_value;
#ifdef __POSIX__
__setsp( _posix_boot_stack_top );
#endif
#if __PROF_ENABLE__
__prof_init();
#endif
#ifdef __POSIX__
exit( posix_main() );
#elif defined __USE_ARGC_ARGV
exit( main( _argcv( argcv, __ARGCV_BUFSIZE ), (char **)argcv ) );
#else
exit( main( 0, NULL ) );
#endif
return;
}