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)39 void 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