Skip to content

Commit db4f794

Browse files
authored
CoreMutex freeRTOS Mutex acquire properly (#1481)
Since FreeRTOS has real tasks and mutexes with support for priority bumping, actually always try and take a `CoreMutex` instead of seeing if someone else already has it and aborting immediately. This fix helps ensure things like Serial output in a multi-task system won't get lost.
1 parent 45bbcca commit db4f794

File tree

3 files changed

+6
-9
lines changed

3 files changed

+6
-9
lines changed

cores/rp2040/CoreMutex.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,10 @@ CoreMutex::CoreMutex(mutex_t *mutex, uint8_t option) {
3030
_option = option;
3131
if (__isFreeRTOS) {
3232
auto m = __get_freertos_mutex_for_ptr(mutex);
33-
if (__freertos_check_if_in_isr()) {
34-
__freertos_mutex_take_from_isr(m);
35-
} else {
36-
if (!__freertos_mutex_try_take(m)) {
37-
return;
38-
}
33+
if (__freertos_check_if_in_isr() && !__freertos_mutex_take_from_isr(m)) {
34+
return;
3935
}
36+
__freertos_mutex_take(m);
4037
} else {
4138
uint32_t owner;
4239
if (!mutex_try_enter(_mutex, &owner)) {

cores/rp2040/_freertos.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ extern "C" {
4343
extern SemaphoreHandle_t _freertos_recursive_mutex_create() __attribute__((weak));
4444

4545
extern void __freertos_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak));
46-
extern void __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) __attribute__((weak));
46+
extern int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) __attribute__((weak));
4747
extern int __freertos_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak));
4848
extern void __freertos_mutex_give(SemaphoreHandle_t mtx) __attribute__((weak));
4949
extern void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx) __attribute__((weak));

libraries/FreeRTOS/src/variantHooks.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ extern "C" {
5858
xSemaphoreTake(mtx, portMAX_DELAY);
5959
}
6060

61-
void __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) {
62-
xSemaphoreTakeFromISR(mtx, NULL);
61+
int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) {
62+
return xSemaphoreTakeFromISR(mtx, NULL);
6363
}
6464

6565
int __freertos_mutex_try_take(SemaphoreHandle_t mtx) {

0 commit comments

Comments
 (0)