Zephyr Project API
3.7.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
init.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2015 Intel Corporation.
3
*
4
* SPDX-License-Identifier: Apache-2.0
5
*/
6
7
#ifndef ZEPHYR_INCLUDE_INIT_H_
8
#define ZEPHYR_INCLUDE_INIT_H_
9
10
#include <
stdint.h
>
11
#include <stddef.h>
12
13
#include <
zephyr/sys/util.h
>
14
#include <
zephyr/toolchain.h
>
15
16
#ifdef __cplusplus
17
extern
"C"
{
18
#endif
19
50
struct
device
;
51
59
union
init_function
{
66
int (*
sys
)(void);
75
int (*
dev
)(
const
struct
device
*
dev
);
76
#ifdef CONFIG_DEVICE_MUTABLE
85
int (*dev_rw)(
struct
device
*
dev
);
86
#endif
87
};
88
103
struct
init_entry
{
105
union
init_function
init_fn
;
110
union
{
111
const
struct
device
*
dev
;
112
#ifdef CONFIG_DEVICE_MUTABLE
113
struct
device
*dev_rw;
114
#endif
115
};
116
};
117
120
/* Helper definitions to evaluate level equality */
121
#define Z_INIT_EARLY_EARLY 1
122
#define Z_INIT_PRE_KERNEL_1_PRE_KERNEL_1 1
123
#define Z_INIT_PRE_KERNEL_2_PRE_KERNEL_2 1
124
#define Z_INIT_POST_KERNEL_POST_KERNEL 1
125
#define Z_INIT_APPLICATION_APPLICATION 1
126
#define Z_INIT_SMP_SMP 1
127
128
/* Init level ordinals */
129
#define Z_INIT_ORD_EARLY 0
130
#define Z_INIT_ORD_PRE_KERNEL_1 1
131
#define Z_INIT_ORD_PRE_KERNEL_2 2
132
#define Z_INIT_ORD_POST_KERNEL 3
133
#define Z_INIT_ORD_APPLICATION 4
134
#define Z_INIT_ORD_SMP 5
135
141
#define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id)
142
150
#define Z_INIT_ENTRY_SECTION(level, prio, sub_prio) \
151
__attribute__((__section__( \
152
".z_init_" #level STRINGIFY(prio)"_" STRINGIFY(sub_prio)"_")))
153
154
155
/* Designated initializers where added to C in C99. There were added to
156
* C++ 20 years later in a much more restricted form. C99 allows many
157
* variations: out of order, mix of designated and not, overlap,
158
* override,... but C++ allows none of these. See differences detailed
159
* in the P0329R0.pdf C++ proposal.
160
* Note __STDC_VERSION__ is undefined when compiling C++.
161
*/
162
#if defined(__STDC_VERSION__) && (__STDC_VERSION__) < 201100
163
164
/* Anonymous unions require C11. Some pre-C11 gcc versions have early
165
* support for anonymous unions but they require these braces when
166
* combined with C99 designated initializers, see longer discussion in
167
* #69411.
168
* These braces are compatible with any C version but not with C++20.
169
*/
170
# define Z_INIT_SYS_INIT_DEV_NULL { .dev = NULL }
171
172
#else
173
174
/* When using -std=c++20 or higher, g++ (v12.2.0) reject braces for
175
* initializing anonymous unions because it is technically a mix of
176
* designated and not designated initializers which is not allowed in
177
* C++. Interestingly, the _same_ g++ version does accept the braces above
178
* when using -std=c++17 or lower!
179
* The tests/lib/cpp/cxx/ added by commit 3d9c428d57bf invoke the C++
180
* compiler with a range of different `-std=...` parameters without needing
181
* any manual configuration.
182
*/
183
# define Z_INIT_SYS_INIT_DEV_NULL .dev = NULL
184
185
#endif
186
197
#define INIT_LEVEL_ORD(level) \
198
COND_CODE_1(Z_INIT_EARLY_##level, (Z_INIT_ORD_EARLY), \
199
(COND_CODE_1(Z_INIT_PRE_KERNEL_1_##level, (Z_INIT_ORD_PRE_KERNEL_1), \
200
(COND_CODE_1(Z_INIT_PRE_KERNEL_2_##level, (Z_INIT_ORD_PRE_KERNEL_2), \
201
(COND_CODE_1(Z_INIT_POST_KERNEL_##level, (Z_INIT_ORD_POST_KERNEL), \
202
(COND_CODE_1(Z_INIT_APPLICATION_##level, (Z_INIT_ORD_APPLICATION), \
203
(COND_CODE_1(Z_INIT_SMP_##level, (Z_INIT_ORD_SMP), \
204
(ZERO_OR_COMPILE_ERROR(0)))))))))))))
205
222
#define SYS_INIT(init_fn, level, prio) \
223
SYS_INIT_NAMED(init_fn, init_fn, level, prio)
224
238
#define SYS_INIT_NAMED(name, init_fn_, level, prio) \
239
static const Z_DECL_ALIGN(struct init_entry) \
240
Z_INIT_ENTRY_SECTION(level, prio, 0) __used __noasan \
241
Z_INIT_ENTRY_NAME(name) = {.init_fn = {.sys = (init_fn_)}, \
242
Z_INIT_SYS_INIT_DEV_NULL}
243
246
#ifdef __cplusplus
247
}
248
#endif
249
250
#endif
/* ZEPHYR_INCLUDE_INIT_H_ */
stdint.h
device
Runtime device structure (in ROM) per driver instance.
Definition
device.h:403
init_entry
Structure to store initialization entry information.
Definition
init.h:103
init_entry::init_fn
union init_function init_fn
Initialization function.
Definition
init.h:105
init_entry::dev
const struct device * dev
Definition
init.h:111
toolchain.h
Macros to abstract toolchain specific capabilities.
init_function
Initialization function for init entries.
Definition
init.h:59
init_function::dev
int(* dev)(const struct device *dev)
Device initialization function.
Definition
init.h:75
init_function::sys
int(* sys)(void)
System initialization function.
Definition
init.h:66
util.h
Misc utilities.
include
zephyr
init.h
Generated on Sun Sep 15 2024 17:01:30 for Zephyr Project API by
1.9.8