aboutsummaryrefslogtreecommitdiffstats
path: root/src/gos/gos_cmsis2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gos/gos_cmsis2.c')
-rw-r--r--src/gos/gos_cmsis2.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/gos/gos_cmsis2.c b/src/gos/gos_cmsis2.c
new file mode 100644
index 00000000..abbea6b2
--- /dev/null
+++ b/src/gos/gos_cmsis2.c
@@ -0,0 +1,110 @@
+/*
+ * 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_CMSIS2
+
+#if !GFX_OS_NO_INIT && !GFX_OS_CALL_UGFXMAIN
+ #error "GOS: Either GFX_OS_NO_INIT or GFX_OS_CALL_UGFXMAIN must be defined for CMSIS V2"
+#endif
+
+void _gosHeapInit(void);
+
+void _gosInit(void)
+{
+ #if GFX_OS_NO_INIT && !GFX_OS_INIT_NO_WARNING
+ #if GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_DIRECT
+ #warning "GOS: Operating System initialization has been turned off. Make sure you call osKernelInitialize()."
+ #elif GFX_COMPILER_WARNING_TYPE == GFX_COMPILER_WARNING_MACRO
+ COMPILER_WARNING("GOS: Operating System initialization has been turned off. Make sure you call osKernelInitialize().")
+ #endif
+ #endif
+
+ // Set up the heap allocator
+ _gosHeapInit();
+}
+
+#if !GFX_OS_NO_INIT && GFX_OS_CALL_UGFXMAIN
+ static DECLARE_THREAD_FUNCTION(startUGFX_CMSIS2, p) {
+ (void) p;
+ uGFXMain();
+ }
+#endif
+void _gosPostInit(void)
+{
+ #if !GFX_OS_NO_INIT && GFX_OS_CALL_UGFXMAIN
+ switch(osKernelGetState()) {
+ case osKernelInactive:
+ osKernelInitialize();
+ /* Fall Through */
+ case osKernelReady:
+ gfxThreadCreate(0, GFX_OS_UGFXMAIN_STACKSIZE, NORMAL_PRIORITY, startUGFX_CMSIS2, 0);
+ osKernelStart();
+ gfxHalt("Unable to start CMSIS V2 scheduler. Out of memory?");
+ break;
+ default:
+ gfxThreadCreate(0, GFX_OS_UGFXMAIN_STACKSIZE, NORMAL_PRIORITY, startUGFX_CMSIS2, 0);
+ break;
+ }
+ #endif
+}
+
+void _gosDeinit(void)
+{
+}
+
+void gfxMutexInit(gfxMutex* pmutex)
+{
+ *pmutex = osMutexNew(NULL);
+}
+
+void gfxSemInit(gfxSem* psem, semcount_t val, semcount_t limit)
+{
+ *pmutex = osSemaphoreNew(limit, val, NULL);
+}
+
+bool_t gfxSemWait(gfxSem* psem, delaytime_t ms)
+{
+ if (osSemaphoreAcquire(*psem, gfxMillisecondsToTicks(ms)) == osOK)
+ return TRUE;
+ return FALSE;
+}
+
+gfxThreadHandle gfxThreadCreate(void* stackarea, size_t stacksz, threadpriority_t prio, DECLARE_THREAD_FUNCTION((*fn),p), void* param)
+{
+ osThreadAttr_t def;
+
+ (void)stackarea;
+
+ memset(&def, 0, sizeof(def));
+ def.name = "uGFX";
+ def.attr_bits = osThreadDetached; // osThreadJoinable
+ def.stack_mem = 0;
+ def.stack_size = stacksz;
+ def.priority = prio;
+ //def.tz_module = ????;
+
+ return osThreadNew((osThreadFunc_t)fn, param, &def);
+}
+
+threadreturn_t gfxThreadWait(gfxThreadHandle thread) {
+ while(1) {
+ switch(osThreadGetState(thread)) {
+ case osThreadReady:
+ case osThreadRunning:
+ case osThreadBlocked:
+ gfxYield();
+ break;
+ default:
+ return;
+ }
+ }
+}
+
+#endif /* GFX_USE_OS_CMSIS2 */