diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gos/freertos.c | 14 | ||||
-rw-r--r-- | src/gos/freertos.h | 1 |
2 files changed, 15 insertions, 0 deletions
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) |