Skip to content

Commit

Permalink
modules: segger: remove mutex locking
Browse files Browse the repository at this point in the history
Remove mutex locking in favour of the standard IRQ locking mechanism.
The primary problem with the mutex implementation is that mutex locking
is forbidden in ISR's. This means that any logging from an interrupt
context (e.g. LOG_PANIC in an exception handler), will itself trigger
another assertion due its attempt to use a mutex.

Furthermore, mutexes are a relatively heavyweight locking scheme, which
doesn't necessarily make sense in the context of extremely short locking
periods that would be expected from RTT.

This change aligns Zephyr with the default RTT locking scheme, which
uses interrupt masking to perform access control.

Resolves #79403.

Signed-off-by: Jordan Yates <jordan@embeint.com>
  • Loading branch information
JordanYates authored and dkalowsk committed Nov 7, 2024
1 parent 580e93e commit 60442a2
Show file tree
Hide file tree
Showing 4 changed files with 3 additions and 48 deletions.
17 changes: 1 addition & 16 deletions drivers/serial/uart_rtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@

#define DT_DRV_COMPAT segger_rtt_uart

extern struct k_mutex rtt_term_mutex;

struct uart_rtt_config {
void *up_buffer;
size_t up_size;
Expand Down Expand Up @@ -100,21 +98,8 @@ static int uart_rtt_tx(const struct device *dev,

ARG_UNUSED(timeout);

/* RTT mutex cannot be claimed in ISRs */
if (k_is_in_isr()) {
return -ENOTSUP;
}

/* Claim the RTT lock */
if (k_mutex_lock(&rtt_term_mutex, K_NO_WAIT) != 0) {
return -EBUSY;
}

/* Output the buffer */
SEGGER_RTT_WriteNoLock(ch, buf, len);

/* Return RTT lock */
SEGGER_RTT_UNLOCK();
SEGGER_RTT_Write(ch, buf, len);

/* Send the TX complete callback */
if (data->callback) {
Expand Down
2 changes: 1 addition & 1 deletion modules/segger/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ if USE_SEGGER_RTT
config SEGGER_RTT_CUSTOM_LOCKING
bool "Custom locking"
help
Enable custom locking using a mutex.
Enable custom locking using Zephyr APIs.

config SEGGER_RTT_MAX_NUM_UP_BUFFERS
int "Maximum number of up-buffers"
Expand Down
30 changes: 0 additions & 30 deletions modules/segger/SEGGER_RTT_zephyr.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,41 +9,13 @@
#include <zephyr/init.h>
#include "SEGGER_RTT.h"

/*
* Common mutex for locking access to terminal buffer.
* Note that SEGGER uses same lock macros for both SEGGER_RTT_Write and
* SEGGER_RTT_Read functions. Because of this we are not able generally
* separate up and down access using two mutexes until SEGGER library fix
* this.
*
* If sharing access cause performance problems, consider using another
* non terminal buffers.
*/

K_MUTEX_DEFINE(rtt_term_mutex);

static int rtt_init(void)
{

SEGGER_RTT_Init();

return 0;
}

#ifdef CONFIG_MULTITHREADING

void zephyr_rtt_mutex_lock(void)
{
k_mutex_lock(&rtt_term_mutex, K_FOREVER);
}

void zephyr_rtt_mutex_unlock(void)
{
k_mutex_unlock(&rtt_term_mutex);
}

#endif /* CONFIG_MULTITHREADING */

unsigned int zephyr_rtt_irq_lock(void)
{
return irq_lock();
Expand All @@ -54,6 +26,4 @@ void zephyr_rtt_irq_unlock(unsigned int key)
irq_unlock(key);
}



SYS_INIT(rtt_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_OBJECTS);
2 changes: 1 addition & 1 deletion west.yml
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ manifest:
path: modules/lib/picolibc
revision: d492d5fa7c96918e37653f303028346bb0dd51a2
- name: segger
revision: b011c45b585e097d95d9cf93edf4f2e01588d3cd
revision: 798f95ea9304e5ed8165a661081443051f210733
path: modules/debug/segger
groups:
- debug
Expand Down

0 comments on commit 60442a2

Please sign in to comment.