Zephyr Project API 4.1.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
log.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_H_
8#define ZEPHYR_INCLUDE_LOGGING_LOG_H_
9
13
14#if CONFIG_USERSPACE && CONFIG_LOG_ALWAYS_RUNTIME
16#endif
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
48#define LOG_ERR(...) Z_LOG(LOG_LEVEL_ERR, __VA_ARGS__)
49
59#define LOG_WRN(...) Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__)
60
69#define LOG_INF(...) Z_LOG(LOG_LEVEL_INF, __VA_ARGS__)
70
79#define LOG_DBG(...) Z_LOG(LOG_LEVEL_DBG, __VA_ARGS__)
80
90#define LOG_WRN_ONCE(...) \
91 do { \
92 static uint8_t __warned; \
93 if (unlikely(__warned == 0)) { \
94 Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__); \
95 __warned = 1; \
96 } \
97 } while (0)
98
108#define LOG_PRINTK(...) Z_LOG_PRINTK(0, __VA_ARGS__)
109
118#define LOG_RAW(...) Z_LOG_PRINTK(1, __VA_ARGS__)
119
132#define LOG_INST_ERR(_log_inst, ...) \
133 Z_LOG_INSTANCE(LOG_LEVEL_ERR, _log_inst, __VA_ARGS__)
134
148#define LOG_INST_WRN(_log_inst, ...) \
149 Z_LOG_INSTANCE(LOG_LEVEL_WRN, _log_inst, __VA_ARGS__)
150
163#define LOG_INST_INF(_log_inst, ...) \
164 Z_LOG_INSTANCE(LOG_LEVEL_INF, _log_inst, __VA_ARGS__)
165
178#define LOG_INST_DBG(_log_inst, ...) \
179 Z_LOG_INSTANCE(LOG_LEVEL_DBG, _log_inst, __VA_ARGS__)
180
191#define LOG_HEXDUMP_ERR(_data, _length, _str) \
192 Z_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, (_str))
193
204#define LOG_HEXDUMP_WRN(_data, _length, _str) \
205 Z_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, (_str))
206
216#define LOG_HEXDUMP_INF(_data, _length, _str) \
217 Z_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, (_str))
218
228#define LOG_HEXDUMP_DBG(_data, _length, _str) \
229 Z_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, (_str))
230
245#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
246 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
247
260#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
261 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
262
274#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
275 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
276
288#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
289 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
290
303void z_log_vprintk(const char *fmt, va_list ap);
304
305#ifdef __cplusplus
306}
307#define LOG_IN_CPLUSPLUS 1
308#endif
309/* Macro expects that optionally on second argument local log level is provided.
310 * If provided it is returned, otherwise default log level is returned or
311 * LOG_LEVEL, if it was locally defined.
312 */
313#if !defined(CONFIG_LOG)
314#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
315#else
316#define _LOG_LEVEL_RESOLVE(...) \
317 Z_LOG_EVAL(COND_CODE_0(LOG_LEVEL, (1), (LOG_LEVEL)), \
318 (GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
319 (GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
320#endif
321
322/* Return first argument */
323#define _LOG_ARG1(arg1, ...) arg1
324
325#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
326 IF_ENABLED(CONFIG_LOG_FMT_SECTION, ( \
327 static const char UTIL_CAT(_name, _str)[] \
328 __in_section(_log_strings, static, _CONCAT(_name, _)) __used __noasan = \
329 STRINGIFY(_name);)) \
330 IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
331 const STRUCT_SECTION_ITERABLE_ALTERNATE(log_const, \
332 log_source_const_data, \
333 Z_LOG_ITEM_CONST_DATA(_name)) = \
334 { \
335 .name = COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
336 (UTIL_CAT(_name, _str)), (STRINGIFY(_name))), \
337 .level = (_level) \
338 }
339
340#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
341 STRUCT_SECTION_ITERABLE_ALTERNATE(log_dynamic, log_source_dynamic_data, \
342 LOG_ITEM_DYNAMIC_DATA(_name))
343
344#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
345 IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
346 (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
347
348#define _LOG_MODULE_DATA_CREATE(_name, _level) \
349 _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
350 _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
351
352/* Determine if data for the module shall be created. It is created if logging
353 * is enabled, override level is set or module specific level is set (not off).
354 */
355#define Z_DO_LOG_MODULE_REGISTER(...) \
356 COND_CODE_1(CONFIG_LOG, \
357 (Z_LOG_EVAL(CONFIG_LOG_OVERRIDE_LEVEL, \
358 (1), \
359 (Z_LOG_EVAL(_LOG_LEVEL_RESOLVE(__VA_ARGS__), (1), (0))) \
360 )), (0))
361
362/* Determine if the data of the log module shall be in the partition
363 * 'k_log_partition' to allow a user mode thread access to this data.
364 */
365#if CONFIG_USERSPACE && CONFIG_LOG_ALWAYS_RUNTIME
366extern struct k_mem_partition k_log_partition;
367#define Z_LOG_MODULE_PARTITION(_k_app_mem) _k_app_mem(k_log_partition)
368#else
369#define Z_LOG_MODULE_PARTITION(_k_app_mem)
370#endif
371
403#define LOG_MODULE_REGISTER(...) \
404 COND_CODE_1( \
405 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__), \
406 (_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
407 _LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
408 () \
409 ) \
410 LOG_MODULE_DECLARE(__VA_ARGS__)
411
438#define LOG_MODULE_DECLARE(...) \
439 extern const struct log_source_const_data \
440 Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)); \
441 extern struct log_source_dynamic_data \
442 LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
443 \
444 Z_LOG_MODULE_PARTITION(K_APP_DMEM) \
445 static const struct log_source_const_data * \
446 __log_current_const_data __unused = \
447 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) ? \
448 &Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
449 NULL; \
450 \
451 Z_LOG_MODULE_PARTITION(K_APP_DMEM) \
452 static struct log_source_dynamic_data * \
453 __log_current_dynamic_data __unused = \
454 (Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) && \
455 IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
456 &LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
457 NULL; \
458 \
459 Z_LOG_MODULE_PARTITION(K_APP_BMEM) \
460 static const uint32_t __log_level __unused = \
461 _LOG_LEVEL_RESOLVE(__VA_ARGS__)
462
470#define LOG_LEVEL_SET(level) static const uint32_t __log_level __unused = \
471 Z_LOG_RESOLVED_LEVEL(level, 0)
472
473#ifdef CONFIG_LOG_CUSTOM_HEADER
474/* This include must always be at the end of log.h */
475#include <zephyr_custom_log.h>
476#endif
477
478/*
479 * Eclipse CDT or JetBrains Clion parser is sometimes confused by logging API
480 * code and freezes the whole IDE. Following lines hides LOG_x macros from them.
481 */
482#if defined(__CDT_PARSER__) || defined(__JETBRAINS_IDE__)
483#undef LOG_ERR
484#undef LOG_WRN
485#undef LOG_INF
486#undef LOG_DBG
487
488#undef LOG_HEXDUMP_ERR
489#undef LOG_HEXDUMP_WRN
490#undef LOG_HEXDUMP_INF
491#undef LOG_HEXDUMP_DBG
492
493#define LOG_ERR(...) (void) 0
494#define LOG_WRN(...) (void) 0
495#define LOG_DBG(...) (void) 0
496#define LOG_INF(...) (void) 0
497
498#define LOG_HEXDUMP_ERR(...) (void) 0
499#define LOG_HEXDUMP_WRN(...) (void) 0
500#define LOG_HEXDUMP_DBG(...) (void) 0
501#define LOG_HEXDUMP_INF(...) (void) 0
502#endif
503
508#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_H_ */
Memory Partition.
Definition mem_domain.h:55