8000 CoreMutex add portYieldFromISR for FreeRTOS (#1484) · esphome/arduino-pico@3f475ac · GitHub
[go: up one dir, main page]

Skip to content

Commit 3f475ac

Browse files
authored
CoreMutex add portYieldFromISR for FreeRTOS (earlephilhower#1484)
1 parent 5204dab commit 3f475ac

File tree

4 files changed

+15
-8
lines changed

4 files changed

+15
-8
lines changed

cores/rp2040/CoreMutex.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ CoreMutex::CoreMutex(mutex_t *mutex, uint8_t option) {
2828
_mutex = mutex;
2929
_acquired = false;
3030
_option = option;
31+
_pxHigherPriorityTaskWoken = 0; // pdFALSE
3132
if (__isFreeRTOS) {
3233
auto m = __get_freertos_mutex_for_ptr(mutex);
34+
3335
if (__freertos_check_if_in_isr()) {
34-
if (!__freertos_mutex_take_from_isr(m)) {
36+
if (!__freertos_mutex_take_from_isr(m, &_pxHigherPriorityTaskWoken)) {
3537
return;
3638
}
3739
// At this point we have the mutex in ISR
@@ -59,7 +61,7 @@ CoreMutex::~CoreMutex() {
5961
if (__isFreeRTOS) {
6062
auto m = __get_freertos_mutex_for_ptr(_mutex);
6163
if (__freertos_check_if_in_isr()) {
62-
__freertos_mutex_give_from_isr(m);
64+
__freertos_mutex_give_from_isr(m, &_pxHigherPriorityTaskWoken);
6365
} else {
6466
__freertos_mutex_give(m);
6567
}

cores/rp2040/CoreMutex.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@ class CoreMutex {
4343
mutex_t *_mutex;
4444
bool _acquired;
4545
uint8_t _option;
46+
BaseType_t _pxHigherPriorityTaskWoken;
4647
};

cores/rp2040/_freertos.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ extern "C" {
3535
struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */
3636
typedef struct QueueDefinition * QueueHandle_t;
3737
typedef QueueHandle_t SemaphoreHandle_t;
38+
typedef int32_t BaseType_t;
3839
#endif
3940

4041
extern bool __freertos_check_if_in_isr() __attribute__((weak));
@@ -43,10 +44,11 @@ extern "C" {
4344
extern SemaphoreHandle_t _freertos_recursive_mutex_create() __attribute__((weak));
4445

4546
extern void __freertos_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak));
46-
extern int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) __attribute__((weak));
47+
48+
extern int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) __attribute__((weak));
4749
extern int __freertos_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak));
4850
extern void __freertos_mutex_give(SemaphoreHandle_t mtx) __attribute__((weak));
49-
extern void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx) __attribute__((weak));
51+
extern void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) __attribute__((weak));
5052

5153
extern void __freertos_recursive_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak));
5254
extern int __freertos_recursive_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak));

libraries/FreeRTOS/src/variantHooks.cpp

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

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

6565
int __freertos_mutex_try_take(SemaphoreHandle_t mtx) {
@@ -70,8 +70,10 @@ extern "C" {
7070
xSemaphoreGive(mtx);
7171
}
7272

73-
void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx) {
74-
xSemaphoreGiveFromISR(mtx, NULL);
73+
void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) {
74+
BaseType_t hiPrio = pxHigherPriorityTaskWoken ? *pxHigherPriorityTaskWoken : pdFALSE;
75+
xSemaphoreGiveFromISR(mtx, &hiPrio);
76+
portYIELD_FROM_ISR(hiPrio);
7577
}
7678

7779
void __freertos_recursive_mutex_take(SemaphoreHandle_t mtx) {

0 commit comments

Comments
 (0)
0