aboutsummaryrefslogtreecommitdiffstats
path: root/src/gos/gos_keil.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gos/gos_keil.c')
-rw-r--r--src/gos/gos_keil.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/gos/gos_keil.c b/src/gos/gos_keil.c
new file mode 100644
index 00000000..72b37404
--- /dev/null
+++ b/src/gos/gos_keil.c
@@ -0,0 +1,80 @@
+/*
+ * 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"
+#include <string.h>
+
+#if GFX_USE_OS_KEIL
+
+void _gosInit(void)
+{
+ #if !GFX_OS_NO_INIT
+ osKernelInitialize();
+ if (!osKernelRunning())
+ osKernelStart();
+ #elif !GFX_OS_INIT_NO_WARNING
+ #warning "GOS: Operating System initialization has been turned off. Make sure you call osKernelInitialize() and osKernelStart() before gfxInit() in your application!"
+ #endif
+
+ // Set up the heap allocator
+ _gosHeapInit();
+}
+
+void _gosDeinit(void)
+{
+}
+
+void gfxMutexInit(gfxMutex* pmutex)
+{
+ pmutex->id = osMutexCreate(pmutex->osMutex(id));
+}
+
+void gfxSemInit(gfxSem* psem, semcount_t val, semcount_t limit)
+{
+ psem->id = osSemaphoreCreate(psem->osSemaphore(id), limit);
+ while(val--)
+ osSemaphoreRelease(psem->id);
+}
+
+void gfxSemDestroy(gfxSem* psem)
+{
+ osSemaphoreDelete(psem->id);
+}
+
+bool_t gfxSemWait(gfxSem* psem, delaytime_t ms)
+{
+ return osSemaphoreWait(psem->id, ms) > 0;
+}
+
+bool_t gfxSemWaitI(gfxSem* psem)
+{
+ return osSemaphoreWait(psem->id, 0) > 0;
+}
+
+void gfxSemSignal(gfxSem* psem)
+{
+ osSemaphoreRelease(psem->id);
+}
+
+void gfxSemSignalI(gfxSem* psem)
+{
+ osSemaphoreRelease(psem->id);
+}
+
+gfxThreadHandle gfxThreadCreate(void* stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void* param)
+{
+ osThreadDef(ugfx_thread, prio, 1, stacksz);
+
+ return osThreadCreate(osThread(ugfx_thread), param);
+}
+
+threadreturn_t gfxThreadWait(gfxThreadHandle thread) {
+ while(osThreadGetPriority(thread) == osPriorityError)
+ gfxYield();
+}
+
+#endif /* GFX_USE_OS_KEIL */