Application:
NRF_LOG_sth
puts a log entry into ringbuffer.NRF_LOG_FLUSH()
is enforced: calls nrf_log_frontend_dequeue()
in loop until ringbuffer empty.Frontend:
nrf_log_frontend_dequeue()
and:nrf_log_frontend_dequeue()
:log_mempool
to fit log entry.nrf_log_backend_is_enabled(p_backend)
nrf_log_backend_put
nrf_log_frontend_dequeue()
return false
if ringbuffer is empty
NRF_LOG_MSGPOOL_ELEMENT_SIZE (20) x NRF_LOG_MSGPOOL_ELEMENT_COUNT (8)
get/put
counting semaphore locking mechanism, so one log entry can be passed to multiple log backends at time.NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE 64
typedef struct { void (*put)(nrf_log_backend_t const * p_backend, nrf_log_entry_t * p_entry); void (*panic_set)(nrf_log_backend_t const * p_backend); void (*flush)(nrf_log_backend_t const * p_backend); } nrf_log_backend_api_t;
put
put()
- counting semaphore decremented)get()
is called to lock it. And entry is pushed to own queue.NRF_CLI_DEF
nrf_cli_process()
–> cli_log_entry_process()
gets entries from queue. It makes memobj free by put()
after processing.panic_set
:flush
- empty function in most backends(void)cli_log_entry_process(p_cli, true);
nrf_cli_process()
cli_log_entry_process()
do { } while
loop until no log entries in CLI internal queue. So all entries are processed at once.p_cli→p_fprintf_ctx
== nrf_cli_print_stream
cli_write
which maps to nrf_cli_uart_transport_api.write
== cli_uart_write
SUMMARY:
NRF_LOG_BUFSIZE
- so must be big enough to handle all entries until log processNRF_LOG_PROCESS()
NRF_LOG_MSGPOOL_ELEMENT_SIZE (20) x NRF_LOG_MSGPOOL_ELEMENT_COUNT (8)
)NRF_LOG_MSGPOOL_ELEMENT_SIZE (20) x NRF_LOG_MSGPOOL_ELEMENT_COUNT (8)
should be the same as NRF_LOG_BUFSIZE
.NRF_CLI_DEF
should be big enough to track all memobj log entries.nrf_cli_process()
NRF_CLI_UART_DEF
).