From f4ad7020465fa53babe33fb1b77ad58267f31f07 Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Wed, 19 Feb 2025 16:03:53 +0800 Subject: [PATCH 1/2] [hal] SPI: fixes threading safty issue --- hal/src/nRF52840/spi_hal.cpp | 8 ++------ hal/src/rtl872x/spi_hal.cpp | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/hal/src/nRF52840/spi_hal.cpp b/hal/src/nRF52840/spi_hal.cpp index 49e143d8be..d5d773fa60 100644 --- a/hal/src/nRF52840/spi_hal.cpp +++ b/hal/src/nRF52840/spi_hal.cpp @@ -672,12 +672,8 @@ int32_t hal_spi_acquire(hal_spi_interface_t spi, const hal_spi_acquire_config_t* if (!hal_interrupt_is_isr()) { os_mutex_recursive_t mutex = spiMap[spi].mutex; if (mutex) { - // FIXME: os_mutex_recursive_lock doesn't take any arguments, using trylock for now - if (!conf || conf->timeout != 0) { - return os_mutex_recursive_lock(mutex); - } else { - return os_mutex_recursive_trylock(mutex); - } + // FIXME: os_mutex_recursive_lock doesn't take any arguments + return os_mutex_recursive_lock(mutex); } } return -1; diff --git a/hal/src/rtl872x/spi_hal.cpp b/hal/src/rtl872x/spi_hal.cpp index 04c33d664d..5966760fba 100644 --- a/hal/src/rtl872x/spi_hal.cpp +++ b/hal/src/rtl872x/spi_hal.cpp @@ -456,12 +456,8 @@ class Spi { int lock(system_tick_t timeout = 0) { CHECK_TRUE(hal_interrupt_is_isr() == false, SYSTEM_ERROR_INVALID_STATE); - // FIXME: os_mutex_recursive_lock doesn't take any arguments, using trylock for now - if (timeout) { - return os_mutex_recursive_lock(mutex_); - } - - return os_mutex_recursive_trylock(mutex_); + // FIXME: os_mutex_recursive_lock doesn't take any arguments + return os_mutex_recursive_lock(mutex_); } int unlock() { From f1e8c59b79e4abab6e425963551770cade92def5 Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Wed, 19 Feb 2025 16:36:20 +0800 Subject: [PATCH 2/2] [hal] SPI: support try lock --- hal/src/nRF52840/spi_hal.cpp | 8 ++++++-- hal/src/rtl872x/spi_hal.cpp | 12 +++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/hal/src/nRF52840/spi_hal.cpp b/hal/src/nRF52840/spi_hal.cpp index d5d773fa60..49e143d8be 100644 --- a/hal/src/nRF52840/spi_hal.cpp +++ b/hal/src/nRF52840/spi_hal.cpp @@ -672,8 +672,12 @@ int32_t hal_spi_acquire(hal_spi_interface_t spi, const hal_spi_acquire_config_t* if (!hal_interrupt_is_isr()) { os_mutex_recursive_t mutex = spiMap[spi].mutex; if (mutex) { - // FIXME: os_mutex_recursive_lock doesn't take any arguments - return os_mutex_recursive_lock(mutex); + // FIXME: os_mutex_recursive_lock doesn't take any arguments, using trylock for now + if (!conf || conf->timeout != 0) { + return os_mutex_recursive_lock(mutex); + } else { + return os_mutex_recursive_trylock(mutex); + } } } return -1; diff --git a/hal/src/rtl872x/spi_hal.cpp b/hal/src/rtl872x/spi_hal.cpp index 5966760fba..3c1fd0ee64 100644 --- a/hal/src/rtl872x/spi_hal.cpp +++ b/hal/src/rtl872x/spi_hal.cpp @@ -454,10 +454,13 @@ class Spi { return SYSTEM_ERROR_NONE; } - int lock(system_tick_t timeout = 0) { + int lock(system_tick_t timeout = 1) { CHECK_TRUE(hal_interrupt_is_isr() == false, SYSTEM_ERROR_INVALID_STATE); - // FIXME: os_mutex_recursive_lock doesn't take any arguments - return os_mutex_recursive_lock(mutex_); + // FIXME: os_mutex_recursive_lock doesn't take any arguments, using trylock for now + if (timeout != 0) { + return os_mutex_recursive_lock(mutex_); + } + return os_mutex_recursive_trylock(mutex_); } int unlock() { @@ -1215,6 +1218,9 @@ int hal_spi_sleep(hal_spi_interface_t spi, bool sleep, void* reserved) { int32_t hal_spi_acquire(hal_spi_interface_t spi, const hal_spi_acquire_config_t* conf) { auto spiInstance = CHECK_TRUE_RETURN(getInstance(spi), SYSTEM_ERROR_NOT_FOUND); + if (conf && conf->timeout == 0) { + return spiInstance->lock(0); + } return spiInstance->lock(); }