diff options
Diffstat (limited to 'demos/modules/gos/threads/main.c')
-rw-r--r-- | demos/modules/gos/threads/main.c | 102 |
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); + } } |