www.pudn.com > KEA_Driver_Lib_V1.zip > startup.c, change:2014-03-13,size:3851b


/****************************************************************************** 
* 
* Freescale Semiconductor Inc. 
* (c) Copyright 2013 Freescale Semiconductor, Inc. 
* ALL RIGHTS RESERVED. 
* 
*************************************************************************** 
* 
* THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR 
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
* THE POSSIBILITY OF SUCH DAMAGE. 
* 
***************************************************************************//*! 
* 
* @file startup.c 
* 
* @author Freescale 
* 
* @version 0.0.1 
* 
* @date Jun. 25, 2013 
* 
* @brief Implement generic Kinetis startup code.  
* 
*******************************************************************************/ 
 
#include "common.h" 
 
#pragma section = ".data" 
#pragma section = ".data_init" 
#pragma section = ".bss" 
#pragma section = "CodeRelocate" 
#pragma section = "CodeRelocateRam"  
 
/********************************************************************/ 
void 
common_startup(void) 
{ 
//    extern char __DATA_ROM[]; 
//    extern char __DATA_RAM[]; 
//    extern char __DATA_END[]; 
   
    /* Declare a counter we'll use in all of the copy loops */ 
    uint32 n; 
  
  
    /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */   
    extern uint32 __VECTOR_TABLE[]; 
    extern uint32 __VECTOR_RAM[]; 
 
    /* Copy the vector table to RAM */ 
    if (__VECTOR_RAM != __VECTOR_TABLE) 
    { 
        for (n = 0; n < 48 ; n++)     //  for small memory space, excluding flash configuration field 
           
            __VECTOR_RAM[n] = __VECTOR_TABLE[n]; 
    } 
    /* Point the VTOR to the new copy of the vector table */ 
    write_vtor((uint32)__VECTOR_RAM);     
 
    /* Get the addresses for the .data section (initialized data section) */ 
    uint8* data_ram = __section_begin(".data"); 
    uint8* data_rom = __section_begin(".data_init"); 
    uint8* data_rom_end = __section_end(".data_init"); 
     
    /* Copy initialized data from ROM to RAM */ 
    n = data_rom_end - data_rom; 
    while (n--) 
      *data_ram++ = *data_rom++; 
  
  
    /* Get the addresses for the .bss section (zero-initialized data) */ 
    uint8* bss_start = __section_begin(".bss"); 
    uint8* bss_end = __section_end(".bss"); 
     
    /* Clear the zero-initialized data section */ 
    n = bss_end - bss_start; 
    while(n--) 
      *bss_start++ = 0;     
     
    /* Get addresses for any code sections that need to be copied from ROM to RAM. 
     * The IAR tools have a predefined keyword that can be used to mark individual 
     * functions for execution from RAM. Add "__ramfunc" before the return type in 
     * the function prototype for any routines you need to execute from RAM instead  
     * of ROM. ex: __ramfunc void foo(void); 
     */ 
    uint8* code_relocate_ram = __section_begin("CodeRelocateRam"); 
    uint8* code_relocate = __section_begin("CodeRelocate"); 
    uint8* code_relocate_end = __section_end("CodeRelocate"); 
     
    /* Copy functions from ROM to RAM */ 
    n = code_relocate_end - code_relocate; 
    while (n--) 
      *code_relocate_ram++ = *code_relocate++; 
 
} 
/********************************************************************/