From 324ab8a11adb6526a06333b3d11d7314ee48a4f8 Mon Sep 17 00:00:00 2001 From: inmarket Date: Wed, 8 Jul 2015 15:21:53 +1000 Subject: Updated gos/threads and gos/threads_advanced demos. --- demos/modules/gos/threads/main.c | 102 ++++++++++++++------------------------- 1 file changed, 37 insertions(+), 65 deletions(-) (limited to 'demos/modules/gos/threads/main.c') 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 - * 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 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 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 + + 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); + } } -- cgit v1.2.3