From 8efdd2c51419ad7a38a6594ecabe729c6ab824e4 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Mon, 29 Sep 2014 08:07:43 +0200 Subject: /src/gos/gfx_* -> /src/gos/gos_* --- src/gos/gos_ecos.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/gos/gos_ecos.c (limited to 'src/gos/gos_ecos.c') diff --git a/src/gos/gos_ecos.c b/src/gos/gos_ecos.c new file mode 100644 index 00000000..16ce821b --- /dev/null +++ b/src/gos/gos_ecos.c @@ -0,0 +1,115 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +#include "gfx.h" + +#if GFX_USE_OS_ECOS + +void _gosInit(void) +{ + #if !GFX_NO_OS_INIT + #error "GOS: Operating System initialization for eCos is not yet implemented in uGFX. Please set GFX_NO_OS_INIT to TRUE in your gfxconf.h" + #else + #warning "GOS: Operating System initialization has been turned off. Make sure you call cyg_scheduler_start() before gfxInit() in your application!" + #endif +} + +void _gosDeinit(void) +{ + /* ToDo */ +} + +void gfxSleepMilliseconds(delaytime_t ms) +{ + switch(ms) { + case TIME_IMMEDIATE: cyg_thread_yield(); return; + case TIME_INFINITE: cyg_thread_suspend(cyg_thread_self()); return; + default: cyg_thread_delay(gfxMillisecondsToTicks(ms)); return; + } +} + +void gfxSleepMicroseconds(delaytime_t ms) +{ + switch(ms) { + case TIME_IMMEDIATE: return; + case TIME_INFINITE: cyg_thread_suspend(cyg_thread_self()); return; + default: cyg_thread_delay(gfxMillisecondsToTicks(ms/1000)); return; + } +} + +void gfxSemInit(gfxSem *psem, semcount_t val, semcount_t limit) +{ + if (val > limit) + val = limit; + + psem->limit = limit; + cyg_semaphore_init(&psem->sem, val); +} + +void gfxSemDestroy(gfxSem *psem) +{ + cyg_semaphore_destroy(&psem->sem); +} + +bool_t gfxSemWait(gfxSem *psem, delaytime_t ms) +{ + switch(ms) { + case TIME_IMMEDIATE: return cyg_semaphore_trywait(&psem->sem); + case TIME_INFINITE: return cyg_semaphore_wait(&psem->sem); + default: return cyg_semaphore_timed_wait(&psem->sem, gfxMillisecondsToTicks(ms)+cyg_current_time()); + } +} + +bool_t gfxSemWaitI(gfxSem *psem) +{ + return cyg_semaphore_trywait(&psem->sem); +} + +void gfxSemSignal(gfxSem *psem) +{ + if (psem->limit == MAX_SEMAPHORE_COUNT) + cyg_semaphore_post(&psem->sem); + else { + cyg_scheduler_lock(); + if (gfxSemCounterI(psem) < psem->limit) + cyg_semaphore_post(&psem->sem); + cyg_scheduler_unlock(); + } +} + +void gfxSemSignalI(gfxSem *psem) +{ + if (psem->limit == MAX_SEMAPHORE_COUNT || gfxSemCounterI(psem) < psem->limit) + cyg_semaphore_post(&psem->sem); +} + +semcount_t gfxSemCounterI(gfxSem *psem) { + semcount_t cnt; + + cyg_semaphore_peek(&psem->sem, &cnt); + return cnt; +} + +gfxThreadHandle gfxThreadCreate(void *stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void *param) +{ + gfxThreadHandle th; + + if (!stackarea) { + if (!stacksz) stacksz = CYGNUM_HAL_STACK_SIZE_TYPICAL; + if (!(stackarea = gfxAlloc(stacksz+sizeof(cyg_thread)))) + return 0; + } + + if (!stacksz) + return 0; + + cyg_thread_create(prio, fn, param, "uGFX", (((cyg_thread *)stackarea)+1), stacksz, &th, (cyg_thread *)stackarea); + cyg_thread_resume(th); + return th; +} + +#endif /* GFX_USE_OS_ECOS */ -- cgit v1.2.3