diff options
author | inmarket <andrewh@inmarket.com.au> | 2015-10-26 23:04:51 +1000 |
---|---|---|
committer | inmarket <andrewh@inmarket.com.au> | 2015-10-26 23:04:51 +1000 |
commit | 267178254dd1e65348d46ef75fa5521c95da50f4 (patch) | |
tree | a7825a51595553c7f49efb46a79c39f046604e05 /src/gos | |
parent | bc32c99d1a6e659619bbb6c25a2928c833a7b541 (diff) | |
download | uGFX-267178254dd1e65348d46ef75fa5521c95da50f4.tar.gz uGFX-267178254dd1e65348d46ef75fa5521c95da50f4.tar.bz2 uGFX-267178254dd1e65348d46ef75fa5521c95da50f4.zip |
Another attempt to get CMSIS semaphores correct.
Diffstat (limited to 'src/gos')
-rw-r--r-- | src/gos/gos_cmsis.c | 21 | ||||
-rw-r--r-- | src/gos/gos_cmsis.h | 5 |
2 files changed, 17 insertions, 9 deletions
diff --git a/src/gos/gos_cmsis.c b/src/gos/gos_cmsis.c index b2f25dd0..bfbafd62 100644 --- a/src/gos/gos_cmsis.c +++ b/src/gos/gos_cmsis.c @@ -43,9 +43,9 @@ void gfxSemInit(gfxSem* psem, semcount_t val, semcount_t limit) osSemaphoreDef_t def; def.semaphore = psem->semaphore; - psem->id = osSemaphoreCreate(&def, limit); - while(val--) - osSemaphoreRelease(psem->id); + if (val > limit) val = limit; + psem->available = limit - val; + psem->id = osSemaphoreCreate(&def, val); } void gfxSemDestroy(gfxSem* psem) @@ -55,22 +55,29 @@ void gfxSemDestroy(gfxSem* psem) bool_t gfxSemWait(gfxSem* psem, delaytime_t ms) { - return osSemaphoreWait(psem->id, ms) > 0; + if (osSemaphoreWait(psem->id, ms) == osOK) { + psem->available++; + return TRUE; + } + return FALSE; } bool_t gfxSemWaitI(gfxSem* psem) { - return osSemaphoreWait(psem->id, 0) > 0; + return gfxSemWait(psem, 0); } void gfxSemSignal(gfxSem* psem) { - osSemaphoreRelease(psem->id); + gfxSemSignalI(psem); } void gfxSemSignalI(gfxSem* psem) { - osSemaphoreRelease(psem->id); + if (psem->available) { + psem->available--; + osSemaphoreRelease(psem->id); + } } gfxThreadHandle gfxThreadCreate(void* stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void* param) diff --git a/src/gos/gos_cmsis.h b/src/gos/gos_cmsis.h index d263feb6..85aa1362 100644 --- a/src/gos/gos_cmsis.h +++ b/src/gos/gos_cmsis.h @@ -42,8 +42,9 @@ typedef osPriority threadpriority_t; #define HIGH_PRIORITY osPriorityHigh typedef struct gfxSem { - uint32_t semaphore[2]; - osSemaphoreId id; + uint32_t semaphore[2]; + osSemaphoreId id; + semcount_t available; } gfxSem; typedef struct gfxMutex { |