diff --git a/src/gos/freertos.c b/src/gos/freertos.c index 872807d1..e3be4f28 100644 --- a/src/gos/freertos.c +++ b/src/gos/freertos.c @@ -107,6 +107,20 @@ bool_t gfxSemWait(gfxSem* psem, delaytime_t ms) return FALSE; } +bool_t gfxSemWaitI(gfxSem* psem) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + psem->counter--; + + if (xSemaphoreTakeFromISR(psem->sem,&xHigherPriorityTaskWoken) == pdTRUE) + return TRUE; + + psem->counter++; + + return FALSE; +} + void gfxSemSignal(gfxSem* psem) { taskENTER_CRITICAL(); diff --git a/src/gos/freertos.h b/src/gos/freertos.h index dc98185f..f15ca910 100644 --- a/src/gos/freertos.h +++ b/src/gos/freertos.h @@ -94,6 +94,7 @@ void gfxSleepMicroseconds(delaytime_t ms); void gfxSemInit(gfxSem* psem, semcount_t val, semcount_t limit); void gfxSemDestroy(gfxSem* psem); bool_t gfxSemWait(gfxSem* psem, delaytime_t ms); +bool_t gfxSemWaitI(gfxSem* psem); void gfxSemSignal(gfxSem* psem); void gfxSemSignalI(gfxSem* psem); #define gfxSemCounterI(psem) ((psem)->counter)