zephyr/subsys/debug/tracing/tracing_format_sync.c
Wentong Wu 8ccc04de6a tracing: add infrastructure for collection of tracing data
First, this commit adds user interface in tracing_format.h which
can trace both string format and data format packet.

Second, it adds method both for asynchronous and synchronous way.
For asynchronous method, tracing packet will be buffered in tracing
buffer first, tracing thread will output the stream data with the
help of tracing backend when tracing thread get scheduled.

Third, it adds UART and USB tracing backend for asynchronous
tracing method, and adds POSIX tracing backend for synchronous
tracing way.

Also it can receive command from host to dynamically enable and
disable tracing to have host capture tracing data conveniently.

Signed-off-by: Wentong Wu <wentong.wu@intel.com>
2020-02-05 23:54:26 -05:00

75 lines
1.5 KiB
C

/*
* Copyright (c) 2019 Intel corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <tracing_core.h>
#include <tracing_buffer.h>
#include <tracing_format_common.h>
void tracing_format_string(const char *str, ...)
{
u8_t *data;
va_list args;
bool put_success;
u32_t length, tracing_buffer_size;
if (!is_tracing_enabled()) {
return;
}
tracing_buffer_size = tracing_buffer_capacity_get();
va_start(args, str);
TRACING_LOCK();
put_success = tracing_format_string_put(str, args);
if (put_success) {
length = tracing_buffer_get_claim(&data, tracing_buffer_size);
tracing_buffer_handle(data, length);
tracing_buffer_get_finish(length);
} else {
tracing_packet_drop_handle();
}
TRACING_UNLOCK();
va_end(args);
}
void tracing_format_raw_data(u8_t *data, u32_t length)
{
if (!is_tracing_enabled()) {
return;
}
TRACING_LOCK();
tracing_buffer_handle(data, length);
TRACING_UNLOCK();
}
void tracing_format_data(tracing_data_t *tracing_data_array, u32_t count)
{
u8_t *data;
bool put_success;
u32_t length, tracing_buffer_size;
if (!is_tracing_enabled()) {
return;
}
tracing_buffer_size = tracing_buffer_capacity_get();
TRACING_LOCK();
put_success = tracing_format_data_put(tracing_data_array, count);
if (put_success) {
length = tracing_buffer_get_claim(&data, tracing_buffer_size);
tracing_buffer_handle(data, length);
tracing_buffer_get_finish(length);
} else {
tracing_packet_drop_handle();
}
TRACING_UNLOCK();
}