77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
/*
|
|
* Copyright (c) 2018 Oticon A/S
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef SUBSYS_DEBUG_TRACING_BOTTOMS_POSIX_CTF_BOTTOM_H
|
|
#define SUBSYS_DEBUG_TRACING_BOTTOMS_POSIX_CTF_BOTTOM_H
|
|
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <zephyr/types.h>
|
|
#include <ctf_map.h>
|
|
|
|
|
|
/* Obtain a field's size at compile-time.
|
|
* Internal to this bottom-layer.
|
|
*/
|
|
#define CTF_BOTTOM_INTERNAL_FIELD_SIZE(x) + sizeof(x)
|
|
|
|
/* Append a field to current event-packet.
|
|
* Internal to this bottom-layer.
|
|
*/
|
|
#define CTF_BOTTOM_INTERNAL_FIELD_APPEND(x) \
|
|
{ \
|
|
memcpy(epacket_cursor, &(x), sizeof(x)); \
|
|
epacket_cursor += sizeof(x); \
|
|
}
|
|
|
|
/* Gather fields to a contiguous event-packet, then atomically emit.
|
|
* Used by middle-layer.
|
|
*/
|
|
#define CTF_BOTTOM_FIELDS(...) \
|
|
{ \
|
|
u8_t epacket[0 MAP(CTF_BOTTOM_INTERNAL_FIELD_SIZE, ##__VA_ARGS__)]; \
|
|
u8_t *epacket_cursor = &epacket[0]; \
|
|
\
|
|
MAP(CTF_BOTTOM_INTERNAL_FIELD_APPEND, ##__VA_ARGS__) \
|
|
ctf_bottom_emit(epacket, sizeof(epacket)); \
|
|
}
|
|
|
|
/* No need for locking when ctf_bottom_emit does POSIX fwrite(3) which is thread
|
|
* safe. Used by middle-layer.
|
|
*/
|
|
#define CTF_BOTTOM_LOCK() { /* empty */ }
|
|
#define CTF_BOTTOM_UNLOCK() { /* empty */ }
|
|
|
|
/* On native_posix board, the code must sample time by itself.
|
|
* Used by middle-layer.
|
|
*/
|
|
#define CTF_BOTTOM_TIMESTAMPED_INTERNALLY
|
|
|
|
|
|
typedef struct {
|
|
const char *pathname;
|
|
FILE *ostream;
|
|
} ctf_bottom_ctx_t;
|
|
|
|
extern ctf_bottom_ctx_t ctf_bottom;
|
|
|
|
|
|
/* Configure initializes ctf_bottom context and opens the IO channel */
|
|
void ctf_bottom_configure(void);
|
|
|
|
/* Start a new trace stream */
|
|
void ctf_bottom_start(void);
|
|
|
|
/* Emit IO in system-specific way */
|
|
static inline void ctf_bottom_emit(const void *ptr, size_t size)
|
|
{
|
|
/* Simplest possible example is atomic fwrite */
|
|
fwrite(ptr, size, 1, ctf_bottom.ostream);
|
|
}
|
|
|
|
#endif /* SUBSYS_DEBUG_TRACING_BOTTOMS_POSIX_CTF_BOTTOM_H */
|