File tree Expand file tree Collapse file tree 4 files changed +15
-8
lines changed Expand file tree Collapse file tree 4 files changed +15
-8
lines changed Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff line change @@ -43,4 +43,5 @@ class CoreMutex {
4343 mutex_t *_mutex;
4444 bool _acquired;
4545 uint8_t _option;
46+ BaseType_t _pxHigherPriorityTaskWoken;
4647};
Original file line number Diff line number Diff 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 ));
Original file line number Diff line number Diff 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) {
You can’t perform that action at this time.
0 commit comments