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); }