From 56b416708c458489bd37314bd94e2a0cbb7e6434 Mon Sep 17 00:00:00 2001 From: inmarket Date: Mon, 24 Mar 2014 10:06:10 +1000 Subject: Fix bug in ChibiOS GOS layer --- src/gos/chibios.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/gos/chibios.c') diff --git a/src/gos/chibios.c b/src/gos/chibios.c index 7d64fe1c..67f70561 100644 --- a/src/gos/chibios.c +++ b/src/gos/chibios.c @@ -81,12 +81,11 @@ void gfxSemDestroy(gfxSem *psem) { } bool_t gfxSemWait(gfxSem *psem, delaytime_t ms) { - if (ms == TIME_INFINITE) { - chSemWait(&psem->sem); - return TRUE; + switch(ms) { + case TIME_IMMEDIATE: return chSemWaitTimeout(&psem->sem, TIME_IMMEDIATE) != RDY_TIMEOUT; + case TIME_INFINITE: chSemWait(&psem->sem); return TRUE; + default: return chSemWaitTimeout(&psem->sem, MS2ST(ms)) != RDY_TIMEOUT; } - - return chSemWaitTimeout(&psem->sem, MS2ST(ms)) != RDY_TIMEOUT; } bool_t gfxSemWaitI(gfxSem *psem) { -- cgit v1.2.3 From 40cf9fff9f65248db50fa0251373f7a54086d253 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Fri, 18 Apr 2014 13:20:50 +0200 Subject: uGFX now works with ChibiOS/RT 2.x and 3.x out of the box. --- src/gos/chibios.c | 88 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 22 deletions(-) (limited to 'src/gos/chibios.c') diff --git a/src/gos/chibios.c b/src/gos/chibios.c index 67f70561..2254f52f 100644 --- a/src/gos/chibios.c +++ b/src/gos/chibios.c @@ -8,6 +8,7 @@ /** * @file src/gos/chibios.c * @brief GOS ChibiOS Operating System support. + * @details Supports both, ChibiOS/RT 2.x and 3.x */ #include "gfx.h" @@ -15,20 +16,41 @@ #include -#if !CH_USE_MUTEXES - #error "GOS: CH_USE_MUTEXES must be defined in chconf.h" -#endif -#if !CH_USE_SEMAPHORES - #error "GOS: CH_USE_SEMAPHORES must be defined in chconf.h" +#if CH_KERNEL_MAJOR == 2 + + #if !CH_USE_MUTEXES + #error "GOS: CH_USE_MUTEXES must be defined in chconf.h" + #endif + #if !CH_USE_SEMAPHORES + #error "GOS: CH_USE_SEMAPHORES must be defined in chconf.h" + #endif + +#elif CH_KERNEL_MAJOR == 3 + + #if !CH_CFG_USE_MUTEXES + #error "GOS: CH_USE_MUTEXES must be defined in chconf.h" + #endif + #if !CH_CFG_USE_SEMAPHORES + #error "GOS: CH_USE_SEMAPHORES must be defined in chconf.h" + #endif + #endif void _gosInit(void) { /* Don't initialise if the user already has */ + + #if CH_KERNEL_MAJOR == 2 if (!chThdSelf()) { halInit(); chSysInit(); } + #elif CH_KERNEL_MAJOR == 3 + if (!chThdGetSelfX()) { + halInit(); + chSysInit(); + } + #endif } void _gosDeinit(void) @@ -36,7 +58,8 @@ void _gosDeinit(void) /* ToDo */ } -void *gfxRealloc(void *ptr, size_t oldsz, size_t newsz) { +void *gfxRealloc(void *ptr, size_t oldsz, size_t newsz) +{ void *np; if (newsz <= oldsz) @@ -52,7 +75,8 @@ void *gfxRealloc(void *ptr, size_t oldsz, size_t newsz) { return np; } -void gfxSleepMilliseconds(delaytime_t ms) { +void gfxSleepMilliseconds(delaytime_t ms) +{ switch(ms) { case TIME_IMMEDIATE: chThdYield(); return; case TIME_INFINITE: chThdSleep(TIME_INFINITE); return; @@ -60,7 +84,8 @@ void gfxSleepMilliseconds(delaytime_t ms) { } } -void gfxSleepMicroseconds(delaytime_t ms) { +void gfxSleepMicroseconds(delaytime_t ms) +{ switch(ms) { case TIME_IMMEDIATE: return; case TIME_INFINITE: chThdSleep(TIME_INFINITE); return; @@ -68,34 +93,52 @@ void gfxSleepMicroseconds(delaytime_t ms) { } } -void gfxSemInit(gfxSem *psem, semcount_t val, semcount_t limit) { +void gfxSemInit(gfxSem *psem, semcount_t val, semcount_t limit) +{ if (val > limit) val = limit; psem->limit = limit; - chSemInit(&psem->sem, val); + + #if CH_KERNEL_MAJOR == 2 + chSemInit(&psem->sem, val); + #elif CH_KERNEL_MAJOR == 3 + chSemObjectInit(&psem->sem, val); + #endif } -void gfxSemDestroy(gfxSem *psem) { +void gfxSemDestroy(gfxSem *psem) +{ chSemReset(&psem->sem, 1); } -bool_t gfxSemWait(gfxSem *psem, delaytime_t ms) { - switch(ms) { - case TIME_IMMEDIATE: return chSemWaitTimeout(&psem->sem, TIME_IMMEDIATE) != RDY_TIMEOUT; - case TIME_INFINITE: chSemWait(&psem->sem); return TRUE; - default: return chSemWaitTimeout(&psem->sem, MS2ST(ms)) != RDY_TIMEOUT; - } +bool_t gfxSemWait(gfxSem *psem, delaytime_t ms) +{ + #if CH_KERNEL_MAJOR == 2 + switch(ms) { + case TIME_IMMEDIATE: return chSemWaitTimeout(&psem->sem, TIME_IMMEDIATE) != RDY_TIMEOUT; + case TIME_INFINITE: chSemWait(&psem->sem); return TRUE; + default: return chSemWaitTimeout(&psem->sem, MS2ST(ms)) != RDY_TIMEOUT; + } + #elif CH_KERNEL_MAJOR == 3 + switch(ms) { + case TIME_IMMEDIATE: return chSemWaitTimeout(&psem->sem, TIME_IMMEDIATE) != MSG_TIMEOUT; + case TIME_INFINITE: chSemWait(&psem->sem); return TRUE; + default: return chSemWaitTimeout(&psem->sem, MS2ST(ms)) != MSG_TIMEOUT; + } + #endif } -bool_t gfxSemWaitI(gfxSem *psem) { +bool_t gfxSemWaitI(gfxSem *psem) +{ if (chSemGetCounterI(&psem->sem) <= 0) return FALSE; chSemFastWaitI(&psem->sem); return TRUE; } -void gfxSemSignal(gfxSem *psem) { +void gfxSemSignal(gfxSem *psem) +{ chSysLock(); if (gfxSemCounterI(psem) < psem->limit) @@ -105,12 +148,14 @@ void gfxSemSignal(gfxSem *psem) { chSysUnlock(); } -void gfxSemSignalI(gfxSem *psem) { +void gfxSemSignalI(gfxSem *psem) +{ if (gfxSemCounterI(psem) < psem->limit) chSemSignalI(&psem->sem); } -gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param) { +gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param) +{ if (!stackarea) { if (!stacksz) stacksz = 256; return chThdCreateFromHeap(0, stacksz, prio, fn, param); @@ -124,4 +169,3 @@ gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_ #endif /* GFX_USE_OS_CHIBIOS */ /** @} */ - -- cgit v1.2.3