logging: rtt: Fix backend behavior when LOG_IMMEDIATE enabled

Backend was not initialized to work in synchronous mode if LOG_IMMEDIATE
was enabled. That causes use of rtt_lock which uses mutex. That lead to
assert in application.

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2019-03-13 08:21:00 +01:00 committed by Kumar Gala
commit d915fa0c35

View file

@ -51,8 +51,7 @@ static u8_t *line_pos;
static u8_t char_buf[CHAR_BUF_SIZE]; static u8_t char_buf[CHAR_BUF_SIZE];
static int drop_cnt; static int drop_cnt;
static int drop_warn; static int drop_warn;
static int panic_mode; static bool sync_mode;
static bool host_present; static bool host_present;
static int data_out_block_mode(u8_t *data, size_t length, void *ctx); static int data_out_block_mode(u8_t *data, size_t length, void *ctx);
@ -66,7 +65,7 @@ static int data_out_drop_mode(u8_t *data, size_t length, void *ctx)
(void) ctx; (void) ctx;
u8_t *pos; u8_t *pos;
if (panic_mode) { if (sync_mode) {
return data_out_block_mode(data, length, ctx); return data_out_block_mode(data, length, ctx);
} }
@ -142,7 +141,7 @@ static void on_failed_write(int retry_cnt)
{ {
if (retry_cnt == 0) { if (retry_cnt == 0) {
host_present = false; host_present = false;
} else if (panic_mode) { } else if (sync_mode) {
k_busy_wait(USEC_PER_MSEC * RETRY_DELAY_MS); k_busy_wait(USEC_PER_MSEC * RETRY_DELAY_MS);
} else { } else {
k_sleep(RETRY_DELAY_MS); k_sleep(RETRY_DELAY_MS);
@ -152,7 +151,7 @@ static void on_failed_write(int retry_cnt)
static void on_write(int retry_cnt) static void on_write(int retry_cnt)
{ {
host_present = true; host_present = true;
if (panic_mode) { if (sync_mode) {
/* In panic mode block on each write until host reads it. This /* In panic mode block on each write until host reads it. This
* way it is ensured that if system resets all messages are read * way it is ensured that if system resets all messages are read
* by the host. While pending on data being read by the host we * by the host. While pending on data being read by the host we
@ -172,14 +171,14 @@ static int data_out_block_mode(u8_t *data, size_t length, void *ctx)
int retry_cnt = RETRY_CNT; int retry_cnt = RETRY_CNT;
do { do {
if (!panic_mode) { if (!sync_mode) {
RTT_LOCK(); RTT_LOCK();
} }
ret = SEGGER_RTT_WriteSkipNoLock(CONFIG_LOG_BACKEND_RTT_BUFFER, ret = SEGGER_RTT_WriteSkipNoLock(CONFIG_LOG_BACKEND_RTT_BUFFER,
data, length); data, length);
if (!panic_mode) { if (!sync_mode) {
RTT_UNLOCK(); RTT_UNLOCK();
} }
@ -232,14 +231,14 @@ static void log_backend_rtt_init(void)
} }
host_present = true; host_present = true;
panic_mode = 0; sync_mode = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? true : false;
line_pos = line_buf; line_pos = line_buf;
} }
static void panic(struct log_backend const *const backend) static void panic(struct log_backend const *const backend)
{ {
log_output_flush(&log_output); log_output_flush(&log_output);
panic_mode = 1; sync_mode = true;
} }
static void dropped(const struct log_backend *const backend, u32_t cnt) static void dropped(const struct log_backend *const backend, u32_t cnt)