1 #include <stdint.h> 2 3 #define __STARTUP_CLEAR_BSS 1 4 5 /*---------------------------------------------------------------------------- 6 Linker generated Symbols 7 *----------------------------------------------------------------------------*/ 8 extern uint32_t __itcm_load_addr; 9 extern uint32_t __dtcm_load_addr; 10 extern uint32_t __system_ram_load_addr; 11 extern uint32_t __ram_load_addr; 12 extern uint32_t __nocache_ram_load_addr; 13 14 extern uint32_t __text_code_start__; 15 extern uint32_t __text_code_end__; 16 extern uint32_t __tcm_code_start__; 17 extern uint32_t __tcm_code_end__; 18 extern uint32_t __tcm_data_start__; 19 extern uint32_t __tcm_data_end__; 20 extern uint32_t __ram_data_start__; 21 extern uint32_t __ram_data_end__; 22 extern uint32_t __bss_start__; 23 extern uint32_t __bss_end__; 24 extern uint32_t __noinit_data_start__; 25 extern uint32_t __noinit_data_end__; 26 extern uint32_t __nocache_ram_data_start__; 27 extern uint32_t __nocache_ram_data_end__; 28 29 extern uint32_t __StackTop; 30 extern uint32_t __StackLimit; 31 extern uint32_t __HeapBase; 32 extern uint32_t __HeapLimit; 33 34 //extern uint32_t __copy_table_start__; 35 //extern uint32_t __copy_table_end__; 36 //extern uint32_t __zero_table_start__; 37 //extern uint32_t __zero_table_end__; 38 start_load(void)39void start_load(void) 40 { 41 uint32_t *pSrc, *pDest; 42 uint32_t *pTable __attribute__((unused)); 43 44 /* Copy ITCM code */ 45 pSrc = &__itcm_load_addr; 46 pDest = &__tcm_code_start__; 47 48 for (; pDest < &__tcm_code_end__;) { 49 *pDest++ = *pSrc++; 50 } 51 52 /* Copy DTCM code */ 53 pSrc = &__dtcm_load_addr; 54 pDest = &__tcm_data_start__; 55 56 for (; pDest < &__tcm_data_end__;) { 57 *pDest++ = *pSrc++; 58 } 59 60 /* BF Add OCARAM data copy */ 61 pSrc = &__ram_load_addr; 62 pDest = &__ram_data_start__; 63 64 for (; pDest < &__ram_data_end__;) { 65 *pDest++ = *pSrc++; 66 } 67 68 /* BF Add no cache ram data copy */ 69 pSrc = &__nocache_ram_load_addr; 70 pDest = &__nocache_ram_data_start__; 71 72 for (; pDest < &__nocache_ram_data_end__;) { 73 *pDest++ = *pSrc++; 74 } 75 76 #ifdef __STARTUP_CLEAR_BSS 77 /* Single BSS section scheme. 78 * 79 * The BSS section is specified by following symbols 80 * __bss_start__: start of the BSS section. 81 * __bss_end__: end of the BSS section. 82 * 83 * Both addresses must be aligned to 4 bytes boundary. 84 */ 85 pDest = &__bss_start__; 86 87 for (; pDest < &__bss_end__;) { 88 *pDest++ = 0ul; 89 } 90 91 #endif 92 } 93