aboutsummaryrefslogtreecommitdiffstats
path: root/demos/modules/gos/threads/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'demos/modules/gos/threads/main.c')
-rw-r--r--demos/modules/gos/threads/main.c102
1 files changed, 37 insertions, 65 deletions
diff --git a/demos/modules/gos/threads/main.c b/demos/modules/gos/threads/main.c
index c68fcd18..b15c656d 100644
--- a/demos/modules/gos/threads/main.c
+++ b/demos/modules/gos/threads/main.c
@@ -1,83 +1,55 @@
-/*
- * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
- * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the <organization> nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
#include "gfx.h"
-gfxThreadHandle thd1;
-gfxThreadHandle thd2;
+#if defined(WIN32)
+ #include <windows.h>
+
+ static DWORD nres;
+
+ // On Win32 don't use the C library fprintf or write as they crash.
+ // Maybe we just need to add the multi-thread C library options to the compile.
+ // Instead we use the Win32 API directly as that always works.
+ #define DEBUGWRITE(str) WriteFile(GetStdHandle(STD_ERROR_HANDLE), str, strlen(str), &nres, 0)
+#else
+ #warning "You must alter this demo to define a DEBUGWRITE macro for your platform."
+ #warning "Be careful of using C library functions as they sometimes crash if they are not expecting stack changes (if possible use a multi-thread aware C library)"
+ #warning "You might flash LED's instead if that is better for your platform."
+ #error "--"
+#endif
-/*
- * Function 1: Prints a message
- */
-threadreturn_t Thread1_function(void* param)
+threadreturn_t heartbeat1(void* param)
{
- // We don't use the parameter
- (void)param;
+ (void)param;
- // We never return
- while (1) {
- printf("Message from Thread 1\r\n");
- gfxSleepMilliseconds(500);
- }
+ while (TRUE) {
+ DEBUGWRITE("thread 1\n");
+ gfxSleepMilliseconds(500);
+ }
- return (threadreturn_t)0;
+ return (threadreturn_t)0;
}
-/*
- * Function 2: Prints a message and appends the parameter
- */
-threadreturn_t Thread2_function(void* param)
+threadreturn_t heartbeat2(void* param)
{
- int i;
+ (void)param;
- // we never return
- while (1) {
- printf("Message from Thread 2: %s\r\n", (char*)param);
- gfxSleepMilliseconds(500);
- }
+ while (TRUE) {
+ DEBUGWRITE("thread 2\n");
+ gfxSleepMilliseconds(900);
+ }
- return (threadreturn_t)0;
+ return (threadreturn_t)0;
}
int main(void)
{
- char* msg = "uGFX";
-
- gfxInit();
-
- /* Create a static thread from the default heap with normal priority. No parameter passed */
- thd1 = gfxThreadCreate(NULL, 128, NORMAL_PRIORITY, Thread1_function, 0);
+ gfxInit();
- /* Create a static thread from the default heap with normal priority. String parameter passed */
- thd2 = gfxThreadCreate(NULL, 128, NORMAL_PRIORITY, Thread2_function, (void*)msg);
+ // Give this plenty of stack. Stack size optimisation should be a production change only
+ gfxThreadCreate(0, 2048, NORMAL_PRIORITY, heartbeat1, 0);
+ gfxThreadCreate(0, 2048, NORMAL_PRIORITY, heartbeat2, 0);
- while(TRUE) {
- gfxSleepMilliseconds(500);
- }
+ while (TRUE) {
+ DEBUGWRITE("thread main\n");
+ gfxSleepMilliseconds(1400);
+ }
}