meta data for this page
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
embedded:nordic:sdk5:log [2024/10/14 21:36] – niziak | embedded:nordic:sdk5:log [2024/10/24 11:26] (current) – niziak | ||
---|---|---|---|
Line 4: | Line 4: | ||
Application: | Application: | ||
- | * DEFERRED: | + | * every call to '' |
+ | * NOT DEFERRED: '' | ||
Frontend: | Frontend: | ||
* DEFERRED: Application calls '' | * DEFERRED: Application calls '' | ||
+ | * '' | ||
* one entry is pop-ed from ringbuffer | * one entry is pop-ed from ringbuffer | ||
* new memobj is allocated from '' | * new memobj is allocated from '' | ||
Line 14: | Line 16: | ||
* filters: check if module log level and log entry severity level matches | * filters: check if module log level and log entry severity level matches | ||
* if log entry should be send to backend - call '' | * if log entry should be send to backend - call '' | ||
- | * **BACKEND: | + | * **BACKEND: |
+ | * '' | ||
<uml> | <uml> | ||
Line 61: | Line 63: | ||
===== buffer sizes ===== | ===== buffer sizes ===== | ||
- | * Circular buffer of **NRF_LOG_BUFSIZE (1024)** | + | * Circular buffer of **NRF_LOG_BUFSIZE (1024)**: |
- | * Dynamic memory pool | + | * Its aim is to store log entry from app as fast as possible |
+ | * DEFERRED: should be big enough to store all log entries until apps calls log to be processed. | ||
+ | * Dynamic memory pool: | ||
* size is '' | * size is '' | ||
- | * provides dynamic memory access, even to fragmented memory | + | * provides dynamic memory access, even to fragmented memory. |
- | * storage for log entries | + | * provides |
* provides '' | * provides '' | ||
+ | * It looks like to be designed for background backends. Counting semaphore will keep object locked until all backends finish. | ||
+ | * Background backends: | ||
+ | * **NRF_CLI_LOG_BACKEND** | ||
* Backends are using temporary string buffers - this is the real place where printf-like function writes generated strings. | * Backends are using temporary string buffers - this is the real place where printf-like function writes generated strings. | ||
* '' | * '' | ||
+ | |||
+ | ===== Backends api ===== | ||
+ | |||
+ | |||
+ | <code c> | ||
+ | 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; | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * UART/ | ||
+ | * printf-like processing | ||
+ | * memobj with log entry is released ('' | ||
+ | * CLI: | ||
+ | * memobj is not released. '' | ||
+ | * own **queue** size is defined by '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * RTT: empty | ||
+ | * UART: uninit uart driver | ||
+ | * '' | ||
+ | * CLI: '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * result of processing is passed to printf-like writer '' | ||
+ | * '' | ||
+ | * cli_uart_write puts data to UART TX ringbuffer defined by macro NRF_CLI_UART_DEF | ||
+ | |||
+ | ===== using CLI and deferred log ===== | ||
+ | |||
+ | SUMMARY: | ||
+ | * app logs data and metadata to ringbuffer: '' | ||
+ | * app idle calls: '' | ||
+ | * if dynamic log levels enabled it filter what to log | ||
+ | * it copies entries from ringbuffer to memobj (dynamic memory of size '' | ||
+ | * each one memobj log entry is passed to all active backends (multiple reference locking possible by counting semaphore) | ||
+ | * UART backend: it process log entry (printf-like formatting) and put it in UART TX buffer. Memobj log entry is released. | ||
+ | * RTT backend: it process log entry (printf-like formatting) and put it in RTT buffer. Memobj log entry is released. | ||
+ | * CLI backend: it puts log entry into own queue. Memobj log entry is **NOT released**. | ||
+ | * **conclusion**: | ||
+ | * **conclusion**: | ||
+ | * app idle calls: '' | ||
+ | * whole queue is processed in loop | ||
+ | * each memobj log entry is processed (printf-like formatting) and put into UART TX ring buffer (size defined by '' | ||
+ | |||