CoreMutex add portYieldFromISR for FreeRTOS (#1484)

This commit is contained in:
hreintke 2023-06-07 15:59:10 +02:00 committed by GitHub
parent 5204dab99b
commit 3f475ac68c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 8 deletions

View file

@ -28,10 +28,12 @@ CoreMutex::CoreMutex(mutex_t *mutex, uint8_t option) {
_mutex = mutex; _mutex = mutex;
_acquired = false; _acquired = false;
_option = option; _option = option;
_pxHigherPriorityTaskWoken = 0; // pdFALSE
if (__isFreeRTOS) { if (__isFreeRTOS) {
auto m = __get_freertos_mutex_for_ptr(mutex); auto m = __get_freertos_mutex_for_ptr(mutex);
if (__freertos_check_if_in_isr()) { if (__freertos_check_if_in_isr()) {
if (!__freertos_mutex_take_from_isr(m)) { if (!__freertos_mutex_take_from_isr(m, &_pxHigherPriorityTaskWoken)) {
return; return;
} }
// At this point we have the mutex in ISR // At this point we have the mutex in ISR
@ -59,7 +61,7 @@ CoreMutex::~CoreMutex() {
if (__isFreeRTOS) { if (__isFreeRTOS) {
auto m = __get_freertos_mutex_for_ptr(_mutex); auto m = __get_freertos_mutex_for_ptr(_mutex);
if (__freertos_check_if_in_isr()) { if (__freertos_check_if_in_isr()) {
__freertos_mutex_give_from_isr(m); __freertos_mutex_give_from_isr(m, &_pxHigherPriorityTaskWoken);
} else { } else {
__freertos_mutex_give(m); __freertos_mutex_give(m);
} }

View file

@ -43,4 +43,5 @@ private:
mutex_t *_mutex; mutex_t *_mutex;
bool _acquired; bool _acquired;
uint8_t _option; uint8_t _option;
BaseType_t _pxHigherPriorityTaskWoken;
}; };

View file

@ -35,6 +35,7 @@ extern "C" {
struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */
typedef struct QueueDefinition * QueueHandle_t; typedef struct QueueDefinition * QueueHandle_t;
typedef QueueHandle_t SemaphoreHandle_t; typedef QueueHandle_t SemaphoreHandle_t;
typedef int32_t BaseType_t;
#endif #endif
extern bool __freertos_check_if_in_isr() __attribute__((weak)); extern bool __freertos_check_if_in_isr() __attribute__((weak));
@ -43,10 +44,11 @@ extern "C" {
extern SemaphoreHandle_t _freertos_recursive_mutex_create() __attribute__((weak)); extern SemaphoreHandle_t _freertos_recursive_mutex_create() __attribute__((weak));
extern void __freertos_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak)); extern void __freertos_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak));
extern int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) __attribute__((weak));
extern int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) __attribute__((weak));
extern int __freertos_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak)); extern int __freertos_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak));
extern void __freertos_mutex_give(SemaphoreHandle_t mtx) __attribute__((weak)); extern void __freertos_mutex_give(SemaphoreHandle_t mtx) __attribute__((weak));
extern void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx) __attribute__((weak)); extern void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) __attribute__((weak));
extern void __freertos_recursive_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak)); extern void __freertos_recursive_mutex_take(SemaphoreHandle_t mtx) __attribute__((weak));
extern int __freertos_recursive_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak)); extern int __freertos_recursive_mutex_try_take(SemaphoreHandle_t mtx) __attribute__((weak));

View file

@ -58,8 +58,8 @@ extern "C" {
xSemaphoreTake(mtx, portMAX_DELAY); xSemaphoreTake(mtx, portMAX_DELAY);
} }
int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx) { int __freertos_mutex_take_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) {
return xSemaphoreTakeFromISR(mtx, NULL); return xSemaphoreTakeFromISR(mtx, pxHigherPriorityTaskWoken);
} }
int __freertos_mutex_try_take(SemaphoreHandle_t mtx) { int __freertos_mutex_try_take(SemaphoreHandle_t mtx) {
@ -70,8 +70,10 @@ extern "C" {
xSemaphoreGive(mtx); xSemaphoreGive(mtx);
} }
void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx) { void __freertos_mutex_give_from_isr(SemaphoreHandle_t mtx, BaseType_t* pxHigherPriorityTaskWoken) {
xSemaphoreGiveFromISR(mtx, NULL); BaseType_t hiPrio = pxHigherPriorityTaskWoken ? *pxHigherPriorityTaskWoken : pdFALSE;
xSemaphoreGiveFromISR(mtx, &hiPrio);
portYIELD_FROM_ISR(hiPrio);
} }
void __freertos_recursive_mutex_take(SemaphoreHandle_t mtx) { void __freertos_recursive_mutex_take(SemaphoreHandle_t mtx) {