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) {
28
28
_mutex = mutex;
29
29
_acquired = false ;
30
30
_option = option;
31
+ _pxHigherPriorityTaskWoken = 0 ; // pdFALSE
31
32
if (__isFreeRTOS) {
32
33
auto m = __get_freertos_mutex_for_ptr (mutex);
34
+
33
35
if (__freertos_check_if_in_isr ()) {
34
- if (!__freertos_mutex_take_from_isr (m)) {
36
+ if (!__freertos_mutex_take_from_isr (m, &_pxHigherPriorityTaskWoken )) {
35
37
return ;
36
38
}
37
39
// At this point we have the mutex in ISR
@@ -59,7 +61,7 @@ CoreMutex::~CoreMutex() {
59
61
if (__isFreeRTOS) {
60
62
auto m = __get_freertos_mutex_for_ptr (_mutex);
61
63
if (__freertos_check_if_in_isr ()) {
62
- __freertos_mutex_give_from_isr (m);
64
+ __freertos_mutex_give_from_isr (m, &_pxHigherPriorityTaskWoken );
63
65
} else {
64
66
__freertos_mutex_give (m);
65
67
}
Original file line number Diff line number Diff line change @@ -43,4 +43,5 @@ class CoreMutex {
43
43
mutex_t *_mutex;
44
44
bool _acquired;
45
45
uint8_t _option;
46
+ BaseType_t _pxHigherPriorityTaskWoken;
46
47
};
Original file line number Diff line number Diff line change @@ -35,6 +35,7 @@ extern "C" {
35
35
struct QueueDefinition ; /* Using old naming convention so as not to break kernel aware debuggers. */
36
36
typedef struct QueueDefinition * QueueHandle_t ;
37
37
typedef QueueHandle_t SemaphoreHandle_t ;
38
+ typedef int32_t BaseType_t ;
38
39
#endif
39
40
40
41
extern bool __freertos_check_if_in_isr () __attribute__((weak ));
@@ -43,10 +44,11 @@ extern "C" {
43
44
extern SemaphoreHandle_t _freertos_recursive_mutex_create () __attribute__((weak ));
44
45
45
46
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 ));
47
49
extern int __freertos_mutex_try_take (SemaphoreHandle_t mtx ) __attribute__((weak ));
48
50
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 ));
50
52
51
53
extern void __freertos_recursive_mutex_take (SemaphoreHandle_t mtx ) __attribute__((weak ));
52
54
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" {
58
58
xSemaphoreTake (mtx, portMAX_DELAY);
59
59
}
60
60
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 );
63
63
}
64
64
65
65
int __freertos_mutex_try_take (SemaphoreHandle_t mtx) {
@@ -70,8 +70,10 @@ extern "C" {
70
70
xSemaphoreGive (mtx);
71
71
}
72
72
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);
75
77
}
76
78
77
79
void __freertos_recursive_mutex_take (SemaphoreHandle_t mtx) {
You can’t perform that action at this time.
0 commit comments