CoreMutex add portYieldFromISR for FreeRTOS (#1484)
This commit is contained in:
parent
5204dab99b
commit
3f475ac68c
4 changed files with 15 additions and 8 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,4 +43,5 @@ private:
|
||||||
mutex_t *_mutex;
|
mutex_t *_mutex;
|
||||||
bool _acquired;
|
bool _acquired;
|
||||||
uint8_t _option;
|
uint8_t _option;
|
||||||
|
BaseType_t _pxHigherPriorityTaskWoken;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue