zephyr/subsys/tracing/include/tracing_backend.h

109 lines
2.2 KiB
C

/*
* Copyright (c) 2019 Intel corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _TRACE_BACKEND_H
#define _TRACE_BACKEND_H
#include <string.h>
#include <sys/util.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Tracing backend
* @defgroup Tracing_backend Tracing backend
* @{
* @}
*/
struct tracing_backend;
/**
* @brief Tracing backend API.
*/
struct tracing_backend_api {
void (*init)(void);
void (*output)(const struct tracing_backend *backend,
u8_t *data, u32_t length);
};
/**
* @brief Tracing backend structure.
*/
struct tracing_backend {
const char *name;
const struct tracing_backend_api *api;
};
/**
* @brief Create tracing_backend instance.
*
* @param _name Instance name.
* @param _api Tracing backend API.
*/
#define TRACING_BACKEND_DEFINE(_name, _api) \
static const Z_STRUCT_SECTION_ITERABLE(tracing_backend, _name) = \
{ \
.name = STRINGIFY(_name), \
.api = &_api \
}
/**
* @brief Initialize tracing backend.
*
* @param backend Pointer to tracing_backend instance.
*/
static inline void tracing_backend_init(
const struct tracing_backend *backend)
{
if (backend && backend->api) {
backend->api->init();
}
}
/**
* @brief Output tracing packet with tracing backend.
*
* @param backend Pointer to tracing_backend instance.
* @param data Address of outputing buffer.
* @param length Length of outputing buffer.
*/
static inline void tracing_backend_output(
const struct tracing_backend *backend,
u8_t *data, u32_t length)
{
if (backend && backend->api) {
backend->api->output(backend, data, length);
}
}
/**
* @brief Get tracing backend based on the name of
* tracing backend in tracing backend section.
*
* @param name Name of wanted tracing backend.
*
* @return Pointer of the wanted backend or NULL.
*/
static inline struct tracing_backend *tracing_backend_get(char *name)
{
Z_STRUCT_SECTION_FOREACH(tracing_backend, backend) {
if (strcmp(backend->name, name) == 0) {
return backend;
}
}
return NULL;
}
#ifdef __cplusplus
}
#endif
#endif