aboutsummaryrefslogtreecommitdiffstats
path: root/src/gos/chibios.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gos/chibios.c')
-rw-r--r--src/gos/chibios.c88
1 files changed, 66 insertions, 22 deletions
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 <string.h>
-#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 */
/** @} */
-