diff --git a/demos/modules/gos/threads/gfxconf.h b/demos/modules/gos/threads/gfxconf.h index 71a23ac0..dd36bf3d 100644 --- a/demos/modules/gos/threads/gfxconf.h +++ b/demos/modules/gos/threads/gfxconf.h @@ -1,39 +1,43 @@ -/* - * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu - * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket +/** + * This file has a different license to the rest of the uGFX system. + * You can copy, modify and distribute this file as you see fit. + * You do not need to publish your source modifications to this file. + * The only thing you are not permitted to do is to relicense it + * under a different license. + */ + +/** + * Copy this file into your project directory and rename it as gfxconf.h + * Edit your copy to turn on the uGFX features you want to use. + * The values below are the defaults. * - * All rights reserved. + * Only remove the comments from lines where you want to change the + * default value. This allows definitions to be included from + * driver makefiles when required and provides the best future + * compatibility for your project. * - * 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. + * Please use spaces instead of tabs in this file. */ #ifndef _GFXCONF_H #define _GFXCONF_H -/* The operating system to use. One of these must be defined - preferably in your Makefile */ -//#define GFX_USE_OS_CHIBIOS FALSE -//#define GFX_USE_OS_WIN32 FALSE -//#define GFX_USE_OS_LINUX FALSE -//#define GFX_USE_OS_OSX FALSE + +/////////////////////////////////////////////////////////////////////////// +// GOS - One of these must be defined, preferably in your Makefile // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_OS_CHIBIOS FALSE +//#define GFX_USE_OS_FREERTOS FALSE +// #define GFX_FREERTOS_USE_TRACE FALSE +//#define GFX_USE_OS_WIN32 FALSE +//#define GFX_USE_OS_LINUX FALSE +//#define GFX_USE_OS_OSX FALSE +//#define GFX_USE_OS_ECOS FALSE +//#define GFX_USE_OS_RAWRTOS FALSE +//#define GFX_USE_OS_RAW32 FALSE + +// We define this here in case you are using raw32 or arduino with this demo +// and have a non-thread-safe C library. +#define GOS_RAW_HEAP_SIZE 10240 #endif /* _GFXCONF_H */ 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 -/* - * Function 1: Prints a message - */ -threadreturn_t Thread1_function(void* param) + 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 + +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(); - gfxInit(); + // 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); - /* Create a static thread from the default heap with normal priority. No parameter passed */ - thd1 = gfxThreadCreate(NULL, 128, NORMAL_PRIORITY, Thread1_function, 0); - - /* Create a static thread from the default heap with normal priority. String parameter passed */ - thd2 = gfxThreadCreate(NULL, 128, NORMAL_PRIORITY, Thread2_function, (void*)msg); - - while(TRUE) { - gfxSleepMilliseconds(500); - } + while (TRUE) { + DEBUGWRITE("thread main\n"); + gfxSleepMilliseconds(1400); + } } diff --git a/demos/modules/gos/threads_advanced/gfxconf.h b/demos/modules/gos/threads_advanced/gfxconf.h index f954e973..9a35130a 100644 --- a/demos/modules/gos/threads_advanced/gfxconf.h +++ b/demos/modules/gos/threads_advanced/gfxconf.h @@ -30,11 +30,22 @@ #ifndef _GFXCONF_H #define _GFXCONF_H -/* The operating system to use. One of these must be defined - preferably in your Makefile */ -//#define GFX_USE_OS_CHIBIOS FALSE -//#define GFX_USE_OS_WIN32 FALSE -//#define GFX_USE_OS_LINUX FALSE -//#define GFX_USE_OS_OSX FALSE +/////////////////////////////////////////////////////////////////////////// +// GOS - One of these must be defined, preferably in your Makefile // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_OS_CHIBIOS FALSE +//#define GFX_USE_OS_FREERTOS FALSE +// #define GFX_FREERTOS_USE_TRACE FALSE +//#define GFX_USE_OS_WIN32 FALSE +//#define GFX_USE_OS_LINUX FALSE +//#define GFX_USE_OS_OSX FALSE +//#define GFX_USE_OS_ECOS FALSE +//#define GFX_USE_OS_RAWRTOS FALSE +//#define GFX_USE_OS_RAW32 FALSE + +// We define this here in case you are using raw32 or arduino with this demo +// and have a non-thread-safe C library. +#define GOS_RAW_HEAP_SIZE 10240 #define GFX_USE_GTIMER TRUE diff --git a/demos/modules/gos/threads_advanced/main.c b/demos/modules/gos/threads_advanced/main.c index ecb552ab..89cada9f 100644 --- a/demos/modules/gos/threads_advanced/main.c +++ b/demos/modules/gos/threads_advanced/main.c @@ -43,6 +43,22 @@ GTimer gt; gfxThreadHandle thd; +#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 + /* * Thread function * Prints a message @@ -54,7 +70,7 @@ threadreturn_t Thread_function(void* param) /* Execute this until we shall be terminated */ while (*doExit == FALSE) { - printf("Message from Thread\r\n"); + DEBUGWRITE("Message from Thread\n"); gfxSleepMilliseconds(500); } @@ -72,7 +88,7 @@ void timerCallback(void* param) bool_t* threadExit = (bool_t*)param; /* Ask the Thread to fall over the end */ - printf("Closing thread!\r\n"); + DEBUGWRITE("Closing thread!\n"); *threadExit = TRUE; } @@ -91,14 +107,15 @@ int main(void) /* Create a static thread from the default heap with normal priority. * We pass a the parameter to the thread which tells the thread whether to return or not */ - thd = gfxThreadCreate(NULL, 128, NORMAL_PRIORITY, Thread_function, (void*)&exitThread); + thd = gfxThreadCreate(NULL, 2048, NORMAL_PRIORITY, Thread_function, (void*)&exitThread); /* Start the timer. The callback function will be called once after 2000ms - * We will pass the thread handle as a parameter so the timer can ask the thread to termite + * We will pass the thread handle as a parameter so the timer can ask the thread to terminate */ gtimerStart(>, timerCallback, (void*)&exitThread, FALSE, 2000); while(TRUE) { + DEBUGWRITE("Message from main!\n"); gfxSleepMilliseconds(500); } } diff --git a/gfxconf.example.h b/gfxconf.example.h index 6b2f6d9d..52c129ef 100644 --- a/gfxconf.example.h +++ b/gfxconf.example.h @@ -40,6 +40,7 @@ // #define INTERRUPTS_ON() optional_code // Options that (should where relevant) apply to all operating systems +// #define GFX_COMPILER GFX_COMPILER_UNKNOWN // #define GFX_NO_OS_INIT FALSE // #define GFX_OS_EXTRA_INIT_FUNCTION myOSInitRoutine // #define GFX_OS_EXTRA_DEINIT_FUNCTION myOSDeInitRoutine diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c index 86931952..377ccddb 100644 --- a/src/gdisp/gdisp.c +++ b/src/gdisp/gdisp.c @@ -1259,7 +1259,7 @@ void gdispGBlitArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, c { if (x < 0) { cx += x; x = 0; } if (y < 0) { cy += y; y = 0; } - if (cx <= 0 || cy <= 0 || x >= g->g.Width || y >= g->g.Height) { MUTEX_EXIT(g); return; } + if (cx <= 0 || cy <= 0 || x >= g->g.Width || y >= g->g.Height) { x = y = cx = cy = 0; } g->clipx0 = x; g->clipy0 = y; g->clipx1 = x+cx; if (g->clipx1 > g->g.Width) g->clipx1 = g->g.Width; diff --git a/src/gos/gos_arduino.c b/src/gos/gos_arduino.c index 4c01695a..380d528a 100644 --- a/src/gos/gos_arduino.c +++ b/src/gos/gos_arduino.c @@ -229,18 +229,19 @@ void gfxSleepMicroseconds(delaytime_t ms) { * For those it doesn't - read the compiler manuals and the library source code to * work out the correct macro values. * You can use the debugger to work out the values for your compiler and put them here. - * Defining these macros as constant values makes the system behaviour guaranteed but also - * makes your code compiler and cpu architecture dependant. + * Defining these macros as constant values makes the system behavior guaranteed but also + * makes your code compiler and cpu architecture dependent. It also saves a heap of code + * and a few bytes of RAM. */ -#if 0 - // Define your compiler constant values here. - // These example values are for mingw32 compiler (x86). +#if GFX_COMPILER == GFX_COMPILER_MINGW32 #define AUTO_DETECT_MASK FALSE #define STACK_DIR_UP FALSE #define MASK1 0x00000011 #define MASK2 0x00000000 - #define STACK_BASE 9 + #define STACK_BASE 12 #else + // Use auto-detection of the stack frame format + // Assumes all the relevant stuff to be relocated is in the first 256 bytes of the jmpbuf. #define AUTO_DETECT_MASK TRUE #define STACK_DIR_UP stackdirup // TRUE if the stack grow up instead of down #define MASK1 jmpmask1 // The 1st mask of jmp_buf elements that need relocation diff --git a/src/gos/gos_options.h b/src/gos/gos_options.h index 2f896508..8fb4f51b 100644 --- a/src/gos/gos_options.h +++ b/src/gos/gos_options.h @@ -82,6 +82,18 @@ * @name GOS Optional Parameters * @{ */ + /** + * @brief Enable compiler specific code + * @details Defaults to GFX_COMPILER_UNKNOWN + * @note This is setting enables optimisations that are compiler specific. It does + * not need to be specified as reasonable defaults and various auto-detection + * will happen as required. + */ + #ifndef GFX_COMPILER + #define GFX_COMPILER GFX_COMPILER_UNKNOWN + #endif + #define GFX_COMPILER_UNKNOWN 0 // Unknown compiler + #define GFX_COMPILER_MINGW32 1 // MingW32 (x86) compiler for windows /** * @brief Should uGFX avoid initializing the operating system * @details Defaults to FALSE diff --git a/src/gos/gos_raw32.c b/src/gos/gos_raw32.c index 95e9cb23..f1ff6c45 100644 --- a/src/gos/gos_raw32.c +++ b/src/gos/gos_raw32.c @@ -438,17 +438,18 @@ void gfxSleepMicroseconds(delaytime_t ms) { * work out the correct macro values. * You can use the debugger to work out the values for your compiler and put them here. * Defining these macros as constant values makes the system behavior guaranteed but also - * makes your code compiler and cpu architecture dependent. + * makes your code compiler and cpu architecture dependent. It also saves a heap of code + * and a few bytes of RAM. */ -#if 0 - // Define your compiler constant values here. - // These example values are for mingw32 compiler (x86). +#if GFX_COMPILER == GFX_COMPILER_MINGW32 #define AUTO_DETECT_MASK FALSE #define STACK_DIR_UP FALSE #define MASK1 0x00000011 #define MASK2 0x00000000 - #define STACK_BASE 9 + #define STACK_BASE 12 #else + // Use auto-detection of the stack frame format + // Assumes all the relevant stuff to be relocated is in the first 256 bytes of the jmpbuf. #define AUTO_DETECT_MASK TRUE #define STACK_DIR_UP stackdirup // TRUE if the stack grow up instead of down #define MASK1 jmpmask1 // The 1st mask of jmp_buf elements that need relocation