aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demos/modules/gos/threads/gfxconf.h64
-rw-r--r--demos/modules/gos/threads/main.c102
-rw-r--r--demos/modules/gos/threads_advanced/gfxconf.h21
-rw-r--r--demos/modules/gos/threads_advanced/main.c25
-rw-r--r--gfxconf.example.h1
-rw-r--r--src/gdisp/gdisp.c2
-rw-r--r--src/gos/gos_arduino.c13
-rw-r--r--src/gos/gos_options.h12
-rw-r--r--src/gos/gos_raw32.c11
9 files changed, 135 insertions, 116 deletions
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 <joel@unormal.org>
- * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
- *
- * All rights reserved.
+/**
+ * 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.
*
- * 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.
+ * 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.
*
- * 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.
+ * 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 <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);
+ }
}
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 <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
+
/*
* 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(&gt, 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