Updated gos/threads and gos/threads_advanced demos.

This commit is contained in:
inmarket 2015-07-08 15:21:53 +10:00
parent 8318e8dc29
commit ed75f5e8c3
4 changed files with 108 additions and 104 deletions

View File

@ -1,39 +1,43 @@
/*
* Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
* 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 <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.
* 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 */

View File

@ -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>
/*
* 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);
}
}

View File

@ -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

View File

@ -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);
}
}