From 9c52e3da37a71569bf911cdadbc8f8819705958e Mon Sep 17 00:00:00 2001 From: Jordan Yates Date: Mon, 12 Aug 2024 17:57:49 +1000 Subject: [PATCH] nrf_modem_lib: trace_backends: rtt: early alloc buf Allocate the modem trace buffer for the RTT backend on boot, instead of when `nrf_modem_lib_init` is called. This allows the user to delay the call to `nrf_modem_lib_init`, giving them a chance to attach to the RTT channel before the modem starts. Without this change the start of trace logs from the RTT backend are invariably lost, as the user cannot attach until after data generation has started. Update tests to work with the move of `SEGGER_RTT_AllocUpBuffer` into a `SYS_INIT` function. Signed-off-by: Jordan Yates --- .../releases/release-notes-changelog.rst | 1 + lib/nrf_modem_lib/trace_backends/rtt/rtt.c | 26 +++++++++++++------ .../trace_backends/rtt/src/main.c | 10 ++++++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/doc/nrf/releases_and_maturity/releases/release-notes-changelog.rst b/doc/nrf/releases_and_maturity/releases/release-notes-changelog.rst index 7e9ecccef1d7..2e50203b5347 100644 --- a/doc/nrf/releases_and_maturity/releases/release-notes-changelog.rst +++ b/doc/nrf/releases_and_maturity/releases/release-notes-changelog.rst @@ -626,6 +626,7 @@ Modem libraries * :ref:`nrf_modem_lib_readme` library: + * Updated the RTT trace backend to allocate the RTT channel at boot, instead of when the modem is activated. * Removed support for deprecated RAI socket options ``SO_RAI_LAST``, ``SO_RAI_NO_DATA``, ``SO_RAI_ONE_RESP``, ``SO_RAI_ONGOING``, and ``SO_RAI_WAIT_MORE``. Multiprotocol Service Layer libraries diff --git a/lib/nrf_modem_lib/trace_backends/rtt/rtt.c b/lib/nrf_modem_lib/trace_backends/rtt/rtt.c index 2cac78f6cd1d..c45ab81f130b 100644 --- a/lib/nrf_modem_lib/trace_backends/rtt/rtt.c +++ b/lib/nrf_modem_lib/trace_backends/rtt/rtt.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -18,21 +19,15 @@ static trace_backend_processed_cb trace_processed_callback; int trace_backend_init(trace_backend_processed_cb trace_processed_cb) { - const int segger_rtt_mode = SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL; - if (trace_processed_cb == NULL) { return -EFAULT; } - - trace_processed_callback = trace_processed_cb; - - trace_rtt_channel = SEGGER_RTT_AllocUpBuffer("modem_trace", rtt_buffer, sizeof(rtt_buffer), - segger_rtt_mode); - if (trace_rtt_channel <= 0) { return -EBUSY; } + trace_processed_callback = trace_processed_cb; + return 0; } @@ -72,3 +67,18 @@ struct nrf_modem_lib_trace_backend trace_backend = { .deinit = trace_backend_deinit, .write = trace_backend_write, }; + +/* Allocate RTT buffer ASAP so external tooling can attach before `nrf_modem_init` */ +IF_DISABLED(CONFIG_UNITY, (static)) +int nrf_modem_lib_trace_rtt_channel_alloc(void) +{ + const int segger_rtt_mode = SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL; + + trace_rtt_channel = SEGGER_RTT_AllocUpBuffer("modem_trace", rtt_buffer, sizeof(rtt_buffer), + segger_rtt_mode); + + return trace_rtt_channel < 0 ? -EBUSY : 0; +} + +/* The RTT core initialises in PRE_KERNEL_1 */ +SYS_INIT(nrf_modem_lib_trace_rtt_channel_alloc, POST_KERNEL, 0); diff --git a/tests/lib/nrf_modem_lib/trace_backends/rtt/src/main.c b/tests/lib/nrf_modem_lib/trace_backends/rtt/src/main.c index 4a32e78a7ad2..a7761145cc5f 100644 --- a/tests/lib/nrf_modem_lib/trace_backends/rtt/src/main.c +++ b/tests/lib/nrf_modem_lib/trace_backends/rtt/src/main.c @@ -10,6 +10,9 @@ #include "trace_backend.h" +/* SYS_INIT function */ +int nrf_modem_lib_trace_rtt_channel_alloc(void); + extern struct nrf_modem_lib_trace_backend trace_backend; #include "cmock_SEGGER_RTT.h" @@ -51,8 +54,10 @@ void test_trace_backend_init_rtt(void) __cmock_SEGGER_RTT_AllocUpBuffer_ExpectAnyArgsAndReturn(trace_rtt_channel); __cmock_SEGGER_RTT_AllocUpBuffer_AddCallback(&rtt_allocupbuffer_callback); - ret = trace_backend.init(callback); + ret = nrf_modem_lib_trace_rtt_channel_alloc(); + TEST_ASSERT_EQUAL(0, ret); + ret = trace_backend.init(callback); TEST_ASSERT_EQUAL(0, ret); } @@ -63,6 +68,9 @@ void test_trace_backend_init_rtt_ebusy(void) /* Simulate failure by returning negative RTT channel. */ __cmock_SEGGER_RTT_AllocUpBuffer_ExpectAnyArgsAndReturn(-1); + ret = nrf_modem_lib_trace_rtt_channel_alloc(); + TEST_ASSERT_EQUAL(-EBUSY, ret); + ret = trace_backend.init(callback); TEST_ASSERT_EQUAL(-EBUSY, ret); }