1 /*
2 * Copyright (c) 2024 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #ifndef _PICO_RUNTIME_INITS_H
8 #define _PICO_RUNTIME_INITS_H
9
10 #include "pico.h"
11 #include "pico/runtime.h"
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 /** \file pico/runtime_init.h
18 * \defgroup pico_runtime_init pico_runtime_init
19 *
20 * \brief Main runtime initialization functions required to set up the runtime environment before entering main
21 *
22 * The runtime initialization is registration based:
23 *
24 * For each step of the initialization there is a 5 digit ordinal which indicates
25 * the ordering (alphabetic increasing sort of the 5 digits) of the steps.
26 *
27 * e.g. for the step "bootrom_reset", there is:
28 *
29 * \code
30 * #ifndef PICO_RUNTIME_INIT_BOOTROM_RESET
31 * #define PICO_RUNTIME_INIT_BOOTROM_RESET "00050"
32 * #endif
33 * \endcode
34 *
35 * The user can override the order if they wish, by redefining PICO_RUNTIME_INIT_BOOTROM_RESET
36 *
37 * For each step, the automatic initialization may be skipped by defining (in this case)
38 * PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET = 1. The user can then choose to either omit the step
39 * completely or register their own replacement initialization.
40 *
41 * The default method used to perform the initialization is provided, in case the user
42 * wishes to call it manually; in this case:
43 *
44 * \code
45 * void runtime_init_bootrom_reset(void);
46 * \endcode
47 *
48 * If PICO_RUNTIME_NO_INIT_BOOTOROM_RESET define is set (NO vs SKIP above), then the function
49 * is not defined, allowing the user to provide a replacement (and also avoiding
50 * cases where the default implementation won't compile due to missing dependencies)
51 */
52
53 // must have no dependency on any other initialization code
54 #define PICO_RUNTIME_INIT_EARLIEST "00001"
55
56 // -----------------------------------------------------------------------------------------------
57 // Reset of global bootrom state (can be skipped if boot path was via bootrom); not used on RP2040
58 // -----------------------------------------------------------------------------------------------
59 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET, Skip calling of `runtime_init_bootrom_reset` function during runtime init, type=bool, default=1 on RP2040, group=pico_runtime_init
60 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_BOOTROM_RESET, Do not include SDK implementation of `runtime_init_bootrom_reset` function, type=bool, default=1 on RP2040, group=pico_runtime_init
61
62 #ifndef PICO_RUNTIME_INIT_BOOTROM_RESET
63 #define PICO_RUNTIME_INIT_BOOTROM_RESET "00050"
64 #endif
65
66 #ifndef PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET
67 #if PICO_RP2040 || (!LIB_PICO_MULTICORE && PICO_NO_FLASH)
68 #define PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET 1
69 #endif
70 #endif
71
72 #ifndef PICO_RUNTIME_NO_INIT_BOOTROM_RESET
73 #if PICO_RP2040 || (!LIB_PICO_MULTICORE && PICO_NO_FLASH)
74 #define PICO_RUNTIME_NO_INIT_BOOTROM_RESET 1
75 #endif
76 #endif
77
78 #ifndef __ASSEMBLER__
79 void runtime_init_bootrom_reset(void);
80 #endif
81
82 // ---------------------------------------------------------------------------------------
83 // Non-boot core eset of bootrom state, not needed if only using core 0 not used on RP2040
84 // ---------------------------------------------------------------------------------------
85 #ifndef PICO_RUNTIME_INIT_PER_CORE_BOOTROM_RESET
86 #define PICO_RUNTIME_INIT_PER_CORE_BOOTROM_RESET "00051"
87 #endif
88
89 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_BOOTROM_RESET, Skip calling of `runtime_init_per_core_bootrom_reset` function during per-core init, type=bool, default=1 on RP2040, group=pico_runtime_init
90 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_PER_CORE_BOOTROM_RESET, Do not include SDK implementation of `runtime_init_per_core_bootrom_reset` function, type=bool, default=1 on RP2040, group=pico_runtime_init
91 #ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_BOOTROM_RESET
92 #if PICO_RP2040
93 #define PICO_RUNTIME_SKIP_INIT_PER_CORE_BOOTROM_RESET 1
94 #endif
95 #endif
96
97 #ifndef PICO_RUNTIME_NO_INIT_PER_CORE_BOOTROM_RESET
98 #if PICO_RP2040
99 #define PICO_RUNTIME_NO_INIT_PER_CORE_BOOTROM_RESET 1
100 #endif
101 #endif
102
103 #ifndef __ASSEMBLER__
104 void runtime_init_per_core_bootrom_reset(void);
105 #endif
106
107 // ---------------------------
108 // Hazard3 processor IRQ setup
109 // ---------------------------
110
111 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_H3_IRQ_REGISTERS, Skip calling of `runtime_init_per_core_h3_irq_registers` function during per-core init, type=bool, default=1 on non RISC-V, group=pico_runtime_init
112
113 #ifndef PICO_RUNTIME_INIT_PER_CORE_H3_IRQ_REGISTERS
114 #define PICO_RUNTIME_INIT_PER_CORE_H3_IRQ_REGISTERS "00060"
115 #endif
116
117 #ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_H3_IRQ_REGISTERS
118 #ifndef __riscv
119 #define PICO_RUNTIME_SKIP_INIT_PER_CORE_H3_IRQ_REGISTERS 1
120 #endif
121 #endif
122
123 // -------------------------------
124 // Earliest resets (no clocks yet)
125 // -------------------------------
126 #ifndef PICO_RUNTIME_INIT_EARLY_RESETS
127 #define PICO_RUNTIME_INIT_EARLY_RESETS "00100"
128 #endif
129
130 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_EARLY_RESETS, Skip calling of `runtime_init_early_resets` function during runtime init, type=bool, default=1 on RP2040, group=pico_runtime_init
131 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_EARLY_RESETS, Do not include SDK implementation of `runtime_init_early_resets` function, type=bool, default=1 on RP2040, group=pico_runtime_init
132 #ifndef PICO_RUNTIME_SKIP_INIT_EARLY_RESETS
133 #define PICO_RUNTIME_SKIP_INIT_EARLY_RESETS 0
134 #endif
135
136 #ifndef PICO_RUNTIME_NO_INIT_EARLY_RESETS
137 #define PICO_RUNTIME_NO_INIT_EARLY_RESETS 0
138 #endif
139
140 #ifndef __ASSEMBLER__
141 void runtime_init_early_resets(void);
142 #endif
143
144 // --------------
145 // USB power down
146 // --------------
147 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_USB_POWER_DOWN, Skip calling of `runtime_init_usb_power_down` function during runtime init, type=bool, default=0, group=pico_runtime_init
148 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_USB_POWER_DOWN, Do not include SDK implementation of `runtime_init_usb_power_down` function, type=bool, default=0, group=pico_runtime_init
149
150 #ifndef PICO_RUNTIME_INIT_USB_POWER_DOWN
151 #define PICO_RUNTIME_INIT_USB_POWER_DOWN "00101"
152 #endif
153
154 #ifndef PICO_RUNTIME_SKIP_INIT_USB_POWER_DOWN
155 #define PICO_RUNTIME_SKIP_INIT_USB_POWER_DOWN 0
156 #endif
157
158 #ifndef PICO_RUNTIME_NO_INIT_USB_POWER_DOWN
159 #define PICO_RUNTIME_NO_INIT_USB_POWER_DOWN 0
160 #endif
161
162 #ifndef __ASSEMBLER__
163 void runtime_init_usb_power_down(void);
164 #endif
165
166 // ------------------------------------
167 // per core co-processor initialization
168 // ------------------------------------
169
170 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_ENABLE_COPROCESSORS, Skip calling of `runtime_init_per_core_enable_coprocessors` function during per-core init, type=bool, default=1 on RP2040 or RISC-V, group=pico_runtime_init
171 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_PER_CORE_ENABLE_COPROCESSORS, Do not include SDK implementation of `runtime_init_per_core_enable_coprocessors` function, type=bool, default=1 on RP2040 or RISC-V, group=pico_runtime_init
172
173 #ifndef PICO_RUNTIME_INIT_PER_CORE_ENABLE_COPROCESSORS
174 #define PICO_RUNTIME_INIT_PER_CORE_ENABLE_COPROCESSORS "00200"
175 #endif
176
177 #ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_ENABLE_COPROCESSORS
178 #if PICO_RP2040 || defined(__riscv)
179 #define PICO_RUNTIME_SKIP_INIT_PER_CORE_ENABLE_COPROCESSORS 1
180 #endif
181 #endif
182
183 #ifndef PICO_RUNTIME_NO_INIT_PER_CORE_ENABLE_COPROCESSORS
184 #if PICO_RP2040 || defined(__riscv)
185 #define PICO_RUNTIME_NO_INIT_PER_CORE_ENABLE_COPROCESSORS 1
186 #endif
187 #endif
188
189 #ifndef __ASSEMBLER__
190 void runtime_init_per_core_enable_coprocessors(void);
191 #endif
192
193 // AEABI init; this initialization is auto-injected byte pico_aeebi_mem_ops if present
194 #ifndef PICO_RUNTIME_INIT_AEABI_MEM_OPS
195 // on RP2040 we need to get memcpy and memset hooked up to bootrom
196 #define PICO_RUNTIME_INIT_AEABI_MEM_OPS "00300"
197 #endif
198
199 // AEABI init; this initialization is auto-injected byte pico_aeebi_bit_ops if present
200 #ifndef PICO_RUNTIME_INIT_AEABI_BIT_OPS
201 #define PICO_RUNTIME_INIT_AEABI_BIT_OPS "00275"
202 #endif
203
204 // AEABI init; this initialization is auto-injected byte pico_aeebi_float if present
205 #ifndef PICO_RUNTIME_INIT_AEABI_FLOAT
206 #define PICO_RUNTIME_INIT_AEABI_FLOAT "00350"
207 #endif
208
209 // AEABI init; this initialization is auto-injected byte pico_aeebi_double if present
210 #ifndef PICO_RUNTIME_INIT_AEABI_DOUBLE
211 #define PICO_RUNTIME_INIT_AEABI_DOUBLE "00350"
212 #endif
213
214 // ------------------------
215 // Initialization of clocks
216 // ------------------------
217 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_CLOCKS, Skip calling of `runtime_init_clocks` function during runtime init, type=bool, default=0, group=pico_runtime_init
218 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_CLOCKS, Do not include SDK implementation of `runtime_init_clocks` function, type=bool, default=0, group=pico_runtime_init
219
220 #ifndef PICO_RUNTIME_INIT_CLOCKS
221 // on RP2040 we need some of the AEABI init by this point to do clock math
222 #define PICO_RUNTIME_INIT_CLOCKS "00500"
223 #endif
224
225 #ifndef PICO_RUNTIME_SKIP_INIT_CLOCKS
226 #define PICO_RUNTIME_SKIP_INIT_CLOCKS 0
227 #endif
228
229 #ifndef PICO_RUNTIME_NO_INIT_CLOCKS
230 #define PICO_RUNTIME_NO_INIT_CLOCKS 0
231 #endif
232 #ifndef __ASSEMBLER__
233 void runtime_init_clocks(void);
234
235 /*! \brief Initialise the clock hardware
236 * \ingroup pico_runtime_init
237 *
238 * Must be called before any other clock function.
239 */
clocks_init(void)240 static inline void clocks_init(void) {
241 // backwards compatibility with earlier SDK
242 runtime_init_clocks();
243 }
244 #endif
245
246 // ----------------------------------------
247 // Remaining h/w initialization post clocks
248 // ----------------------------------------
249 #ifndef PICO_RUNTIME_INIT_POST_CLOCK_RESETS
250 #define PICO_RUNTIME_INIT_POST_CLOCK_RESETS "00600"
251 #endif
252
253 // PICO_RUNTIME_INIT_POST_CLOCKS_RESETS defaults to 0
254 #ifndef __ASSEMBLER__
255 void runtime_init_post_clock_resets(void);
256 #endif
257
258 // ----------------------------------------
259 // RP2040 IE disable for GPIO 26-29
260 // ----------------------------------------
261
262 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_RP2040_GPIO_IE_DISABLE, Skip calling of `runtime_init_rp2040_gpio_ie_disable` function during runtime init, type=bool, default=0 on RP2040, group=pico_runtime_init
263 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_RP2040_GPIO_IE_DISABLE, Do not include SDK implementation of `runtime_init_rp2040_gpio_ie_disable` function, type=bool, default=0 on RP2040, group=pico_runtime_init
264
265 #ifndef PICO_RUNTIME_INIT_RP2040_GPIO_IE_DISABLE
266 #define PICO_RUNTIME_INIT_RP2040_GPIO_IE_DISABLE "00700"
267 #endif
268
269 #ifndef PICO_RUNTIME_SKIP_INIT_RP2040_GPIO_IE_DISABLE
270 #if !PICO_RP2040 || PICO_IE_26_29_UNCHANGED_ON_RESET
271 #define PICO_RUNTIME_SKIP_INIT_RP2040_GPIO_IE_DISABLE 1
272 #endif
273 #endif
274 #ifndef PICO_RUNTIME_NO_INIT_RP2040_GPIO_IE_DISABLE
275 #if !PICO_RP2040
276 #define PICO_RUNTIME_NO_INIT_RP2040_GPIO_IE_DISABLE 1
277 #endif
278 #endif
279
280 #ifndef __ASSEMBLER__
281 void runtime_init_rp2040_gpio_ie_disable(void);
282 #endif
283
284 // -----------------------------
285 // Reset all spin SIO spin locks
286 // -----------------------------
287
288 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_SPIN_LOCKS_RESET, Skip calling of `runtime_init_spin_locks_reset` function during runtime init, type=bool, default=0, group=pico_runtime_init
289 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_SPIN_LOCKS_RESET, Do not include SDK implementation of `runtime_init_spin_locks_reset` function, type=bool, default=0, group=pico_runtime_init
290
291 #ifndef PICO_RUNTIME_INIT_SPIN_LOCKS_RESET
292 // clearing of all spin locks
293 #define PICO_RUNTIME_INIT_SPIN_LOCKS_RESET "01000"
294 #endif
295
296 #ifndef PICO_RUNTIME_SKIP_INIT_SPIN_LOCKS_RESET
297 #define PICO_RUNTIME_SKIP_INIT_SPIN_LOCKS_RESET 0
298 #endif
299
300 #ifndef PICO_RUNTIME_NO_INIT_SPIN_LOCKS_RESET
301 #define PICO_RUNTIME_NO_INIT_SPIN_LOCKS_RESET 0
302 #endif
303
304 #ifndef __ASSEMBLER__
305 void runtime_init_spin_locks_reset(void);
306 #endif
307
308 // -----------------------------
309 // Reset all bootram boot locks
310 // -----------------------------
311
312 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_BOOT_LOCKS_RESET, Skip calling of `runtime_init_boot_locks_reset` function during runtime init, type=bool, default=0, group=pico_runtime_init
313
314 #ifndef PICO_RUNTIME_INIT_BOOT_LOCKS_RESET
315 // clearing of all spin locks
316 #define PICO_RUNTIME_INIT_BOOT_LOCKS_RESET "01000"
317 #endif
318
319 #ifndef PICO_RUNTIME_SKIP_INIT_BOOT_LOCKS_RESET
320 #define PICO_RUNTIME_SKIP_INIT_BOOT_LOCKS_RESET 0
321 #endif
322 #ifndef __ASSEMBLER__
323 void runtime_init_boot_locks_reset(void);
324 #endif
325
326 // ------------------------------
327 // Enable bootrom locking support
328 // ------------------------------
329 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_BOOTROM_LOCKING_ENABLE, Skip calling of `runtime_init_bootrom_locking_enable` function during runtime init, type=bool, default=0, group=pico_runtime_init
330 #ifndef PICO_RUNTIME_INIT_BOOTROM_LOCKING_ENABLE
331 // clearing of all spin locks
332 #define PICO_RUNTIME_INIT_BOOTROM_LOCKING_ENABLE "01010"
333 #endif
334
335 #ifndef PICO_RUNTIME_SKIP_INIT_BOOTROM_LOCKING_ENABLE
336 #define PICO_RUNTIME_SKIP_INIT_BOOTROM_LOCKING_ENABLE 0
337 #endif
338
339 #ifndef __ASSEMBLER__
340 void runtime_init_bootrom_locking_enable(void);
341 #endif
342
343 // PICO_RUNTIME_INIT_MUTEX is registered automatically by pico_sync
344 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_MUTEX, Skip calling of `runtime_init_mutex` function during runtime init, type=bool, default=0, group=pico_runtime_init
345 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_MUTEX, Do not include SDK implementation of `runtime_init_mutex` function, type=bool, default=0, group=pico_runtime_init
346
347 #ifndef PICO_RUNTIME_INIT_MUTEX
348 // depends on SPIN_LOCKS
349 // initialize auto_init mutexes
350 #define PICO_RUNTIME_INIT_MUTEX "01100"
351 #endif
352
353 #ifndef PICO_RUNTIME_SKIP_INIT_MUTEX
354 #define PICO_RUNTIME_SKIP_INIT_MUTEX 0
355 #endif
356
357 #ifndef PICO_RUNTIME_NO_INIT_MUTEX
358 #define PICO_RUNTIME_NO_INIT_MUTEX 0
359 #endif
360
361 // ------------------------------------------------------------
362 // Initialization of IRQs, added by hardware_irq
363 // ------------------------------------------------------------
364
365 #ifndef PICO_RUNTIME_INIT_PER_CORE_IRQ_PRIORITIES
366 #define PICO_RUNTIME_INIT_PER_CORE_IRQ_PRIORITIES "01200"
367 #endif
368
369 // PICO_RUNTIME_SKIP_INIT_PER_CORE_TLS_SETUP defaults to 0
370 #ifndef PICO_RUNTIME_INIT_PER_CORE_TLS_SETUP
371 #define PICO_RUNTIME_INIT_PER_CORE_TLS_SETUP "10060"
372 #endif
373
374 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_INSTALL_RAM_VECTOR_TABLE, Skip calling of `runtime_init_install_ram_vector_table` function during runtime init, type=bool, default=0 unless RISC-V or RAM binary, group=pico_runtime_init
375 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_INSTALL_RAM_VECTOR_TABLE, Do not include SDK implementation of `runtime_init_install_ram_vector_table` function, type=bool, default=0 unless RISC-V or RAM binary, group=pico_runtime_init
376 #ifndef PICO_RUNTIME_INIT_INSTALL_RAM_VECTOR_TABLE
377 #define PICO_RUNTIME_INIT_INSTALL_RAM_VECTOR_TABLE "10080"
378 #endif
379
380 // ------------------------------------------------------
381 // Copy of ROM vector table to RAM; not used on RISC-V or
382 // no_flash which has a RAM vector table anyway
383 // ------------------------------------------------------
384
385 #ifndef PICO_RUNTIME_SKIP_INIT_INSTALL_RAM_VECTOR_TABLE
386 #if PICO_NO_RAM_VECTOR_TABLE || PICO_NO_FLASH || defined(__riscv)
387 #define PICO_RUNTIME_SKIP_INIT_INSTALL_RAM_VECTOR_TABLE 1
388 #endif
389 #endif
390
391 #ifndef PICO_RUNTIME_NO_INIT_INSTALL_RAM_VECTOR_TABLE
392 #if PICO_NO_RAM_VECTOR_TABLE || PICO_NO_FLASH || defined(__riscv)
393 #define PICO_RUNTIME_NO_INIT_INSTALL_RAM_VECTOR_TABLE 1
394 #endif
395 #endif
396
397 // ------------------------------------------------------------
398 // Default alarm pool initialization, added by pico_time unless
399 // PICO_TIME_DEFAULT_ALARM_POOL_DISABLED == 1
400 // ------------------------------------------------------------
401 #ifndef PICO_RUNTIME_INIT_DEFAULT_ALARM_POOL
402 #define PICO_RUNTIME_INIT_DEFAULT_ALARM_POOL "11000"
403 #endif
404
405 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_DEFAULT_ALARM_POOL, Skip calling of `runtime_init_default_alarm_pool` function during runtime init, type=bool, default=1 if `PICO_TIME_DEFAULT_ALARM_POOL_DISABLED` is 1, group=pico_runtime_init
406 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_DEFAULT_ALARM_POOL, Do not include SDK implementation of `runtime_init_default_alarm_pool` function, type=bool, default=1 if `PICO_TIME_DEFAULT_ALARM_POOL_DISABLED` is , group=pico_runtime_init
407 #ifndef PICO_RUNTIME_SKIP_INIT_DEFAULT_ALARM_POOL
408 #if PICO_TIME_DEFAULT_ALARM_POOL_DISABLED
409 #define PICO_RUNTIME_SKIP_INIT_DEFAULT_ALARM_POOL 1
410 #endif
411 #endif
412
413 #ifndef PICO_RUNTIME_NO_INIT_DEFAULT_ALARM_POOL
414 #if PICO_TIME_DEFAULT_ALARM_POOL_DISABLED
415 #define PICO_RUNTIME_NO_INIT_DEFAULT_ALARM_POOL 1
416 #endif
417 #endif
418
419 // ------------------------------------------------------------------------------------------------
420 // stack guard; these are a special case as they take a parameter; however the normal defines apply
421 // ------------------------------------------------------------------------------------------------
422
423 // PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_INSTALL_STACK_GUARD, Skip calling of `runtime_init_per_core_install_stack_guard` function during runtime init, type=bool, default=1 unless `PICO_USE_STACK_GUARDS` is 1, group=pico_runtime_init
424 // PICO_CONFIG: PICO_RUNTIME_NO_INIT_PER_CORE_INSTALL_STACK_GUARD, Do not include SDK implementation of `runtime_init_per_core_install_stack_guard` function, type=bool, default=1 unless `PICO_USE_STACK_GUARDS` is 1, group=pico_runtime_init
425
426 #ifndef PICO_RUNTIME_INIT_PER_CORE_INSTALL_STACK_GUARD
427 #define PICO_RUNTIME_INIT_PER_CORE_INSTALL_STACK_GUARD "10050"
428 #endif
429
430 #ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_INSTALL_STACK_GUARD
431 #if !PICO_USE_STACK_GUARDS
432 #define PICO_RUNTIME_SKIP_INIT_PER_CORE_INSTALL_STACK_GUARD 1
433 #endif
434 #endif
435
436 #ifndef PICO_RUNTIME_NO_INIT_PER_CORE_INSTALL_STACK_GUARD
437 #if !PICO_USE_STACK_GUARDS
438 #define PICO_RUNTIME_NO_INIT_PER_CORE_INSTALL_STACK_GUARD 1
439 #endif
440 #endif
441
442 #ifndef __ASSEMBLER__
443 void runtime_init_per_core_install_stack_guard(void *stack_bottom);
444 // backwards compatibility
runtime_install_stack_guard(void * stack_bottom)445 static __force_inline void runtime_install_stack_guard(void *stack_bottom) {
446 runtime_init_per_core_install_stack_guard(stack_bottom);
447 }
448
449 #endif
450
451 #ifdef __cplusplus
452 }
453 #endif
454
455 #endif