startup.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
7  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
9  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
10  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
11  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
12  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
14  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
15  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
16  * THE POSSIBILITY OF SUCH DAMAGE.
17  */
18 
61 #include "startup.h"
62 #include "device_registers.h"
63 #include <stdint.h>
64 
65 
66 /*******************************************************************************
67  * Static Variables
68  ******************************************************************************/
70 
71 /*******************************************************************************
72  * Code
73  ******************************************************************************/
74 
75 /*FUNCTION**********************************************************************
76  *
77  * Function Name : init_data_bss
78  * Description : Make necessary initializations for RAM.
79  * - Copy the vector table from ROM to RAM.
80  * - Copy initialized data from ROM to RAM.
81  * - Copy code that should reside in RAM from ROM
82  * - Clear the zero-initialized data section.
83  *
84  * Tool Chains:
85  * __GNUC__ : GNU Compiler Collection
86  * __ghs__ : Green Hills ARM Compiler
87  * __ICCARM__ : IAR ARM Compiler
88  * __DCC__ : Wind River Diab Compiler
89  *
90  * Implements : init_data_bss_Activity
91  *END**************************************************************************/
92 void init_data_bss(void)
93 {
94  uint32_t n;
95  uint8_t coreId;
96 
97  /* Declare pointers for various data sections. These pointers
98  * are initialized using values pulled in from the linker file */
99  uint8_t * data_ram;
100  uint8_t * code_ram;
101  uint8_t * bss_start;
102  const uint8_t * data_rom, * data_rom_end;
103  const uint8_t * code_rom, * code_rom_end;
104  const uint8_t * bss_end;
105 
106  /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */
107 
108 #if defined(__ARMCC_VERSION)
109  extern uint32_t __RAM_VECTOR_TABLE_SIZE;
110  extern uint32_t __VECTOR_ROM;
111  extern uint32_t __VECTOR_RAM;
112 #else
113  extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
114  extern uint32_t __VECTOR_TABLE[];
115  extern uint32_t __VECTOR_RAM[];
116 #endif
117  /* Get section information from linker files */
118 #if defined(__ICCARM__)
119  /* Data */
120  data_ram = __section_begin(".data");
121  data_rom = __section_begin(".data_init");
122  data_rom_end = __section_end(".data_init");
123 
124  /* CODE RAM */
125  #pragma section = "__CODE_ROM"
126  #pragma section = "__CODE_RAM"
127  code_ram = __section_begin("__CODE_RAM");
128  code_rom = __section_begin("__CODE_ROM");
129  code_rom_end = __section_end("__CODE_ROM");
130 
131  /* BSS */
132  bss_start = __section_begin(".bss");
133  bss_end = __section_end(".bss");
134 #elif defined (__ARMCC_VERSION)
135  extern uint32_t __DATA_ROM;
136  extern uint32_t __DATA_RAM;
137  extern uint32_t __DATA_END;
138 
139  extern uint32_t __CODE_RAM;
140  extern uint32_t __CODE_ROM;
141  extern uint32_t __CODE_END;
142 
143  extern uint32_t __BSS_START;
144  extern uint32_t __BSS_END;
145 
146 
147  /* Data */
148  data_ram = (uint8_t *)__DATA_RAM;
149  data_rom = (uint8_t *)__DATA_ROM;
150  data_rom_end = (uint8_t *)__DATA_END;
151  /* CODE RAM */
152  code_ram = (uint8_t *)__CODE_RAM;
153  code_rom = (uint8_t *)__CODE_ROM;
154  code_rom_end = (uint8_t *)__CODE_END;
155  /* BSS */
156  bss_start = (uint8_t *)__BSS_START;
157  bss_end = (uint8_t *)__BSS_END;
158 
159  /* VECTOR TABLE*/
160  uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE;
161  uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM;
162  uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM;
163 #else
164  extern uint32_t __DATA_ROM[];
165  extern uint32_t __DATA_RAM[];
166  extern uint32_t __DATA_END[];
167 
168  extern uint32_t __CODE_RAM[];
169  extern uint32_t __CODE_ROM[];
170  extern uint32_t __CODE_END[];
171 
172  extern uint32_t __BSS_START[];
173  extern uint32_t __BSS_END[];
174 
175  /* Data */
176  data_ram = (uint8_t *)__DATA_RAM;
177  data_rom = (uint8_t *)__DATA_ROM;
178  data_rom_end = (uint8_t *)__DATA_END;
179  /* CODE RAM */
180  code_ram = (uint8_t *)__CODE_RAM;
181  code_rom = (uint8_t *)__CODE_ROM;
182  code_rom_end = (uint8_t *)__CODE_END;
183  /* BSS */
184  bss_start = (uint8_t *)__BSS_START;
185  bss_end = (uint8_t *)__BSS_END;
186 #endif
187 
188 
189  /* Copy initialized data from ROM to RAM */
190  while (data_rom_end != data_rom)
191  {
192  *data_ram = *data_rom;
193  data_ram++;
194  data_rom++;
195  }
196 
197  /* Copy functions from ROM to RAM */
198  while (code_rom_end != code_rom)
199  {
200  *code_ram = *code_rom;
201  code_ram++;
202  code_rom++;
203  }
204 
205  /* Clear the zero-initialized data section */
206  while(bss_end != bss_start)
207  {
208  *bss_start = 0;
209  bss_start++;
210  }
211 
212  coreId = (uint8_t)GET_CORE_ID();
213 #if defined (__ARMCC_VERSION)
214  /* Copy the vector table from ROM to RAM */
215  /* Workaround */
216  for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++)
217  {
218  vector_ram[n] = vector_rom[n];
219  }
220  /* Point the VTOR to the position of vector table */
221  *s_vectors[coreId] = (uint32_t) __VECTOR_RAM;
222 #else
223  /* Check if VECTOR_TABLE copy is needed */
224  if (__VECTOR_RAM != __VECTOR_TABLE)
225  {
226  /* Copy the vector table from ROM to RAM */
227  for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++)
228  {
229  __VECTOR_RAM[n] = __VECTOR_TABLE[n];
230  }
231  /* Point the VTOR to the position of vector table */
232  *s_vectors[coreId] = (uint32_t)__VECTOR_RAM;
233  }
234  else
235  {
236  /* Point the VTOR to the position of vector table */
237  *s_vectors[coreId] = (uint32_t)__VECTOR_TABLE;
238  }
239 #endif
240 
241 }
242 
243 /*******************************************************************************
244  * EOF
245  ******************************************************************************/
246 
uint32_t __VECTOR_RAM[((uint32_t)(FEATURE_INTERRUPT_IRQ_MAX))+16U+1U]
Declaration of vector table. FEATURE_INTERRUPT_IRQ_MAX is the highest interrupt request number...
void init_data_bss(void)
Make necessary initializations for RAM.
Definition: startup.c:92
static volatile uint32_t * s_vectors[(1u)]
Definition: startup.c:69
#define FEATURE_INTERRUPT_INT_VECTORS
#define GET_CORE_ID()
Get Core ID.
Definition: s32_core_cm0.h:157
#define NUMBER_OF_CORES