From c151f1768ee99c3a30991590942b49e51e92647a Mon Sep 17 00:00:00 2001 From: Andrei Emeltchenko Date: Wed, 29 Apr 2020 10:13:17 +0300 Subject: [PATCH] subsys/logging: log_backend_rb: Clear memory, timestamps Add option to clear memory slot before writing logs, making reading logs more easy. Add timestamp logging option Add option to enable timestamp for ring buffer backend. Timestamp may consume little memory we have for ring buffer. Add timestamp logging option Signed-off-by: Andrei Emeltchenko --- subsys/logging/Kconfig | 13 +++++++++ subsys/logging/log_backend_rb.c | 52 +++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/subsys/logging/Kconfig b/subsys/logging/Kconfig index f7d16b9866b..63c035484ed 100644 --- a/subsys/logging/Kconfig +++ b/subsys/logging/Kconfig @@ -553,6 +553,19 @@ config LOG_BACKEND_RB_SLOT_SIZE Size of the message slot inside ring buffer. All log messages are split to similar sized logging slots. +config LOG_BACKEND_RB_CLEAR + bool "Clear ring buffer slot" + default y + help + Clearing ring buffer slot helps to write more easy tools to read logs + on different platforms. + +config LOG_BACKEND_RB_TIMESTAMP + bool "Add timestamp to the log" + default y + help + Add timestamp to the logging string. + endif # LOG_BACKEND_RB config LOG_BACKEND_SHOW_COLOR diff --git a/subsys/logging/log_backend_rb.c b/subsys/logging/log_backend_rb.c index c37a9ce7aca..ff8f26ce3ec 100644 --- a/subsys/logging/log_backend_rb.c +++ b/subsys/logging/log_backend_rb.c @@ -8,6 +8,7 @@ #include #include #include +#include #include static struct ring_buf ringbuf; @@ -40,7 +41,6 @@ static void trace(const uint8_t *data, size_t length) static uint16_t log_id; volatile uint8_t *t, *region; int space; - int i; space = ring_buf_space_get(&ringbuf); if (space < CONFIG_LOG_BACKEND_RB_SLOT_SIZE) { @@ -57,15 +57,23 @@ static void trace(const uint8_t *data, size_t length) region = t; /* Add magic number at the beginning of the slot */ - *(uint16_t *)t = magic; + sys_put_le16(magic, (uint8_t *)t); t += 2; /* Add log id */ - *(uint16_t *)t = log_id++; + sys_put_le16(log_id++, (uint8_t *)t); t += 2; - for (i = 0; i < MIN(length, CONFIG_LOG_BACKEND_RB_SLOT_SIZE - 4); i++) { - *t++ = data[i]; + length = MIN(length, CONFIG_LOG_BACKEND_RB_SLOT_SIZE - 4); + + memcpy((void *)t, data, length); + t += length; + + /* Clear logging slot */ + if (IS_ENABLED(CONFIG_LOG_BACKEND_RB_CLEAR) && + length < CONFIG_LOG_BACKEND_RB_SLOT_SIZE - 4) { + memset((void *)t, 0, + CONFIG_LOG_BACKEND_RB_SLOT_SIZE - 4 - length); } SOC_DCACHE_FLUSH((void *)region, CONFIG_LOG_BACKEND_RB_SLOT_SIZE); @@ -88,12 +96,16 @@ LOG_OUTPUT_DEFINE(log_output_rb, char_out, rb_log_buf, sizeof(rb_log_buf)); static void put(const struct log_backend *const backend, struct log_msg *msg) { - log_msg_get(msg); - uint32_t flags = LOG_OUTPUT_FLAG_LEVEL; - if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { - flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + log_msg_get(msg); + + if (IS_ENABLED(CONFIG_LOG_BACKEND_RB_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_TIMESTAMP; + + if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + } } log_output_msg_process(&log_output_rb, msg, flags); @@ -120,8 +132,12 @@ static void sync_string(const struct log_backend *const backend, uint32_t flags = LOG_OUTPUT_FLAG_LEVEL; uint32_t key; - if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { - flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + if (IS_ENABLED(CONFIG_LOG_BACKEND_RB_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_TIMESTAMP; + + if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + } } key = irq_lock(); @@ -134,11 +150,15 @@ static void sync_hexdump(const struct log_backend *const backend, struct log_msg_ids src_level, uint32_t timestamp, const char *metadata, const uint8_t *data, uint32_t length) { - uint32_t flags = LOG_OUTPUT_FLAG_LEVEL | LOG_OUTPUT_FLAG_TIMESTAMP; + uint32_t flags = LOG_OUTPUT_FLAG_LEVEL; uint32_t key; - if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { - flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + if (IS_ENABLED(CONFIG_LOG_BACKEND_RB_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_TIMESTAMP; + + if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + } } key = irq_lock(); @@ -147,7 +167,7 @@ static void sync_hexdump(const struct log_backend *const backend, irq_unlock(key); } -const struct log_backend_api log_backend_adsp_api = { +const struct log_backend_api log_backend_rb_api = { .put = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? NULL : put, .put_sync_string = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? sync_string : NULL, @@ -158,4 +178,4 @@ const struct log_backend_api log_backend_adsp_api = { .dropped = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? NULL : dropped, }; -LOG_BACKEND_DEFINE(log_backend_adsp, log_backend_adsp_api, true); +LOG_BACKEND_DEFINE(log_backend_adsp, log_backend_rb_api, true);