tracing: add RAM backend
If Zephyr is running on a coprocessor we might lack I/O such as uart or usb to output tracing datas but we might have gigabytes of RAM available. This patch allows to output trace datas to a ram buffer, which then may be retrieved using gdb. e.g: (gdb) dump binary memory channel0_0 <ram_tracing_start> \ <ram_tracing_end> Signed-off-by: Julien Massot <julien.massot@iot.bzh>
This commit is contained in:
parent
191c3088af
commit
80402f7f8b
4 changed files with 68 additions and 0 deletions
|
@ -36,6 +36,12 @@ zephyr_sources_ifdef(
|
|||
CONFIG_TRACING_BACKEND_POSIX
|
||||
tracing_backend_posix.c
|
||||
)
|
||||
|
||||
zephyr_sources_ifdef(
|
||||
CONFIG_TRACING_BACKEND_RAM
|
||||
tracing_backend_ram.c
|
||||
)
|
||||
|
||||
endif()
|
||||
|
||||
zephyr_include_directories_ifdef(
|
||||
|
|
|
@ -165,6 +165,21 @@ config TRACING_BACKEND_POSIX
|
|||
help
|
||||
Use posix architecture to output tracing data to file system.
|
||||
|
||||
config TRACING_BACKEND_RAM
|
||||
bool "Enable RAM backend"
|
||||
help
|
||||
Use a ram buffer to output tracing data which can
|
||||
be dumped to a file at runtime with a debugger.
|
||||
See gdb dump binary memory documentation for example.
|
||||
|
||||
config RAM_TRACING_BUFFER_SIZE
|
||||
int "Ram Tracing buffer size"
|
||||
default 4096
|
||||
depends on TRACING_BACKEND_RAM
|
||||
help
|
||||
Size of the RAM trace buffer. Trace will be discarded if the
|
||||
length is exceeded.
|
||||
|
||||
endchoice
|
||||
|
||||
config TRACING_BACKEND_UART_NAME
|
||||
|
|
45
subsys/tracing/tracing_backend_ram.c
Normal file
45
subsys/tracing/tracing_backend_ram.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Copyright (c) 2021 IoT.bzh
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <kernel.h>
|
||||
#include <string.h>
|
||||
#include <tracing_core.h>
|
||||
#include <tracing_buffer.h>
|
||||
#include <tracing_backend.h>
|
||||
|
||||
uint8_t ram_tracing[CONFIG_RAM_TRACING_BUFFER_SIZE];
|
||||
static uint32_t pos;
|
||||
static bool buffer_full;
|
||||
|
||||
static void tracing_backend_ram_output(
|
||||
const struct tracing_backend *backend,
|
||||
uint8_t *data, uint32_t length)
|
||||
{
|
||||
if (buffer_full) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((pos + length) > CONFIG_RAM_TRACING_BUFFER_SIZE) {
|
||||
buffer_full = true;
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(ram_tracing + pos, data, length);
|
||||
pos += length;
|
||||
}
|
||||
|
||||
static void tracing_backend_ram_init(void)
|
||||
{
|
||||
memset(ram_tracing, 0, CONFIG_RAM_TRACING_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
const struct tracing_backend_api tracing_backend_ram_api = {
|
||||
.init = tracing_backend_ram_init,
|
||||
.output = tracing_backend_ram_output
|
||||
};
|
||||
|
||||
TRACING_BACKEND_DEFINE(tracing_backend_ram, tracing_backend_ram_api);
|
|
@ -22,6 +22,8 @@
|
|||
#define TRACING_BACKEND_NAME "tracing_backend_usb"
|
||||
#elif defined CONFIG_TRACING_BACKEND_POSIX
|
||||
#define TRACING_BACKEND_NAME "tracing_backend_posix"
|
||||
#elif defined CONFIG_TRACING_BACKEND_RAM
|
||||
#define TRACING_BACKEND_NAME "tracing_backend_ram"
|
||||
#else
|
||||
#define TRACING_BACKEND_NAME ""
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue