Project import generated by Copybara.

NOKEYCHECK=True
GitOrigin-RevId: a816714990ca592d85b9d5d50934e6cb4767c6da
diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/File-Related-CLI-commands.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/File-Related-CLI-commands.c
new file mode 100644
index 0000000..12950cc
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/File-Related-CLI-commands.c
@@ -0,0 +1,568 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* File system includes. */

+#include "fat_sl.h"

+#include "api_mdriver_ram.h"

+

+#ifdef _WINDOWS_

+	#define snprintf _snprintf

+#endif

+

+#define cliNEW_LINE		"\r\n"

+

+/*******************************************************************************

+ * See the URL in the comments within main.c for the location of the online

+ * documentation.

+ ******************************************************************************/

+

+/*

+ * Print out information on a single file.

+ */

+static void prvCreateFileInfoString( char *pcBuffer, F_FIND *pxFindStruct );

+

+/*

+ * Copies an existing file into a newly created file.

+ */

+static portBASE_TYPE prvPerformCopy( const char *pcSourceFile,

+									int32_t lSourceFileLength,

+									const char *pcDestinationFile,

+									char *pxWriteBuffer,

+									size_t xWriteBufferLen );

+

+/*

+ * Implements the DIR command.

+ */

+static portBASE_TYPE prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the CD command.

+ */

+static portBASE_TYPE prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the DEL command.

+ */

+static portBASE_TYPE prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the TYPE command.

+ */

+static portBASE_TYPE prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the COPY command.

+ */

+static portBASE_TYPE prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/* Structure that defines the DIR command line command, which lists all the

+files in the current directory. */

+static const CLI_Command_Definition_t xDIR =

+{

+	"dir", /* The command string to type. */

+	"\r\ndir:\r\n Lists the files in the current directory\r\n",

+	prvDIRCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the CD command line command, which changes the

+working directory. */

+static const CLI_Command_Definition_t xCD =

+{

+	"cd", /* The command string to type. */

+	"\r\ncd <dir name>:\r\n Changes the working directory\r\n",

+	prvCDCommand, /* The function to run. */

+	1 /* One parameter is expected. */

+};

+

+/* Structure that defines the TYPE command line command, which prints the

+contents of a file to the console. */

+static const CLI_Command_Definition_t xTYPE =

+{

+	"type", /* The command string to type. */

+	"\r\ntype <filename>:\r\n Prints file contents to the terminal\r\n",

+	prvTYPECommand, /* The function to run. */

+	1 /* One parameter is expected. */

+};

+

+/* Structure that defines the DEL command line command, which deletes a file. */

+static const CLI_Command_Definition_t xDEL =

+{

+	"del", /* The command string to type. */

+	"\r\ndel <filename>:\r\n deletes a file or directory\r\n",

+	prvDELCommand, /* The function to run. */

+	1 /* One parameter is expected. */

+};

+

+/* Structure that defines the COPY command line command, which deletes a file. */

+static const CLI_Command_Definition_t xCOPY =

+{

+	"copy", /* The command string to type. */

+	"\r\ncopy <source file> <dest file>:\r\n Copies <source file> to <dest file>\r\n",

+	prvCOPYCommand, /* The function to run. */

+	2 /* Two parameters are expected. */

+};

+

+

+/*-----------------------------------------------------------*/

+

+void vRegisterFileSystemCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xDIR );

+	FreeRTOS_CLIRegisterCommand( &xCD );

+	FreeRTOS_CLIRegisterCommand( &xTYPE );

+	FreeRTOS_CLIRegisterCommand( &xDEL );

+	FreeRTOS_CLIRegisterCommand( &xCOPY );

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn = pdTRUE;

+static F_FILE *pxFile = NULL;

+int iChar;

+size_t xByte;

+size_t xColumns = 50U;

+

+	/* Ensure there is always a null terminator after each character written. */

+	memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+

+	/* Ensure the buffer leaves space for the \r\n. */

+	configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) );

+	xWriteBufferLen -= strlen( cliNEW_LINE );

+

+	if( xWriteBufferLen < xColumns )

+	{

+		/* Ensure the loop that uses xColumns as an end condition does not

+		write off the end of the buffer. */

+		xColumns = xWriteBufferLen;

+	}

+

+	if( pxFile == NULL )

+	{

+		/* The file has not been opened yet.  Find the file name. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							1,						/* Return the first parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Attempt to open the requested file. */

+		pxFile = f_open( pcParameter, "r" );

+	}

+

+	if( pxFile != NULL )

+	{

+		/* Read the next chunk of data from the file. */

+		for( xByte = 0; xByte < xColumns; xByte++ )

+		{

+			iChar = f_getc( pxFile );

+

+			if( iChar == -1 )

+			{

+				/* No more characters to return. */

+				f_close( pxFile );

+				pxFile = NULL;

+				break;

+			}

+			else

+			{

+				pcWriteBuffer[ xByte ] = ( char ) iChar;

+			}

+		}

+	}

+

+	if( pxFile == NULL )

+	{

+		/* Either the file was not opened, or all the data from the file has

+		been returned and the file is now closed. */

+		xReturn = pdFALSE;

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength;

+unsigned char ucReturned;

+size_t xStringLength;

+

+	/* Obtain the parameter string. */

+	pcParameter = FreeRTOS_CLIGetParameter

+					(

+						pcCommandString,		/* The command string itself. */

+						1,						/* Return the first parameter. */

+						&xParameterStringLength	/* Store the parameter string length. */

+					);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcParameter );

+

+	/* Attempt to move to the requested directory. */

+	ucReturned = f_chdir( pcParameter );

+

+	if( ucReturned == F_NO_ERROR )

+	{

+		sprintf( pcWriteBuffer, "In: " );

+		xStringLength = strlen( pcWriteBuffer );

+		f_getcwd( &( pcWriteBuffer[ xStringLength ] ), ( unsigned char ) ( xWriteBufferLen - xStringLength ) );

+	}

+	else

+	{

+		sprintf( pcWriteBuffer, "Error" );

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+static F_FIND *pxFindStruct = NULL;

+unsigned char ucReturned;

+portBASE_TYPE xReturn = pdFALSE;

+

+	/* This assumes pcWriteBuffer is long enough. */

+	( void ) pcCommandString;

+

+	/* Ensure the buffer leaves space for the \r\n. */

+	configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) );

+	xWriteBufferLen -= strlen( cliNEW_LINE );

+

+	if( pxFindStruct == NULL )

+	{

+		/* This is the first time this function has been executed since the Dir

+		command was run.  Create the find structure. */

+		pxFindStruct = ( F_FIND * ) pvPortMalloc( sizeof( F_FIND ) );

+

+		if( pxFindStruct != NULL )

+		{

+			ucReturned = f_findfirst( "*.*", pxFindStruct );

+

+			if( ucReturned == F_NO_ERROR )

+			{

+				prvCreateFileInfoString( pcWriteBuffer, pxFindStruct );

+				xReturn = pdPASS;

+			}

+			else

+			{

+				snprintf( pcWriteBuffer, xWriteBufferLen, "Error: f_findfirst() failed." );

+			}

+		}

+		else

+		{

+			snprintf( pcWriteBuffer, xWriteBufferLen, "Failed to allocate RAM (using heap_4.c will prevent fragmentation)." );

+		}

+	}

+	else

+	{

+		/* The find struct has already been created.  Find the next file in

+		the directory. */

+		ucReturned = f_findnext( pxFindStruct );

+

+		if( ucReturned == F_NO_ERROR )

+		{

+			prvCreateFileInfoString( pcWriteBuffer, pxFindStruct );

+			xReturn = pdPASS;

+		}

+		else

+		{

+			/* There are no more files.  Free the find structure. */

+			vPortFree( pxFindStruct );

+			pxFindStruct = NULL;

+

+			/* No string to return. */

+			pcWriteBuffer[ 0 ] = 0x00;

+		}

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength;

+unsigned char ucReturned;

+

+	/* This function assumes xWriteBufferLen is large enough! */

+	( void ) xWriteBufferLen;

+

+	/* Obtain the parameter string. */

+	pcParameter = FreeRTOS_CLIGetParameter

+					(

+						pcCommandString,		/* The command string itself. */

+						1,						/* Return the first parameter. */

+						&xParameterStringLength	/* Store the parameter string length. */

+					);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcParameter );

+

+	/* Attempt to delete the file. */

+	ucReturned = f_delete( pcParameter );

+

+	if( ucReturned == F_NO_ERROR )

+	{

+		sprintf( pcWriteBuffer, "%s was deleted", pcParameter );

+	}

+	else

+	{

+		sprintf( pcWriteBuffer, "Error" );

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+char *pcSourceFile, *pcDestinationFile;

+portBASE_TYPE xParameterStringLength;

+long lSourceLength, lDestinationLength = 0;

+

+	/* Obtain the name of the destination file. */

+	pcDestinationFile = ( char * ) FreeRTOS_CLIGetParameter

+									(

+										pcCommandString,		/* The command string itself. */

+										2,						/* Return the second parameter. */

+										&xParameterStringLength	/* Store the parameter string length. */

+									);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcDestinationFile );

+

+	/* Obtain the name of the source file. */

+	pcSourceFile = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									1,						/* Return the first parameter. */

+									&xParameterStringLength	/* Store the parameter string length. */

+								);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcSourceFile );

+

+	/* Terminate the string. */

+	pcSourceFile[ xParameterStringLength ] = 0x00;

+

+	/* See if the source file exists, obtain its length if it does. */

+	lSourceLength = f_filelength( pcSourceFile );

+

+	if( lSourceLength == 0 )

+	{

+		sprintf( pcWriteBuffer, "Source file does not exist" );

+	}

+	else

+	{

+		/* See if the destination file exists. */

+		lDestinationLength = f_filelength( pcDestinationFile );

+

+		if( lDestinationLength != 0 )

+		{

+			sprintf( pcWriteBuffer, "Error: Destination file already exists" );

+		}

+	}

+

+	/* Continue only if the source file exists and the destination file does

+	not exist. */

+	if( ( lSourceLength != 0 ) && ( lDestinationLength == 0 ) )

+	{

+		if( prvPerformCopy( pcSourceFile, lSourceLength, pcDestinationFile, pcWriteBuffer, xWriteBufferLen ) == pdPASS )

+		{

+			sprintf( pcWriteBuffer, "Copy made" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Error during copy" );

+		}

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvPerformCopy( const char *pcSourceFile,

+									int32_t lSourceFileLength,

+									const char *pcDestinationFile,

+									char *pxWriteBuffer,

+									size_t xWriteBufferLen )

+{

+int32_t lBytesRead = 0, lBytesToRead, lBytesRemaining;

+F_FILE *pxFile;

+portBASE_TYPE xReturn = pdPASS;

+

+	/* NOTE:  Error handling has been omitted for clarity. */

+

+	while( lBytesRead < lSourceFileLength )

+	{

+		/* How many bytes are left? */

+		lBytesRemaining = lSourceFileLength - lBytesRead;

+

+		/* How many bytes should be read this time around the loop.  Can't

+		read more bytes than will fit into the buffer. */

+		if( lBytesRemaining > ( long ) xWriteBufferLen )

+		{

+			lBytesToRead = ( long ) xWriteBufferLen;

+		}

+		else

+		{

+			lBytesToRead = lBytesRemaining;

+		}

+

+		/* Open the source file, seek past the data that has already been

+		read from the file, read the next block of data, then close the

+		file again so the destination file can be opened. */

+		pxFile = f_open( pcSourceFile, "r" );

+		if( pxFile != NULL )

+		{

+			f_seek( pxFile, lBytesRead, F_SEEK_SET );

+			f_read( pxWriteBuffer, lBytesToRead, 1, pxFile );

+			f_close( pxFile );

+		}

+		else

+		{

+			xReturn = pdFAIL;

+			break;

+		}

+

+		/* Open the destination file and write the block of data to the end of

+		the file. */

+		pxFile = f_open( pcDestinationFile, "a" );

+		if( pxFile != NULL )

+		{

+			f_write( pxWriteBuffer, lBytesToRead, 1, pxFile );

+			f_close( pxFile );

+		}

+		else

+		{

+			xReturn = pdFAIL;

+			break;

+		}

+

+		lBytesRead += lBytesToRead;

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreateFileInfoString( char *pcBuffer, F_FIND *pxFindStruct )

+{

+const char *pcWritableFile = "writable file", *pcReadOnlyFile = "read only file", *pcDirectory = "directory";

+const char * pcAttrib;

+

+	/* Point pcAttrib to a string that describes the file. */

+	if( ( pxFindStruct->attr & F_ATTR_DIR ) != 0 )

+	{

+		pcAttrib = pcDirectory;

+	}

+	else if( pxFindStruct->attr & F_ATTR_READONLY )

+	{

+		pcAttrib = pcReadOnlyFile;

+	}

+	else

+	{

+		pcAttrib = pcWritableFile;

+	}

+

+	/* Create a string that includes the file name, the file size and the

+	attributes string. */

+	sprintf( pcBuffer, "%s [%s] [size=%d]", pxFindStruct->filename, pcAttrib, ( int ) pxFindStruct->filesize );

+}

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c
new file mode 100644
index 0000000..2ecec85
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c
@@ -0,0 +1,419 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+

+ /******************************************************************************

+ *

+ * See the following URL for information on the commands defined in this file:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml

+ *

+ ******************************************************************************/

+

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+#ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS

+	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0

+#endif

+

+

+/*

+ * Implements the task-stats command.

+ */

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the run-time-stats command.

+ */

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-three-parameters command.

+ */

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-parameters command.

+ */

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the "trace start" and "trace stop" commands;

+ */

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+#endif

+

+/* Structure that defines the "run-time-stats" command line command.   This

+generates a table that shows how much run time each task has */

+static const CLI_Command_Definition_t xRunTimeStats =

+{

+	"run-time-stats", /* The command string to type. */

+	"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n",

+	prvRunTimeStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "task-stats" command line command.  This generates

+a table that gives information on each task in the system. */

+static const CLI_Command_Definition_t xTaskStats =

+{

+	"task-stats", /* The command string to type. */

+	"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n",

+	prvTaskStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "echo_3_parameters" command line command.  This

+takes exactly three parameters that the command simply echos back one at a

+time. */

+static const CLI_Command_Definition_t xThreeParameterEcho =

+{

+	"echo-3-parameters",

+	"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n",

+	prvThreeParameterEchoCommand, /* The function to run. */

+	3 /* Three parameters are expected, which can take any value. */

+};

+

+/* Structure that defines the "echo_parameters" command line command.  This

+takes a variable number of parameters that the command simply echos back one at

+a time. */

+static const CLI_Command_Definition_t xParameterEcho =

+{

+	"echo-parameters",

+	"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n",

+	prvParameterEchoCommand, /* The function to run. */

+	-1 /* The user can enter any number of commands. */

+};

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	/* Structure that defines the "trace" command line command.  This takes a single

+	parameter, which can be either "start" or "stop". */

+	static const CLI_Command_Definition_t xStartStopTrace =

+	{

+		"trace",

+		"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n",

+		prvStartStopTraceCommand, /* The function to run. */

+		1 /* One parameter is expected.  Valid values are "start" and "stop". */

+	};

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

+

+/*-----------------------------------------------------------*/

+

+void vRegisterSampleCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xTaskStats );

+	FreeRTOS_CLIRegisterCommand( &xRunTimeStats );

+	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xParameterEcho );

+

+	#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )

+	{

+		FreeRTOS_CLIRegisterCommand( & xStartStopTrace );

+	}

+	#endif

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskList( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The three parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Return the parameter string. */

+		memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+		sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+		strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+		/* If this is the last of the three parameters then there are no more

+		strings to return after this one. */

+		if( lParameterNumber == 3L )

+		{

+			/* If this is the last of the three parameters then there are no more

+			strings to return after this one. */

+			xReturn = pdFALSE;

+			lParameterNumber = 0L;

+		}

+		else

+		{

+			/* There are more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		if( pcParameter != NULL )

+		{

+			/* Return the parameter string. */

+			memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+			sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+			strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+			/* There might be more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+		else

+		{

+			/* No more parameters were found.  Make sure the write buffer does

+			not contain a valid string. */

+			pcWriteBuffer[ 0 ] = 0x00;

+

+			/* No more data to return. */

+			xReturn = pdFALSE;

+

+			/* Start over the next time this command is executed. */

+			lParameterNumber = 0;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	const char *pcParameter;

+	portBASE_TYPE lParameterStringLength;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							1,						/* Return the first parameter. */

+							&lParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* There are only two valid parameter values. */

+		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )

+		{

+			/* Start or restart the trace. */

+			vTraceStop();

+			vTraceClear();

+			vTraceStart();

+

+			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );

+		}

+		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )

+		{

+			/* End the trace, if one is running. */

+			vTraceStop();

+			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );

+		}

+

+		/* There is no more data to return after this single string, so return

+		pdFALSE. */

+		return pdFALSE;

+	}

+

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
new file mode 100644
index 0000000..0aa8dc9
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
@@ -0,0 +1,256 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*

+ * NOTE:  This file uses a third party USB CDC driver.

+ */

+

+/* Standard includes. */

+#include "string.h"

+#include "stdio.h"

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "semphr.h"

+

+/* Example includes. */

+#include "FreeRTOS_CLI.h"

+

+/* Demo application includes. */

+#include "serial.h"

+

+/* Dimensions the buffer into which input characters are placed. */

+#define cmdMAX_INPUT_SIZE		50

+

+#define cmdQUEUE_LENGTH			25

+

+/* DEL acts as a backspace. */

+#define cmdASCII_DEL		( 0x7F )

+

+#define cmdMAX_MUTEX_WAIT		( ( ( TickType_t ) 300 ) / ( portTICK_PERIOD_MS ) )

+

+#ifndef configCLI_BAUD_RATE

+	#define configCLI_BAUD_RATE	115200

+#endif

+

+/*-----------------------------------------------------------*/

+

+/*

+ * The task that implements the command console processing.

+ */

+static void prvUARTCommandConsoleTask( void *pvParameters );

+void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority );

+

+/*-----------------------------------------------------------*/

+

+/* Const messages output by the command console. */

+static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";

+static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";

+static const char * const pcNewLine = "\r\n";

+

+SemaphoreHandle_t xTxMutex = NULL;

+static xComPortHandle xPort = 0;

+

+/*-----------------------------------------------------------*/

+

+void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority )

+{

+	/* Create the semaphore used to access the UART Tx. */

+	xTxMutex = xSemaphoreCreateMutex();

+	configASSERT( xTxMutex );

+

+	/* Create that task that handles the console itself. */

+	xTaskCreate( 	prvUARTCommandConsoleTask,	/* The task that implements the command console. */

+					"CLI",						/* Text name assigned to the task.  This is just to assist debugging.  The kernel does not use this name itself. */

+					usStackSize,				/* The size of the stack allocated to the task. */

+					NULL,						/* The parameter is not used, so NULL is passed. */

+					uxPriority,					/* The priority allocated to the task. */

+					NULL );						/* A handle is not required, so just pass NULL. */

+}

+/*-----------------------------------------------------------*/

+

+static void prvUARTCommandConsoleTask( void *pvParameters )

+{

+signed char cRxedChar;

+uint8_t ucInputIndex = 0;

+char *pcOutputString;

+static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];

+portBASE_TYPE xReturned;

+xComPortHandle xPort;

+

+	( void ) pvParameters;

+

+	/* Obtain the address of the output buffer.  Note there is no mutual

+	exclusion on this buffer as it is assumed only one command console interface

+	will be used at any one time. */

+	pcOutputString = FreeRTOS_CLIGetOutputBuffer();

+

+	/* Initialise the UART. */

+	xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );

+

+	/* Send the welcome message. */

+	vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, strlen( pcWelcomeMessage ) );

+

+	for( ;; )

+	{

+		/* Wait for the next character.  The while loop is used in case

+		INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will

+		be a genuine block time rather than an infinite block time. */

+		while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS );

+

+		/* Ensure exclusive access to the UART Tx. */

+		if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )

+		{

+			/* Echo the character back. */

+			xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );

+

+			/* Was it the end of the line? */

+			if( cRxedChar == '\n' || cRxedChar == '\r' )

+			{

+				/* Just to space the output from the input. */

+				vSerialPutString( xPort, ( signed char * ) pcNewLine, strlen( pcNewLine ) );

+

+				/* See if the command is empty, indicating that the last command

+				is to be executed again. */

+				if( ucInputIndex == 0 )

+				{

+					/* Copy the last command back into the input string. */

+					strcpy( cInputString, cLastInputString );

+				}

+

+				/* Pass the received command to the command interpreter.  The

+				command interpreter is called repeatedly until it returns

+				pdFALSE	(indicating there is no more output) as it might

+				generate more than one string. */

+				do

+				{

+					/* Get the next output string from the command interpreter. */

+					xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );

+

+					/* Write the generated string to the UART. */

+					vSerialPutString( xPort, ( signed char * ) pcOutputString, strlen( pcOutputString ) );

+

+				} while( xReturned != pdFALSE );

+

+				/* All the strings generated by the input command have been

+				sent.  Clear the input string ready to receive the next command.

+				Remember the command that was just processed first in case it is

+				to be processed again. */

+				strcpy( cLastInputString, cInputString );

+				ucInputIndex = 0;

+				memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );

+

+				vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ) );

+			}

+			else

+			{

+				if( cRxedChar == '\r' )

+				{

+					/* Ignore the character. */

+				}

+				else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )

+				{

+					/* Backspace was pressed.  Erase the last character in the

+					string - if any. */

+					if( ucInputIndex > 0 )

+					{

+						ucInputIndex--;

+						cInputString[ ucInputIndex ] = '\0';

+					}

+				}

+				else

+				{

+					/* A character was entered.  Add it to the string entered so

+					far.  When a \n is entered the complete	string will be

+					passed to the command interpreter. */

+					if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )

+					{

+						if( ucInputIndex < cmdMAX_INPUT_SIZE )

+						{

+							cInputString[ ucInputIndex ] = cRxedChar;

+							ucInputIndex++;

+						}

+					}

+				}

+			}

+

+			/* Must ensure to give the mutex back. */

+			xSemaphoreGive( xTxMutex );

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vOutputString( const char * const pcMessage )

+{

+	if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )

+	{

+		vSerialPutString( xPort, ( signed char * ) pcMessage, strlen( pcMessage ) );

+		xSemaphoreGive( xTxMutex );

+	}

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UDP-Related-CLI-commands.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UDP-Related-CLI-commands.c
new file mode 100644
index 0000000..c638d0a
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UDP-Related-CLI-commands.c
@@ -0,0 +1,351 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+ /******************************************************************************

+ *

+ * See the following URL for information on the commands defined in this file:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml

+ *

+ ******************************************************************************/

+

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* FreeRTOS+UDP includes, just to make the stats available to the CLI

+commands. */

+#include "FreeRTOS_UDP_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+/*

+ * Defines a command that prints out IP address information.

+ */

+static portBASE_TYPE prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that prints out the gathered demo debug stats.

+ */

+static portBASE_TYPE prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that sends an ICMP ping request to an IP address.

+ */

+static portBASE_TYPE prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/* Structure that defines the "ip-config" command line command. */

+static const CLI_Command_Definition_t xIPConfig =

+{

+	"ip-config",

+	"ip-config:\r\n Displays IP address configuration\r\n\r\n",

+	prvDisplayIPConfig,

+	0

+};

+

+#if configINCLUDE_DEMO_DEBUG_STATS != 0

+	/* Structure that defines the "ip-debug-stats" command line command. */

+	static const CLI_Command_Definition_t xIPDebugStats =

+	{

+		"ip-debug-stats", /* The command string to type. */

+		"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",

+		prvDisplayIPDebugStats, /* The function to run. */

+		0 /* No parameters are expected. */

+	};

+#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+

+	/* Structure that defines the "ping" command line command.  This takes an IP

+	address or host name and (optionally) the number of bytes to ping as

+	parameters. */

+	static const CLI_Command_Definition_t xPing =

+	{

+		"ping",

+		"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n",

+		prvPingCommand, /* The function to run. */

+		-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */

+	};

+

+#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+

+/*-----------------------------------------------------------*/

+

+void vRegisterUDPCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xIPConfig );

+

+	#if configINCLUDE_DEMO_DEBUG_STATS == 1

+	{

+		FreeRTOS_CLIRegisterCommand( &xIPDebugStats );

+	}

+	#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+	#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+	{

+		FreeRTOS_CLIRegisterCommand( &xPing );

+	}

+	#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+}

+/*-----------------------------------------------------------*/

+

+#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+

+	static portBASE_TYPE prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	char * pcParameter;

+	portBASE_TYPE lParameterStringLength, xReturn;

+	uint32_t ulIPAddress, ulBytesToPing;

+	const uint32_t ulDefaultBytesToPing = 8UL;

+	char cBuffer[ 16 ];

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Start with an empty string. */

+		pcWriteBuffer[ 0 ] = 0x00;

+

+		/* Obtain the number of bytes to ping. */

+		pcParameter = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									2,						/* Return the second parameter. */

+									&lParameterStringLength	/* Store the parameter string length. */

+								);

+

+		if( pcParameter == NULL )

+		{

+			/* The number of bytes was not specified, so default it. */

+			ulBytesToPing = ulDefaultBytesToPing;

+		}

+		else

+		{

+			ulBytesToPing = atol( pcParameter );

+		}

+

+		/* Obtain the IP address string. */

+		pcParameter = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									1,						/* Return the first parameter. */

+									&lParameterStringLength	/* Store the parameter string length. */

+								);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Attempt to obtain the IP address.   If the first character is not a

+		digit, assume the host name has been passed in. */

+		if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )

+		{

+			ulIPAddress = FreeRTOS_inet_addr( pcParameter );

+		}

+		else

+		{

+			/* Terminate the host name. */

+			pcParameter[ lParameterStringLength ] = 0x00;

+

+			/* Attempt to resolve host. */

+			ulIPAddress = FreeRTOS_gethostbyname( pcParameter );

+		}

+

+		/* Convert IP address, which may have come from a DNS lookup, to string. */

+		FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );

+

+		if( ulIPAddress != 0 )

+		{

+			xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );

+		}

+		else

+		{

+			xReturn = pdFALSE;

+		}

+

+		if( xReturn == pdFALSE )

+		{

+			sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn );

+		}

+

+		return pdFALSE;

+	}

+	/*-----------------------------------------------------------*/

+

+#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+#if configINCLUDE_DEMO_DEBUG_STATS != 0

+

+	static portBASE_TYPE prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	static portBASE_TYPE xIndex = -1;

+	extern xExampleDebugStatEntry_t xIPTraceValues[];

+	portBASE_TYPE xReturn;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		xIndex++;

+

+		if( xIndex < xExampleDebugStatEntries() )

+		{

+			sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );

+			xReturn = pdPASS;

+		}

+		else

+		{

+			/* Reset the index for the next time it is called. */

+			xIndex = -1;

+

+			/* Ensure nothing remains in the write buffer. */

+			pcWriteBuffer[ 0 ] = 0x00;

+			xReturn = pdFALSE;

+		}

+

+		return xReturn;

+	}

+	/*-----------------------------------------------------------*/

+

+#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+static portBASE_TYPE prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+static portBASE_TYPE xIndex = 0;

+portBASE_TYPE xReturn;

+uint32_t ulAddress;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	switch( xIndex )

+	{

+		case 0 :

+			FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );

+			sprintf( pcWriteBuffer, "\r\nIP address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 1 :

+			FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );

+			sprintf( pcWriteBuffer, "\r\nNet mask " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 2 :

+			FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );

+			sprintf( pcWriteBuffer, "\r\nGateway address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 3 :

+			FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );

+			sprintf( pcWriteBuffer, "\r\nDNS server address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		default :

+			ulAddress = 0;

+			sprintf( pcWriteBuffer, "\r\n\r\n" );

+			xReturn = pdFALSE;

+			xIndex = 0;

+			break;

+	}

+

+	if( ulAddress != 0 )

+	{

+		FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) );

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_FAT_SL_Demos/CreateExampleFiles/File-system-demo.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_FAT_SL_Demos/CreateExampleFiles/File-system-demo.c
new file mode 100644
index 0000000..8d1f165
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_FAT_SL_Demos/CreateExampleFiles/File-system-demo.c
@@ -0,0 +1,359 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*******************************************************************************

+ * See the URL in the comments within main.c for the location of the online

+ * documentation.

+ ******************************************************************************/

+

+/* Standard includes. */

+#include <stdio.h>

+#include <string.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+

+/* File system includes. */

+#include "fat_sl.h"

+#include "api_mdriver_ram.h"

+

+/* 8.3 format, plus null terminator. */

+#define fsMAX_FILE_NAME_LEN				13

+

+/* The number of bytes read/written to the example files at a time. */

+#define fsRAM_BUFFER_SIZE 				200

+

+/* The number of bytes written to the file that uses f_putc() and f_getc(). */

+#define fsPUTC_FILE_SIZE				100

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Creates and verifies different files on the volume, demonstrating the use of

+ * various different API functions.

+ */

+void vCreateAndVerifySampleFiles( void );

+

+/*

+ * Create a set of example files in the root directory of the volume using

+ * f_write().

+ */

+static void prvCreateDemoFilesUsing_f_write( void );

+

+/*

+ * Use f_read() to read back and verify the files that were created by

+ * prvCreateDemoFilesUsing_f_write().

+ */

+static void prvVerifyDemoFileUsing_f_read( void );

+

+/*

+ * Create an example file in a sub-directory using f_putc().

+ */

+static void prvCreateDemoFileUsing_f_putc( void );

+

+/*

+ * Use f_getc() to read back and verify the file that was created by

+ * prvCreateDemoFileUsing_f_putc().

+ */

+static void prvVerifyDemoFileUsing_f_getc( void );

+

+/*-----------------------------------------------------------*/

+

+/* A buffer used to both create content to write to disk, and read content back

+from a disk.  Note there is no mutual exclusion on this buffer. */

+static char cRAMBuffer[ fsRAM_BUFFER_SIZE ];

+

+/* Names of directories that are created. */

+static const char *pcRoot = "/", *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2";

+

+/*-----------------------------------------------------------*/

+

+void vCreateAndVerifySampleFiles( void )

+{

+unsigned char ucStatus;

+

+	/* First create the volume. */

+	ucStatus = f_initvolume( ram_initfunc );

+

+	/* It is expected that the volume is not formatted. */

+	if( ucStatus == F_ERR_NOTFORMATTED )

+	{

+		/* Format the created volume. */

+		ucStatus = f_format( F_FAT12_MEDIA );

+	}

+

+	if( ucStatus == F_NO_ERROR )

+	{

+		/* Create a set of files using f_write(). */

+		prvCreateDemoFilesUsing_f_write();

+

+		/* Read back and verify the files that were created using f_write(). */

+		prvVerifyDemoFileUsing_f_read();

+

+		/* Create sub directories two deep then create a file using putc. */

+		prvCreateDemoFileUsing_f_putc();

+

+		/* Read back and verify the file created by

+		prvCreateDemoFileUsing_f_putc(). */

+		prvVerifyDemoFileUsing_f_getc();

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreateDemoFilesUsing_f_write( void )

+{

+portBASE_TYPE xFileNumber, xWriteNumber;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+const portBASE_TYPE xMaxFiles = 5;

+long lItemsWritten;

+F_FILE *pxFile;

+

+	/* Create xMaxFiles files.  Each created file will be

+	( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled

+	with a different repeating character. */

+	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )

+	{

+		/* Generate a file name. */

+		sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );

+

+		/* Obtain the current working directory and print out the file name and

+		the	directory into which the file is being written. */

+		f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+

+		/* Open the file, creating the file if it does not already exist. */

+		pxFile = f_open( cFileName, "w" );

+		configASSERT( pxFile );

+

+		/* Fill the RAM buffer with data that will be written to the file.  This

+		is just a repeating ascii character that indicates the file number. */

+		memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );

+

+		/* Write the RAM buffer to the opened file a number of times.  The

+		number of times the RAM buffer is written to the file depends on the

+		file number, so the length of each created file will be different. */

+		for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )

+		{

+			lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );

+			configASSERT( lItemsWritten == 1 );

+		}

+

+		/* Close the file so another file can be created. */

+		f_close( pxFile );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvVerifyDemoFileUsing_f_read( void )

+{

+portBASE_TYPE xFileNumber, xReadNumber;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+const portBASE_TYPE xMaxFiles = 5;

+long lItemsRead, lChar;

+F_FILE *pxFile;

+

+	/* Read back the files that were created by

+	prvCreateDemoFilesUsing_f_write(). */

+	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )

+	{

+		/* Generate the file name. */

+		sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );

+

+		/* Obtain the current working directory and print out the file name and

+		the	directory from which the file is being read. */

+		f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+

+		/* Open the file for reading. */

+		pxFile = f_open( cFileName, "r" );

+		configASSERT( pxFile );

+

+		/* Read the file into the RAM buffer, checking the file contents are as

+		expected.  The size of the file depends on the file number. */

+		for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )

+		{

+			/* Start with the RAM buffer clear. */

+			memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );

+

+			lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );

+			configASSERT( lItemsRead == 1 );

+

+			/* Check the RAM buffer is filled with the expected data.  Each

+			file contains a different repeating ascii character that indicates

+			the number of the file. */

+			for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ )

+			{

+				configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) );

+			}

+		}

+

+		/* Close the file. */

+		f_close( pxFile );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreateDemoFileUsing_f_putc( void )

+{

+unsigned char ucReturn;

+int iByte, iReturned;

+F_FILE *pxFile;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+

+	/* Create a sub directory. */

+	ucReturn = f_mkdir( pcDirectory1 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Move into the created sub-directory. */

+	ucReturn = f_chdir( pcDirectory1 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+

+	/* Create a subdirectory in the new directory. */

+	ucReturn = f_mkdir( pcDirectory2 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Move into the directory just created - now two directories down from

+	the root. */

+	ucReturn = f_chdir( pcDirectory2 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );

+

+	/* Generate the file name. */

+	sprintf( cFileName, "%s.txt", pcDirectory2 );

+

+	/* Print out the file name and the directory into which the file is being

+	written. */

+	pxFile = f_open( cFileName, "w" );

+

+	/* Create a file 1 byte at a time.  The file is filled with incrementing

+	ascii characters starting from '0'. */

+	for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )

+	{

+		iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile );

+		configASSERT( iReturned ==  ( ( int ) '0' + iByte ) );

+	}

+

+	/* Finished so close the file. */

+	f_close( pxFile );

+

+	/* Move back to the root directory. */

+	ucReturn = f_chdir( "../.." );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 );

+}

+/*-----------------------------------------------------------*/

+

+static void prvVerifyDemoFileUsing_f_getc( void )

+{

+unsigned char ucReturn;

+int iByte, iReturned;

+F_FILE *pxFile;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+

+	/* Move into the directory in which the file was created. */

+	ucReturn = f_chdir( pcFullPath );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );

+

+	/* Generate the file name. */

+	sprintf( cFileName, "%s.txt", pcDirectory2 );

+

+	/* This time the file is opened for reading. */

+	pxFile = f_open( cFileName, "r" );

+

+	/* Read the file 1 byte at a time. */

+	for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )

+	{

+		iReturned = f_getc( pxFile );

+		configASSERT( iReturned ==  ( ( int ) '0' + iByte ) );

+	}

+

+	/* Finished so close the file. */

+	f_close( pxFile );

+

+	/* Move back to the root directory. */

+	ucReturn = f_chdir( "../.." );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+}

+

+

+

+

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/CLI-commands.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/CLI-commands.c
new file mode 100644
index 0000000..09ee590
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/CLI-commands.c
@@ -0,0 +1,667 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+ /******************************************************************************

+ *

+ * See the following URL for information on the commands defined in this file:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml

+ *

+ ******************************************************************************/

+

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* FreeRTOS+UDP includes, just to make the stats available to the CLI

+commands. */

+#include "FreeRTOS_UDP_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+#ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS

+	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0

+#endif

+

+

+/*

+ * Implements the run-time-stats command.

+ */

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the task-stats command.

+ */

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-three-parameters command.

+ */

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-parameters command.

+ */

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that prints out IP address information.

+ */

+static portBASE_TYPE prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that prints out the gathered demo debug stats.

+ */

+static portBASE_TYPE prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that sends an ICMP ping request to an IP address.

+ */

+static portBASE_TYPE prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the "trace start" and "trace stop" commands;

+ */

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+#endif

+

+/* Structure that defines the "ip-config" command line command. */

+static const CLI_Command_Definition_t xIPConfig =

+{

+	"ip-config",

+	"ip-config:\r\n Displays IP address configuration\r\n\r\n",

+	prvDisplayIPConfig,

+	0

+};

+

+#if configINCLUDE_DEMO_DEBUG_STATS != 0

+	/* Structure that defines the "ip-debug-stats" command line command. */

+	static const CLI_Command_Definition_t xIPDebugStats =

+	{

+		"ip-debug-stats", /* The command string to type. */

+		"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",

+		prvDisplayIPDebugStats, /* The function to run. */

+		0 /* No parameters are expected. */

+	};

+#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+/* Structure that defines the "run-time-stats" command line command.   This

+generates a table that shows how much run time each task has */

+static const CLI_Command_Definition_t xRunTimeStats =

+{

+	"run-time-stats", /* The command string to type. */

+	"run-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n\r\n",

+	prvRunTimeStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "task-stats" command line command.  This generates

+a table that gives information on each task in the system. */

+static const CLI_Command_Definition_t xTaskStats =

+{

+	"task-stats", /* The command string to type. */

+	"task-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n\r\n",

+	prvTaskStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "echo_3_parameters" command line command.  This

+takes exactly three parameters that the command simply echos back one at a

+time. */

+static const CLI_Command_Definition_t xThreeParameterEcho =

+{

+	"echo-3-parameters",

+	"echo-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n\r\n",

+	prvThreeParameterEchoCommand, /* The function to run. */

+	3 /* Three parameters are expected, which can take any value. */

+};

+

+/* Structure that defines the "echo_parameters" command line command.  This

+takes a variable number of parameters that the command simply echos back one at

+a time. */

+static const CLI_Command_Definition_t xParameterEcho =

+{

+	"echo-parameters",

+	"echo-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n\r\n",

+	prvParameterEchoCommand, /* The function to run. */

+	-1 /* The user can enter any number of commands. */

+};

+

+#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+

+	/* Structure that defines the "ping" command line command.  This takes an IP

+	address or host name and (optionally) the number of bytes to ping as

+	parameters. */

+	static const CLI_Command_Definition_t xPing =

+	{

+		"ping",

+		"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n",

+		prvPingCommand, /* The function to run. */

+		-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */

+	};

+

+#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	/* Structure that defines the "trace" command line command.  This takes a single

+	parameter, which can be either "start" or "stop". */

+	static const CLI_Command_Definition_t xStartStopTrace =

+	{

+		"trace",

+		"trace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n\r\n",

+		prvStartStopTraceCommand, /* The function to run. */

+		1 /* One parameter is expected.  Valid values are "start" and "stop". */

+	};

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

+

+/*-----------------------------------------------------------*/

+

+void vRegisterCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xTaskStats );

+	FreeRTOS_CLIRegisterCommand( &xRunTimeStats );

+	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xIPDebugStats );

+	FreeRTOS_CLIRegisterCommand( &xIPConfig );

+

+	#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+	{

+		FreeRTOS_CLIRegisterCommand( &xPing );

+	}

+	#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+	#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+		FreeRTOS_CLIRegisterCommand( & xStartStopTrace );

+	#endif

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskList( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The three parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Return the parameter string. */

+		memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+		sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+		strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+		/* If this is the last of the three parameters then there are no more

+		strings to return after this one. */

+		if( lParameterNumber == 3L )

+		{

+			/* If this is the last of the three parameters then there are no more

+			strings to return after this one. */

+			xReturn = pdFALSE;

+			lParameterNumber = 0L;

+		}

+		else

+		{

+			/* There are more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		if( pcParameter != NULL )

+		{

+			/* Return the parameter string. */

+			memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+			sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+			strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+			/* There might be more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+		else

+		{

+			/* No more parameters were found.  Make sure the write buffer does

+			not contain a valid string. */

+			pcWriteBuffer[ 0 ] = 0x00;

+

+			/* No more data to return. */

+			xReturn = pdFALSE;

+

+			/* Start over the next time this command is executed. */

+			lParameterNumber = 0;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+

+	static portBASE_TYPE prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	char * pcParameter;

+	portBASE_TYPE lParameterStringLength, xReturn;

+	uint32_t ulIPAddress, ulBytesToPing;

+	const uint32_t ulDefaultBytesToPing = 8UL;

+	char cBuffer[ 16 ];

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Start with an empty string. */

+		pcWriteBuffer[ 0 ] = 0x00;

+

+		/* Obtain the number of bytes to ping. */

+		pcParameter = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									2,						/* Return the second parameter. */

+									&lParameterStringLength	/* Store the parameter string length. */

+								);

+

+		if( pcParameter == NULL )

+		{

+			/* The number of bytes was not specified, so default it. */

+			ulBytesToPing = ulDefaultBytesToPing;

+		}

+		else

+		{

+			ulBytesToPing = atol( pcParameter );

+		}

+

+		/* Obtain the IP address string. */

+		pcParameter = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									1,						/* Return the first parameter. */

+									&lParameterStringLength	/* Store the parameter string length. */

+								);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Attempt to obtain the IP address.   If the first character is not a

+		digit, assume the host name has been passed in. */

+		if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )

+		{

+			ulIPAddress = FreeRTOS_inet_addr( pcParameter );

+		}

+		else

+		{

+			/* Terminate the host name. */

+			pcParameter[ lParameterStringLength ] = 0x00;

+

+			/* Attempt to resolve host. */

+			ulIPAddress = FreeRTOS_gethostbyname( pcParameter );

+		}

+

+		/* Convert IP address, which may have come from a DNS lookup, to string. */

+		FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );

+

+		if( ulIPAddress != 0 )

+		{

+			xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );

+		}

+		else

+		{

+			xReturn = pdFALSE;

+		}

+

+		if( xReturn == pdFALSE )

+		{

+			sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, xReturn );

+		}

+

+		return pdFALSE;

+	}

+	/*-----------------------------------------------------------*/

+

+#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+#if configINCLUDE_DEMO_DEBUG_STATS != 0

+

+	static portBASE_TYPE prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	static portBASE_TYPE xIndex = -1;

+	extern xExampleDebugStatEntry_t xIPTraceValues[];

+	portBASE_TYPE xReturn;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		xIndex++;

+

+		if( xIndex < xExampleDebugStatEntries() )

+		{

+			sprintf( pcWriteBuffer, "%s %d\r\n", xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );

+			xReturn = pdPASS;

+		}

+		else

+		{

+			/* Reset the index for the next time it is called. */

+			xIndex = -1;

+

+			/* Ensure nothing remains in the write buffer. */

+			pcWriteBuffer[ 0 ] = 0x00;

+			xReturn = pdFALSE;

+		}

+

+		return xReturn;

+	}

+	/*-----------------------------------------------------------*/

+

+#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+static portBASE_TYPE prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+static portBASE_TYPE xIndex = 0;

+portBASE_TYPE xReturn;

+uint32_t ulAddress;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	switch( xIndex )

+	{

+		case 0 :

+			FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );

+			sprintf( pcWriteBuffer, "\r\nIP address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 1 :

+			FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );

+			sprintf( pcWriteBuffer, "\r\nNet mask " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 2 :

+			FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );

+			sprintf( pcWriteBuffer, "\r\nGateway address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 3 :

+			FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );

+			sprintf( pcWriteBuffer, "\r\nDNS server address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		default :

+			ulAddress = 0;

+			sprintf( pcWriteBuffer, "\r\n\r\n" );

+			xReturn = pdFALSE;

+			xIndex = 0;

+			break;

+	}

+

+	if( ulAddress != 0 )

+	{

+		FreeRTOS_inet_ntoa( ulAddress,  &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) );

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	const char *pcParameter;

+	portBASE_TYPE lParameterStringLength;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							1,						/* Return the first parameter. */

+							&lParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* There are only two valid parameter values. */

+		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )

+		{

+			/* Start or restart the trace. */

+			vTraceStop();

+			vTraceClear();

+			vTraceStart();

+

+			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );

+		}

+		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )

+		{

+			/* End the trace, if one is running. */

+			vTraceStop();

+			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );

+		}

+

+		/* There is no more data to return after this single string, so return

+		pdFALSE. */

+		return pdFALSE;

+	}

+

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/UDPCommandInterpreter.h b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/UDPCommandInterpreter.h
new file mode 100644
index 0000000..164a5d3
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/UDPCommandInterpreter.h
@@ -0,0 +1,71 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef UDP_COMMAND_INTERPRETER_H

+#define UDP_COMMAND_INTERPRETER_H

+

+void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, unsigned portBASE_TYPE uxPriority );

+

+#endif /* UDP_COMMAND_INTERPRETER_H */

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/UDPCommandServer.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/UDPCommandServer.c
new file mode 100644
index 0000000..b8c5829
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/CLICommands/UDPCommandServer.c
@@ -0,0 +1,244 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* FreeRTOS+UDP includes. */

+#include "FreeRTOS_UDP_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+/* Demo app includes. */

+#include "UDPCommandInterpreter.h"

+

+/* Dimensions the buffer into which input characters are placed. */

+#define cmdMAX_INPUT_SIZE	60

+

+/* Dimensions the buffer into which string outputs can be placed. */

+#define cmdMAX_OUTPUT_SIZE	1024

+

+/* Dimensions the buffer passed to the recvfrom() call. */

+#define cmdSOCKET_INPUT_BUFFER_SIZE 60

+

+/*

+ * The task that runs FreeRTOS+CLI.

+ */

+void vUDPCommandInterpreterTask( void *pvParameters );

+

+/*

+ * Open and configure the UDP socket.

+ */

+static xSocket_t prvOpenUDPServerSocket( uint16_t usPort );

+

+/*-----------------------------------------------------------*/

+

+void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, unsigned portBASE_TYPE uxPriority )

+{

+	xTaskCreate( vUDPCommandInterpreterTask, "CLI", usStackSize, ( void * ) ulPort, uxPriority, NULL );

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * Task that provides the input and output for the FreeRTOS+CLI command

+ * interpreter.  In this case a UDP port is used.  See the URL in the comments

+ * within main.c for the location of the online documentation.

+ */

+void vUDPCommandInterpreterTask( void *pvParameters )

+{

+long lBytes, lByte;

+signed char cInChar, cInputIndex = 0;

+static char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ];

+portBASE_TYPE xMoreDataToFollow;

+struct freertos_sockaddr xClient;

+socklen_t xClientAddressLength = 0; /* This is required as a parameter to maintain the sendto() Berkeley sockets API - but it is not actually used so can take any value. */

+xSocket_t xSocket;

+

+	/* Just to prevent compiler warnings. */

+	( void ) pvParameters;

+

+	/* Attempt to open the socket.  The port number is passed in the task

+	parameter.  The strange casting is to remove compiler warnings on 32-bit

+	machines. */

+	xSocket = prvOpenUDPServerSocket( ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL );

+

+	if( xSocket != FREERTOS_INVALID_SOCKET )

+	{

+		for( ;; )

+		{

+			/* Wait for incoming data on the opened socket. */

+			lBytes = FreeRTOS_recvfrom( xSocket, ( void * ) cLocalBuffer, sizeof( cLocalBuffer ), 0, &xClient, &xClientAddressLength );

+

+			if( lBytes != FREERTOS_SOCKET_ERROR )

+			{

+				/* Process each received byte in turn. */

+				lByte = 0;

+				while( lByte < lBytes )

+				{

+					/* The next character in the input buffer. */

+					cInChar = cLocalBuffer[ lByte ];

+					lByte++;

+

+					/* Newline characters are taken as the end of the command

+					string. */

+					if( cInChar == '\n' )

+					{

+						/* Process the input string received prior to the

+						newline. */

+						do

+						{

+							/* Pass the string to FreeRTOS+CLI. */

+							xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE );

+

+							/* Send the output generated by the command's

+							implementation. */

+							FreeRTOS_sendto( xSocket, cOutputString,  strlen( cOutputString ), 0, &xClient, xClientAddressLength );

+

+						} while( xMoreDataToFollow != pdFALSE ); /* Until the command does not generate any more output. */

+

+						/* All the strings generated by the command processing

+						have been sent.  Clear the input string ready to receive

+						the next command. */

+						cInputIndex = 0;

+						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );

+

+						/* Transmit a spacer, just to make the command console

+						easier to read. */

+						FreeRTOS_sendto( xSocket, "\r\n",  strlen( "\r\n" ), 0, &xClient, xClientAddressLength );

+					}

+					else

+					{

+						if( cInChar == '\r' )

+						{

+							/* Ignore the character.  Newlines are used to

+							detect the end of the input string. */

+						}

+						else if( cInChar == '\b' )

+						{

+							/* Backspace was pressed.  Erase the last character

+							in the string - if any. */

+							if( cInputIndex > 0 )

+							{

+								cInputIndex--;

+								cInputString[ cInputIndex ] = '\0';

+							}

+						}

+						else

+						{

+							/* A character was entered.  Add it to the string

+							entered so far.  When a \n is entered the complete

+							string will be passed to the command interpreter. */

+							if( cInputIndex < cmdMAX_INPUT_SIZE )

+							{

+								cInputString[ cInputIndex ] = cInChar;

+								cInputIndex++;

+							}

+						}

+					}

+				}

+			}

+		}

+	}

+	else

+	{

+		/* The socket could not be opened. */

+		vTaskDelete( NULL );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static xSocket_t prvOpenUDPServerSocket( uint16_t usPort )

+{

+struct freertos_sockaddr xServer;

+xSocket_t xSocket = FREERTOS_INVALID_SOCKET;

+

+	xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );

+	if( xSocket != FREERTOS_INVALID_SOCKET)

+	{

+		/* Zero out the server structure. */

+		memset( ( void * ) &xServer, 0x00, sizeof( xServer ) );

+

+		/* Set family and port. */

+		xServer.sin_port = FreeRTOS_htons( usPort );

+

+		/* Bind the address to the socket. */

+		if( FreeRTOS_bind( xSocket, &xServer, sizeof( xServer ) ) == -1 )

+		{

+			FreeRTOS_closesocket( xSocket );

+			xSocket = FREERTOS_INVALID_SOCKET;

+		}

+	}

+

+	return xSocket;

+}

+

+

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/EchoClients/TwoEchoClients.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/EchoClients/TwoEchoClients.c
new file mode 100644
index 0000000..e5eb00a
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/EchoClients/TwoEchoClients.c
@@ -0,0 +1,397 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+

+/******************************************************************************

+ *

+ * See the following web page for essential TwoEchoClient.c usage and

+ * configuration details:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Common_Echo_Clients.shtml

+ *

+ ******************************************************************************/

+

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+UDP includes. */

+#include "FreeRTOS_UDP_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+/* Small delay used between attempts to obtain a zero copy buffer. */

+#define echoTINY_DELAY	( ( portTickType ) 2 )

+

+/* The echo tasks create a socket, send out a number of echo requests

+(listening for each echo reply), then close the socket again before

+starting over.  This delay is used between each iteration to ensure the

+network does not get too congested. */

+#define echoLOOP_DELAY	( ( portTickType ) 250 / portTICK_RATE_MS )

+

+#if ipconfigINCLUDE_EXAMPLE_FREERTOS_PLUS_TRACE_CALLS == 1

+	/* When the trace recorder code is included user events are generated to

+	mark the sending and receiving of the echoed data (only in the zero copy

+	task. */

+	#define echoMARK_SEND_IN_TRACE_BUFFER( x ) vTraceUserEvent( x )

+	traceLabel xZeroCopySendEvent, xZeroCopyReceiveEvent;

+

+#else

+	/* When the trace recorder code is not included just #define away the call

+	to post the user event. */

+	#define echoMARK_SEND_IN_TRACE_BUFFER( x )

+	#define xZeroCopySendEvent 0

+	#define xZeroCopyReceiveEvent 0

+#endif

+

+/* The echo server is assumed to be on port 7, which is the standard echo

+protocol port. */

+#define echoECHO_PORT	( 7 )

+

+/*

+ * Uses a socket to send data to, then receive data from, the standard echo

+ * port number 7.  prvEchoClientTask() uses the standard interface.

+ * prvZeroCopyEchoClientTask() uses the zero copy interface.

+ */

+static void prvEchoClientTask( void *pvParameters );

+static void prvZeroCopyEchoClientTask( void *pvParameters );

+

+/* The receive timeout is set shorter when the windows simulator is used

+because simulated time is slower than real time. */

+#ifdef _WINDOWS_

+	const portTickType xReceiveTimeOut = 50 / portTICK_RATE_MS;

+#else

+	const portTickType xReceiveTimeOut = 500 / portTICK_RATE_MS;

+#endif

+

+/*-----------------------------------------------------------*/

+

+void vStartEchoClientTasks( uint16_t usTaskStackSize, unsigned portBASE_TYPE uxTaskPriority )

+{

+	/* Create the echo client task that does not use the zero copy interface. */

+	xTaskCreate( 	prvEchoClientTask,	/* The function that implements the task. */

+					"Echo0",			/* Just a text name for the task to aid debugging. */

+					usTaskStackSize,	/* The stack size is defined in FreeRTOSIPConfig.h. */

+					NULL,				/* The task parameter, not used in this case. */

+					uxTaskPriority,		/* The priority assigned to the task is defined in FreeRTOSConfig.h. */

+					NULL );				/* The task handle is not used. */

+

+	/* Create the echo client task that does use the zero copy interface. */

+	xTaskCreate( 	prvZeroCopyEchoClientTask,	/* The function that implements the task. */

+					"Echo1",					/* Just a text name for the task to aid debugging. */

+					usTaskStackSize,			/* The stack size is defined in FreeRTOSIPConfig.h. */

+					NULL,						/* The task parameter, not used in this case. */

+					uxTaskPriority,				/* The priority assigned to the task is defined in FreeRTOSConfig.h. */

+					NULL );						/* The task handle is not used. */

+}

+/*-----------------------------------------------------------*/

+

+static void prvEchoClientTask( void *pvParameters )

+{

+xSocket_t xSocket;

+struct freertos_sockaddr xEchoServerAddress;

+char cTxString[ 25 ], cRxString[ 25 ]; /* Make sure the stack is large enough to hold these.  Turn on stack overflow checking during debug to be sure. */

+int32_t lLoopCount = 0UL;

+const int32_t lMaxLoopCount = 50;

+volatile uint32_t ulRxCount = 0UL, ulTxCount = 0UL;

+uint32_t xAddressLength = sizeof( xEchoServerAddress );

+

+	/* Remove compiler warning about unused parameters. */

+	( void ) pvParameters;

+

+	/* Echo requests are sent to the echo server.  The address of the echo

+	server is configured by the constants configECHO_SERVER_ADDR0 to

+	configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */

+	xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT );

+	xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0,

+															configECHO_SERVER_ADDR1,

+															configECHO_SERVER_ADDR2,

+															configECHO_SERVER_ADDR3 );

+

+	for( ;; )

+	{

+		/* Create a socket. */

+		xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );

+		configASSERT( xSocket != FREERTOS_INVALID_SOCKET );

+

+		/* Set a time out so a missing reply does not cause the task to block

+		indefinitely. */

+		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );

+

+		/* Send a number of echo requests. */

+		for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ )

+		{

+			/* Create the string that is sent to the echo server. */

+			sprintf( cTxString, "Message number %u\r\n", ( unsigned int ) ulTxCount );

+

+			/* Send the string to the socket.  ulFlags is set to 0, so the zero

+			copy interface is not used.  That means the data from cTxString is

+			copied into a network buffer inside FreeRTOS_sendto(), and cTxString

+			can be reused as soon as FreeRTOS_sendto() has returned.  1 is added

+			to ensure the NULL string terminator is sent as part of the message. */

+			FreeRTOS_sendto( xSocket,				/* The socket being sent to. */

+							( void * ) cTxString,	/* The data being sent. */

+							strlen( cTxString ) + 1,/* The length of the data being sent. */

+							0,						/* ulFlags with the FREERTOS_ZERO_COPY bit clear. */

+							&xEchoServerAddress,	/* The destination address. */

+							sizeof( xEchoServerAddress ) );

+

+			/* Keep a count of how many echo requests have been transmitted so

+			it can be compared to the number of echo replies received.  It would

+			be expected to loose at least one to an ARP message the first time

+			the	connection is created. */

+			ulTxCount++;

+

+			/* Receive data echoed back to the socket.  ulFlags is zero, so the

+			zero copy option is not being used and the received data will be

+			copied into the buffer pointed to by cRxString.  xAddressLength is

+			not actually used (at the time of writing this comment, anyway) by

+			FreeRTOS_recvfrom(), but is set appropriately in case future

+			versions do use it. */

+			memset( ( void * ) cRxString, 0x00, sizeof( cRxString ) );

+			FreeRTOS_recvfrom(	xSocket,				/* The socket being received from. */

+								cRxString,				/* The buffer into which the received data will be written. */

+								sizeof( cRxString ),	/* The size of the buffer provided to receive the data. */

+								0,						/* ulFlags with the FREERTOS_ZERO_COPY bit clear. */

+								&xEchoServerAddress,	/* The address from where the data was sent (the source address). */

+								&xAddressLength );

+

+			/* Compare the transmitted string to the received string. */

+			if( strcmp( cRxString, cTxString ) == 0 )

+			{

+				/* The echo reply was received without error. */

+				ulRxCount++;

+			}

+		};

+

+		/* Pause for a short while to ensure the network is not too

+		congested. */

+		vTaskDelay( echoLOOP_DELAY );

+

+		/* Close this socket before looping back to create another. */

+		FreeRTOS_closesocket( xSocket );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvZeroCopyEchoClientTask( void *pvParameters )

+{

+xSocket_t xSocket;

+struct freertos_sockaddr xEchoServerAddress;

+static char cTxString[ 40 ];

+int32_t lLoopCount = 0UL;

+volatile uint32_t ulRxCount = 0UL, ulTxCount = 0UL;

+uint32_t xAddressLength = sizeof( xEchoServerAddress );

+int32_t lReturned;

+uint8_t *pucUDPPayloadBuffer;

+

+const int32_t lMaxLoopCount = 50;

+const char * const pcStringToSend = "Zero copy message number";

+/* The buffer is large enough to hold the string, a number, and the string terminator. */

+const size_t xBufferLength = strlen( pcStringToSend ) + 15;

+

+	#if ipconfigINCLUDE_EXAMPLE_FREERTOS_PLUS_TRACE_CALLS == 1

+	{

+		/* When the trace recorder code is included user events are generated to

+		mark the sending and receiving of the echoed data (only in the zero copy

+		task). */

+		xZeroCopySendEvent = xTraceOpenLabel( "ZeroCopyTx" );

+		xZeroCopyReceiveEvent = xTraceOpenLabel( "ZeroCopyRx" );

+	}

+	#endif /* ipconfigINCLUDE_EXAMPLE_FREERTOS_PLUS_TRACE_CALLS */

+

+	/* Remove compiler warning about unused parameters. */

+	( void ) pvParameters;

+

+	/* Delay for a little while to ensure the task is out of synch with the

+	other echo task implemented above. */

+	vTaskDelay( echoLOOP_DELAY >> 1 );

+

+	/* Echo requests are sent to the echo server.  The address of the echo

+	server is configured by the constants configECHO_SERVER_ADDR0 to

+	configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */

+	xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT );

+	xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0,

+															configECHO_SERVER_ADDR1,

+															configECHO_SERVER_ADDR2,

+															configECHO_SERVER_ADDR3 );

+

+	for( ;; )

+	{

+		/* Create a socket. */

+		xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );

+		configASSERT( xSocket != FREERTOS_INVALID_SOCKET );

+

+		/* Set a time out so a missing reply does not cause the task to block

+		indefinitely. */

+		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );

+

+		/* Send a number of echo requests. */

+		for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ )

+		{

+			/* This task is going to send using the zero copy interface.  The

+			data being sent is therefore written directly into a buffer that is

+			passed by reference into the FreeRTOS_sendto() function.  First

+			obtain a buffer of adequate size from the IP stack.  Although a max

+			delay is used, the actual delay will be capped to

+			ipconfigMAX_SEND_BLOCK_TIME_TICKS, hence the test to ensure a buffer

+			was actually obtained. */

+			pucUDPPayloadBuffer = ( uint8_t * ) FreeRTOS_GetUDPPayloadBuffer( xBufferLength, portMAX_DELAY );

+

+			if( pucUDPPayloadBuffer != NULL )

+			{

+				/* A buffer was successfully obtained.  Create the string that is

+				sent to the echo server.  Note the string is written directly

+				into the buffer obtained from the IP stack. */

+				sprintf( ( char * ) pucUDPPayloadBuffer, "%s %u\r\n", "Zero copy message number", ( unsigned int ) ulTxCount );

+

+				/* Also copy the string into a local buffer so it can be compared

+				with the string that is later received back from the echo server. */

+				strcpy( cTxString, ( char * ) pucUDPPayloadBuffer );

+

+				/* Pass the buffer into the send function.  ulFlags has the

+				FREERTOS_ZERO_COPY bit set so the IP stack will take control of

+				the	buffer, rather than copy data out of the buffer. */

+				echoMARK_SEND_IN_TRACE_BUFFER( xZeroCopySendEvent );

+				lReturned = FreeRTOS_sendto( 	xSocket,					/* The socket being sent to. */

+												( void * ) pucUDPPayloadBuffer,	/* The buffer being passed into the IP stack. */

+												strlen( cTxString ) + 1, 	/* The length of the data being sent.  Plus 1 to ensure the null terminator is part of the data. */

+												FREERTOS_ZERO_COPY,			/* ulFlags with the zero copy bit is set. */

+												&xEchoServerAddress,		/* Where the data is being sent. */

+												sizeof( xEchoServerAddress ) );

+

+				if( lReturned == 0 )

+				{

+					/* The send operation failed, so this task is still

+					responsible	for the buffer obtained from the IP stack.  To

+					ensure the buffer is not lost it must either be used again,

+					or, as in this case, returned to the IP stack using

+					FreeRTOS_ReleaseUDPPayloadBuffer().  pucUDPPayloadBuffer can

+					be safely re-used to receive from the socket below once the

+					buffer has been returned to the stack. */

+					FreeRTOS_ReleaseUDPPayloadBuffer( ( void * ) pucUDPPayloadBuffer );

+				}

+				else

+				{

+					/* The send was successful so the IP stack is now managing

+					the	buffer pointed to by pucUDPPayloadBuffer, and the IP

+					stack will return the buffer once it has been sent.

+					pucUDPPayloadBuffer can	be safely re-used to receive from

+					the socket below. */

+				}

+

+				/* Keep a count of how many echo requests have been transmitted

+				so it can be compared to the number of echo replies received.

+				It would be expected to loose at least one to an ARP message the

+				first time the connection is created. */

+				ulTxCount++;

+

+				/* Receive data on the socket.  ulFlags has the zero copy bit set

+				(FREERTOS_ZERO_COPY) indicating to the stack that a reference to

+				the	received data should be passed out to this task using the

+				second parameter to the FreeRTOS_recvfrom() call.  When this is

+				done the IP stack is no longer responsible for releasing the

+				buffer, and	the task *must* return the buffer to the stack when

+				it is no longer	needed.  By default the receive block time is

+				portMAX_DELAY. */

+				echoMARK_SEND_IN_TRACE_BUFFER( xZeroCopyReceiveEvent );

+				lReturned = FreeRTOS_recvfrom(	xSocket,					/* The socket to receive from. */

+												( void * ) &pucUDPPayloadBuffer,  /* pucUDPPayloadBuffer will be set to point to the buffer that already contains the received data. */

+												0,							/* Ignored because the zero copy interface is being used. */

+												FREERTOS_ZERO_COPY,			/* ulFlags with the FREERTOS_ZERO_COPY bit set. */

+												&xEchoServerAddress,		/* The address from which the data was sent. */

+												&xAddressLength );

+

+				if( lReturned > 0 )

+				{

+					/* Compare the string sent to the echo server with the string

+					received back from the echo server. */

+					if( strcmp( ( char * ) pucUDPPayloadBuffer, cTxString ) == 0 )

+					{

+						/* The strings matched. */

+						ulRxCount++;

+					}

+

+					/* The buffer that contains the data passed out of the stack

+					*must* be returned to the stack. */

+					FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayloadBuffer );

+				}

+			}

+		}

+

+		/* Pause for a short while to ensure the network is not too

+		congested. */

+		vTaskDelay( echoLOOP_DELAY );

+

+		/* Close this socket before looping back to create another. */

+		FreeRTOS_closesocket( xSocket );

+	}

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/EchoClients/TwoEchoClients.h b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/EchoClients/TwoEchoClients.h
new file mode 100644
index 0000000..c69748d
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/EchoClients/TwoEchoClients.h
@@ -0,0 +1,76 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef TWO_ECHO_CLIENTS_H

+#define TWO_ECHO_CLIENTS_H

+

+/*

+ * Create the two UDP echo client tasks.  One task uses the standard interface

+ * to send to and receive from an echo server.  The other task uses the zero

+ * copy interface to send to and receive from an echo server.

+ */

+void vStartEchoClientTasks( uint16_t usTaskStackSize, unsigned portBASE_TYPE uxTaskPriority );

+

+#endif /* TWO_ECHO_CLIENTS_H */

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/TraceMacros/Example1/DemoIPTrace.c b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/TraceMacros/Example1/DemoIPTrace.c
new file mode 100644
index 0000000..5562279
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/TraceMacros/Example1/DemoIPTrace.c
@@ -0,0 +1,188 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* 

+ * This file, along with DemoIPTrace.h, provides a basic example use of the

+ * FreeRTOS+UDP trace macros.  The statistics gathered here can be viewed in

+ * the command line interface.

+ * See http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/UDP_IP_Trace.shtml

+ */

+

+/* Standard includes. */

+#include <stdint.h>

+

+/* FreeRTOS includes. */ 

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+UDP includes. */

+#include "FreeRTOS_UDP_IP.h"

+#include "DemoIPTrace.h"

+

+/* It is possible to remove the trace macros using the 

+configINCLUDE_DEMO_DEBUG_STATS setting in FreeRTOSIPConfig.h. */

+#if configINCLUDE_DEMO_DEBUG_STATS == 1

+

+/*

+ * Each row in the xIPTraceValues[] table contains a pointer to a function that

+ * updates the value for that row.  Rows that latch the lowest value point to

+ * this function (for example, this function can be used to latch the lowest

+ * number of network buffers that were available during the execution of the

+ * stack).

+ */

+static void prvStoreLowest( uint32_t *pulCurrentValue, uint32_t ulCount );

+

+/*

+ * Each row in the xIPTraceValues[] table contains a pointer to a function that

+ * updates the value for that row.  Rows that simply increment an event count

+ * point to this function.

+ */

+static void prvIncrementEventCount( uint32_t *pulCurrentValue, uint32_t ulCount );

+

+

+xExampleDebugStatEntry_t xIPTraceValues[] =

+{

+	/* Comment out array entries to remove individual trace items. */

+

+	{ iptraceID_NETWORK_INTERFACE_RECEIVE,			( const uint8_t * const ) "Packets received by the network interface",			prvIncrementEventCount, 0 },

+	{ iptraceID_NETWORK_INTERFACE_TRANSMIT,			( const uint8_t * const ) "Count of transmitted packets",						prvIncrementEventCount, 0 },

+	{ iptraceID_PACKET_DROPPED_TO_GENERATE_ARP,		( const uint8_t * const ) "Count of packets dropped to generate ARP",			prvIncrementEventCount, 0 },

+	{ iptraceID_NETWORK_BUFFER_OBTAINED,			( const uint8_t * const ) "Lowest ever available network buffers",				prvStoreLowest, 0xffffUL },

+	{ iptraceID_NETWORK_EVENT_RECEIVED,				( const uint8_t * const ) "Lowest ever free space in network event queue",		prvStoreLowest, 0xffffUL },

+	{ iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER,	( const uint8_t * const ) "Count of failed attempts to obtain a network buffer",prvIncrementEventCount, 0 },

+	{ iptraceID_ARP_TABLE_ENTRY_EXPIRED,			( const uint8_t * const ) "Count of expired ARP entries",						prvIncrementEventCount, 0 },

+	{ iptraceID_FAILED_TO_CREATE_SOCKET,			( const uint8_t * const ) "Count of failures to create a socket",				prvIncrementEventCount, 0 },

+	{ iptraceID_RECVFROM_DISCARDING_BYTES,			( const uint8_t * const ) "Count of times recvfrom() has discarding bytes",		prvIncrementEventCount, 0 },

+	{ iptraceID_ETHERNET_RX_EVENT_LOST,				( const uint8_t * const ) "Count of lost Ethenret Rx events (event queue full?)",prvIncrementEventCount, 0 },

+	{ iptraceID_STACK_TX_EVENT_LOST,				( const uint8_t * const ) "Count of lost IP stack events (event queue full?)",	prvIncrementEventCount, 0 },

+	{ ipconfigID_BIND_FAILED,						( const uint8_t * const ) "Count of failed calls to bind()",					prvIncrementEventCount, 0 },

+	{ iptraceID_RECVFROM_TIMEOUT,					( const uint8_t * const ) "Count of receive timeouts",							prvIncrementEventCount, 0 },

+	{ iptraceID_SENDTO_DATA_TOO_LONG,				( const uint8_t * const ) "Count of failed sends due to oversized payload",		prvIncrementEventCount, 0 },

+	{ iptraceID_SENDTO_SOCKET_NOT_BOUND,			( const uint8_t * const ) "Count of failed sends due to unbound socket",		prvIncrementEventCount, 0 },

+	{ iptraceID_NO_BUFFER_FOR_SENDTO,				( const uint8_t * const ) "Count of failed transmits due to timeout",			prvIncrementEventCount, 0 },

+	{ iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR,			( const uint8_t * const ) "Number of times task had to wait to obtain a DMA Tx descriptor", prvIncrementEventCount, 0 },

+	{ iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP,		( const uint8_t * const ) "Failed to notify select group",						prvIncrementEventCount, 0 }

+};

+

+/*-----------------------------------------------------------*/

+

+portBASE_TYPE xExampleDebugStatEntries( void )

+{

+	/* Return the number of entries in the xIPTraceValues[] table. */

+	return ( portBASE_TYPE ) ( sizeof( xIPTraceValues ) / sizeof( xExampleDebugStatEntry_t ) );

+}

+/*-----------------------------------------------------------*/

+

+void vExampleDebugStatUpdate( uint8_t ucIdentifier, uint32_t ulValue )

+{

+portBASE_TYPE xIndex;

+const portBASE_TYPE xEntries = sizeof( xIPTraceValues ) / sizeof( xExampleDebugStatEntry_t );

+

+	/* Update an entry in the xIPTraceValues[] table.  Each row in the table

+	includes a pointer to a function that performs the actual update.  This

+	function just executes the update function from that table row. */

+	for( xIndex = 0; xIndex < xEntries; xIndex++ )

+	{

+		if( xIPTraceValues[ xIndex ].ucIdentifier == ucIdentifier )

+		{

+			xIPTraceValues[ xIndex ].vPerformAction( &( xIPTraceValues[ xIndex ].ulData ), ulValue );

+			break;

+		}

+	}

+

+	configASSERT( xIndex != xEntries );

+}

+/*-----------------------------------------------------------*/

+

+static void prvIncrementEventCount( uint32_t *pulCurrentValue, uint32_t ulCount )

+{

+	/* Each row in the xIPTraceValues[] table contains a pointer to a function

+	that updates the value for that row.  Rows that simply increment an event

+	count point to this function. */

+	( void ) ulCount;

+	( *pulCurrentValue )++;

+}

+/*-----------------------------------------------------------*/

+

+static void prvStoreLowest( uint32_t *pulCurrentValue, uint32_t ulCount )

+{

+	/* Each row in the xIPTraceValues[] table contains a pointer to a function

+	that updates the value for that row.  Rows that latch the lowest value

+	point to this function (for example, this function can be used to latch

+	the lowest number of network buffers that were available during the

+	execution of the stack). */

+	if( ulCount < *pulCurrentValue )

+	{

+		*pulCurrentValue = ulCount;

+	}

+}

+/*-----------------------------------------------------------*/

+

+

+#endif /* configINCLUDE_DEMO_DEBUG_STATS == 1 */

+

+

+

+

diff --git a/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/TraceMacros/Example1/DemoIPTrace.h b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/TraceMacros/Example1/DemoIPTrace.h
new file mode 100644
index 0000000..f474707
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_UDP_Demos/TraceMacros/Example1/DemoIPTrace.h
@@ -0,0 +1,159 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*

+ * This file, along with DemoIPTrace.h, provides a basic example use of the

+ * FreeRTOS+UDP trace macros.  The statistics gathered here can be viewed in

+ * the command line interface.

+ * See http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/UDP_IP_Trace.shtml

+ */

+

+#ifndef DEMO_IP_TRACE_MACROS_H

+#define DEMO_IP_TRACE_MACROS_H

+

+typedef void ( *vTraceAction_t )( uint32_t *, uint32_t );

+

+/* Type that defines each statistic being gathered. */

+typedef struct ExampleDebugStatEntry

+{

+	uint8_t ucIdentifier;					/* Unique identifier for statistic. */

+	const uint8_t * const pucDescription;	/* Text description for the statistic. */

+	vTraceAction_t vPerformAction;			/* Action to perform when the statistic is updated (increment counter, store minimum value, store maximum value, etc. */

+	uint32_t ulData; 						/* The meaning of this data is dependent on the trace macro ID. */

+} xExampleDebugStatEntry_t;

+

+/* Unique identifiers used to locate the entry for each trace macro in the

+xIPTraceValues[] table defined in DemoIPTrace.c. */

+#define iptraceID_NETWORK_INTERFACE_RECEIVE					0

+#define iptraceID_NETWORK_INTERFACE_TRANSMIT				1

+#define iptraceID_PACKET_DROPPED_TO_GENERATE_ARP			2

+/* Do not change IDs above this line as the ID is shared with a FreeRTOS+Nabto

+demo. */

+#define iptraceID_NETWORK_BUFFER_OBTAINED					3

+#define iptraceID_NETWORK_BUFFER_OBTAINED_FROM_ISR			4

+#define iptraceID_NETWORK_EVENT_RECEIVED					5

+#define iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER			6

+#define iptraceID_ARP_TABLE_ENTRY_EXPIRED					7

+#define iptraceID_FAILED_TO_CREATE_SOCKET					8

+#define iptraceID_RECVFROM_DISCARDING_BYTES					9

+#define iptraceID_ETHERNET_RX_EVENT_LOST					10

+#define iptraceID_STACK_TX_EVENT_LOST						11

+#define ipconfigID_BIND_FAILED								12

+#define iptraceID_RECVFROM_TIMEOUT							13

+#define iptraceID_SENDTO_DATA_TOO_LONG						14

+#define iptraceID_SENDTO_SOCKET_NOT_BOUND					15

+#define iptraceID_NO_BUFFER_FOR_SENDTO						16

+#define iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR				17

+#define iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP				18

+

+/* It is possible to remove the trace macros using the

+configINCLUDE_DEMO_DEBUG_STATS setting in FreeRTOSIPConfig.h. */

+#if configINCLUDE_DEMO_DEBUG_STATS == 1

+

+	/* The trace macro definitions themselves.  Any trace macros left undefined

+	will default to be empty macros. */

+	#define iptraceNETWORK_BUFFER_OBTAINED( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_NETWORK_BUFFER_OBTAINED, uxQueueMessagesWaiting( ( xQueueHandle ) xNetworkBufferSemaphore ) )

+	#define iptraceNETWORK_BUFFER_OBTAINED_FROM_ISR( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_NETWORK_BUFFER_OBTAINED, uxQueueMessagesWaiting( ( xQueueHandle ) xNetworkBufferSemaphore ) )

+

+	#define iptraceNETWORK_EVENT_RECEIVED( eEvent )	{																				\

+														uint16_t usSpace;															\

+															usSpace = ( uint16_t ) uxQueueMessagesWaiting( xNetworkEventQueue );	\

+															/* Minus one as an event was removed before the space was queried. */	\

+															usSpace = ( ipconfigEVENT_QUEUE_LENGTH - usSpace ) - 1;					\

+															vExampleDebugStatUpdate( iptraceID_NETWORK_EVENT_RECEIVED, usSpace );	\

+														}

+

+	#define iptraceFAILED_TO_OBTAIN_NETWORK_BUFFER()					vExampleDebugStatUpdate( iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER, 0 )

+	#define iptraceARP_TABLE_ENTRY_EXPIRED( ulIPAddress )				vExampleDebugStatUpdate( iptraceID_ARP_TABLE_ENTRY_EXPIRED, 0 )

+	#define iptracePACKET_DROPPED_TO_GENERATE_ARP( ulIPAddress )		vExampleDebugStatUpdate( iptraceID_PACKET_DROPPED_TO_GENERATE_ARP, 0 )

+	#define iptraceFAILED_TO_CREATE_SOCKET()							vExampleDebugStatUpdate( iptraceID_FAILED_TO_CREATE_SOCKET, 0 )

+	#define iptraceRECVFROM_DISCARDING_BYTES( xNumberOfBytesDiscarded )	vExampleDebugStatUpdate( iptraceID_RECVFROM_DISCARDING_BYTES, 0 )

+	#define iptraceETHERNET_RX_EVENT_LOST()								vExampleDebugStatUpdate( iptraceID_ETHERNET_RX_EVENT_LOST, 0 )

+	#define iptraceSTACK_TX_EVENT_LOST( xEvent )						vExampleDebugStatUpdate( iptraceID_STACK_TX_EVENT_LOST, 0 )

+	#define iptraceBIND_FAILED( xSocket, usPort )						vExampleDebugStatUpdate( ipconfigID_BIND_FAILED, 0 )

+	#define iptraceNETWORK_INTERFACE_TRANSMIT()							vExampleDebugStatUpdate( iptraceID_NETWORK_INTERFACE_TRANSMIT, 0 )

+	#define iptraceRECVFROM_TIMEOUT()									vExampleDebugStatUpdate( iptraceID_RECVFROM_TIMEOUT, 0 )

+	#define iptraceSENDTO_DATA_TOO_LONG()								vExampleDebugStatUpdate( iptraceID_SENDTO_DATA_TOO_LONG, 0 )

+	#define iptraceSENDTO_SOCKET_NOT_BOUND()							vExampleDebugStatUpdate( iptraceID_SENDTO_SOCKET_NOT_BOUND, 0 )

+	#define iptraceNO_BUFFER_FOR_SENDTO()								vExampleDebugStatUpdate( iptraceID_NO_BUFFER_FOR_SENDTO, 0 )

+	#define iptraceWAITING_FOR_TX_DMA_DESCRIPTOR()						vExampleDebugStatUpdate( iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR, 0 )

+	#define iptraceFAILED_TO_NOTIFY_SELECT_GROUP( xSocket )				vExampleDebugStatUpdate( iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP, 0 )

+	#define iptraceNETWORK_INTERFACE_RECEIVE()							vExampleDebugStatUpdate( iptraceID_NETWORK_INTERFACE_RECEIVE, 0 )

+

+	/*

+	 * The function that updates a line in the xIPTraceValues table.

+	 */

+	void vExampleDebugStatUpdate( uint8_t ucIdentifier, uint32_t ulValue );

+

+	/*

+	 * Returns the number of entries in the xIPTraceValues table.

+	 */

+	portBASE_TYPE xExampleDebugStatEntries( void );

+

+#endif /* configINCLUDE_DEMO_DEBUG_STATS == 1 */

+

+

+#endif /* DEMO_IP_TRACE_MACROS_H */

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/CLI-commands.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/CLI-commands.c
new file mode 100644
index 0000000..b67b9e4
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/CLI-commands.c
@@ -0,0 +1,419 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* FreeRTOS+Trace includes. */

+#include "trcUser.h"

+

+/*

+ * Writes trace data to a disk file when the trace recording is stopped.

+ * This function will simply overwrite any trace files that already exist.

+ */

+static void prvSaveTraceFile( void );

+

+/*

+ * Defines a command that returns a table showing the state of each task at the

+ * time the command is called.

+ */

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that returns a table showing how much time each task has

+ * spent in the Running state.

+ */

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that expects exactly three parameters.  Each of the three

+ * parameter are echoed back one at a time.

+ */

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that can take a variable number of parameters.  Each

+ * parameter is echoes back one at a time.

+ */

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that starts/stops events being recorded for offline viewing

+ * in FreeRTOS+Trace.

+ */

+static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/* Structure that defines the "run-time-stats" command line command. */

+static const CLI_Command_Definition_t xRunTimeStats =

+{

+	"run-time-stats", /* The command string to type. */

+	"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n\r\n",

+	prvRunTimeStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "task-stats" command line command. */

+static const CLI_Command_Definition_t xTaskStats =

+{

+	"task-stats", /* The command string to type. */

+	"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n\r\n",

+	prvTaskStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "echo_3_parameters" command line command.  This

+takes exactly three parameters that the command simply echos back one at a

+time. */

+static const CLI_Command_Definition_t xThreeParameterEcho =

+{

+	"echo_3_parameters",

+	"\r\necho_3_parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n\r\n",

+	prvThreeParameterEchoCommand, /* The function to run. */

+	3 /* Three parameters are expected, which can take any value. */

+};

+

+/* Structure that defines the "echo_parameters" command line command.  This

+takes a variable number of parameters that the command simply echos back one at

+a time. */

+static const CLI_Command_Definition_t xParameterEcho =

+{

+	"echo_parameters",

+	"\r\necho_parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n\r\n",

+	prvParameterEchoCommand, /* The function to run. */

+	-1 /* The user can enter any number of commands. */

+};

+

+/* Structure that defines the "trace" command line command.  This takes a single

+parameter, which can be either "start" or "stop". */

+static const CLI_Command_Definition_t xStartTrace =

+{

+	"trace",

+	"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n\r\n",

+	prvStartStopTraceCommand, /* The function to run. */

+	1 /* One parameter is expected.  Valid values are "start" and "stop". */

+};

+

+/*-----------------------------------------------------------*/

+

+void vRegisterCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xTaskStats );

+	FreeRTOS_CLIRegisterCommand( &xRunTimeStats );

+	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xStartTrace );

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskList( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE lParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The three parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&lParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Return the parameter string. */

+		memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+		sprintf( pcWriteBuffer, "%d: ", lParameterNumber );

+		strncat( pcWriteBuffer, pcParameter, lParameterStringLength );

+		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+		/* If this is the last of the three parameters then there are no more

+		strings to return after this one. */

+		if( lParameterNumber == 3L )

+		{

+			/* If this is the last of the three parameters then there are no more

+			strings to return after this one. */

+			xReturn = pdFALSE;

+			lParameterNumber = 0L;

+		}

+		else

+		{

+			/* There are more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE lParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&lParameterStringLength	/* Store the parameter string length. */

+						);

+

+		if( pcParameter != NULL )

+		{

+			/* Return the parameter string. */

+			memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+			sprintf( pcWriteBuffer, "%d: ", lParameterNumber );

+			strncat( pcWriteBuffer, pcParameter, lParameterStringLength );

+			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+			/* There might be more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+		else

+		{

+			/* No more parameters were found.  Make sure the write buffer does

+			not contain a valid string. */

+			pcWriteBuffer[ 0 ] = 0x00;

+

+			/* No more data to return. */

+			xReturn = pdFALSE;

+

+			/* Start over the next time this command is executed. */

+			lParameterNumber = 0;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE lParameterStringLength;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Obtain the parameter string. */

+	pcParameter = FreeRTOS_CLIGetParameter

+					(

+						pcCommandString,		/* The command string itself. */

+						1,						/* Return the first parameter. */

+						&lParameterStringLength	/* Store the parameter string length. */

+					);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcParameter );

+

+	/* There are only two valid parameter values. */

+	if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )

+	{

+		/* Start or restart the trace. */

+		vTraceStop();

+		vTraceClear();

+		uiTraceStart();

+

+		sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );

+	}

+	else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )

+	{

+		/* End the trace, if one is running. */

+		vTraceStop();

+		sprintf( pcWriteBuffer, "Stopping trace recording and dumping log to disk.\r\n" );

+		prvSaveTraceFile();

+	}

+	else

+	{

+		sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );

+	}

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static void prvSaveTraceFile( void )

+{

+FILE* pxOutputFile;

+

+	fopen_s( &pxOutputFile, "Trace.dump", "wb");

+

+	if( pxOutputFile != NULL )

+	{

+		fwrite( RecorderDataPtr, sizeof( RecorderDataType ), 1, pxOutputFile );

+		fclose( pxOutputFile );

+		printf( "\r\nTrace output saved to Trace.dump\r\n" );

+	}

+	else

+	{

+		printf( "\r\nFailed to create trace dump file\r\n" );

+	}

+}

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/FreeRTOSConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/FreeRTOSConfig.h
new file mode 100644
index 0000000..1c410dd
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/FreeRTOSConfig.h
@@ -0,0 +1,162 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+

+#ifndef FREERTOS_CONFIG_H

+#define FREERTOS_CONFIG_H

+

+#include <stdint.h>

+

+/*-----------------------------------------------------------

+ * Application specific definitions.

+ *

+ * These definitions should be adjusted for your particular hardware and

+ * application requirements.

+ *

+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE

+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.

+ * http://www.freertos.org/a00110.html

+ *----------------------------------------------------------*/

+

+#define configUSE_PREEMPTION			1

+#define configUSE_IDLE_HOOK				1

+#define configUSE_TICK_HOOK				1

+#define configTICK_RATE_HZ				( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */

+#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */

+#define configTOTAL_HEAP_SIZE			( ( size_t ) 0 ) /* This parameter has no effect when heap_3.c is included in the project. */

+#define configMAX_TASK_NAME_LEN			( 7 )

+#define configUSE_TRACE_FACILITY		1

+#define configUSE_16_BIT_TICKS			0

+#define configIDLE_SHOULD_YIELD			1

+#define configUSE_CO_ROUTINES 			0

+#define configUSE_MUTEXES				1

+#define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */

+#define configUSE_RECURSIVE_MUTEXES		1

+#define configQUEUE_REGISTRY_SIZE		0

+#define configUSE_MALLOC_FAILED_HOOK	0

+#define configUSE_APPLICATION_TASK_TAG	0

+#define configUSE_COUNTING_SEMAPHORES	1

+#define configUSE_ALTERNATIVE_API		0

+

+#define configUSE_TIMERS				1

+#define configTIMER_TASK_PRIORITY		2

+#define configTIMER_QUEUE_LENGTH		20

+#define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 )

+

+#define configMAX_PRIORITIES			( ( unsigned portBASE_TYPE ) 7 )

+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

+

+

+/* Co-routine definitions. */

+#define configUSE_CO_ROUTINES 			0

+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

+

+/* Set the following definitions to 1 to include the API function, or zero

+to exclude the API function. */

+

+#define INCLUDE_vTaskPrioritySet			1

+#define INCLUDE_uxTaskPriorityGet			1

+#define INCLUDE_vTaskDelete					1

+#define INCLUDE_vTaskCleanUpResources		0

+#define INCLUDE_vTaskSuspend				1

+#define INCLUDE_vTaskDelayUntil				1

+#define INCLUDE_vTaskDelay					1

+#define INCLUDE_uxTaskGetStackHighWaterMark	1

+#define INCLUDE_xTaskGetSchedulerState		1

+

+/* This demo makes use of one or more example stats formatting functions.  These

+format the raw data provided by the uxTaskGetSystemState() function in to human

+readable ASCII form.  See the notes in the implementation of vTaskList() within 

+FreeRTOS/Source/tasks.c for limitations. */

+#define configUSE_STATS_FORMATTING_FUNCTIONS	1

+

+/* Run time stats gathering definitions. */

+unsigned long ulGetRunTimeCounterValue( void );

+void vConfigureTimerForRunTimeStats( void );

+#define configGENERATE_RUN_TIME_STATS	1

+#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()

+#define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeCounterValue()

+

+extern void vAssertCalled( void );

+#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled()

+

+/* The UDP port to use for incoming command inputs.  The outgoing port is

+set to ( configUDP_CLI_PORT_NUMBER + 1 ). */

+#define configUDP_CLI_PORT_NUMBER	5001

+

+/* The size of the global output buffer that is available for use when there

+are multiple command interpreters running at once (for example, one on a UART

+and one on TCP/IP).  This is done to prevent an output buffer being defined by

+each implementation - which would waste RAM.  In this case, there is only one

+command interpreter running, and it has its own local output buffer, so the

+global buffer is just set to be one byte long as it is not used and should not

+take up unnecessary RAM. */

+#define configCOMMAND_INT_MAX_OUTPUT_SIZE 1

+

+

+/* Include the FreeRTOS+Trace FreeRTOS trace macro definitions. */

+#include "trcKernelPort.h"

+

+#endif /* FREERTOS_CONFIG_H */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/FreeRTOS_Plus_CLI_with_Trace.sln b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/FreeRTOS_Plus_CLI_with_Trace.sln
new file mode 100644
index 0000000..3f819af
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/FreeRTOS_Plus_CLI_with_Trace.sln
@@ -0,0 +1,20 @@
+

+Microsoft Visual Studio Solution File, Format Version 11.00

+# Visual C++ Express 2010

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WIN32", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}"

+EndProject

+Global

+	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+		Debug|Win32 = Debug|Win32

+		Release|Win32 = Release|Win32

+	EndGlobalSection

+	GlobalSection(ProjectConfigurationPlatforms) = postSolution

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32

+	EndGlobalSection

+	GlobalSection(SolutionProperties) = preSolution

+		HideSolutionNode = FALSE

+	EndGlobalSection

+EndGlobal

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/READ_ME.url b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/READ_ME.url
new file mode 100644
index 0000000..8ee5a95
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/READ_ME.url
@@ -0,0 +1,5 @@
+[InternetShortcut]

+URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_Trace/Free_RTOS_Plus_Trace_CLI_Example.shtml

+IDList=

+[{000214A0-0000-0000-C000-000000000046}]

+Prop3=19,2

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Run-time-stats-utils.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Run-time-stats-utils.c
new file mode 100644
index 0000000..0ecc0b1
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Run-time-stats-utils.c
@@ -0,0 +1,141 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*

+ * Utility functions required to gather run time statistics.  See:

+ * http://www.freertos.org/rtos-run-time-stats.html

+ *

+ * Note that this is a simulated port, where simulated time is a lot slower than

+ * real time, therefore the run time counter values have no real meaningful

+ * units.

+ *

+ * Also note that it is assumed this demo is going to be used for short periods

+ * of time only, and therefore timer overflows are not handled.

+*/

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+

+/* FreeRTOS+Trace includes. */

+#include "trcUser.h"

+

+/* Variables used in the creation of the run time stats time base.  Run time

+stats record how much time each task spends in the Running state. */

+static long long llInitialRunTimeCounterValue = 0LL, llTicksPerHundedthMillisecond = 0LL;

+

+/*-----------------------------------------------------------*/

+

+void vConfigureTimerForRunTimeStats( void )

+{

+LARGE_INTEGER liPerformanceCounterFrequency, liInitialRunTimeValue;

+

+	/* Initialise the variables used to create the run time stats time base.

+	Run time stats record how much time each task spends in the Running

+	state. */

+

+	if( QueryPerformanceFrequency( &liPerformanceCounterFrequency ) == 0 )

+	{

+		llTicksPerHundedthMillisecond = 1;

+	}

+	else

+	{

+		/* How many times does the performance counter increment in 1/100th

+		millisecond. */

+		llTicksPerHundedthMillisecond = liPerformanceCounterFrequency.QuadPart / 100000LL;

+

+		/* What is the performance counter value now, this will be subtracted

+		from readings taken at run time. */

+		QueryPerformanceCounter( &liInitialRunTimeValue );

+		llInitialRunTimeCounterValue = liInitialRunTimeValue.QuadPart;

+	}

+}

+/*-----------------------------------------------------------*/

+

+unsigned long ulGetRunTimeCounterValue( void )

+{

+LARGE_INTEGER liCurrentCount;

+unsigned long ulReturn;

+

+	/* What is the performance counter value now? */

+	QueryPerformanceCounter( &liCurrentCount );

+

+	/* Subtract the performance counter value reading taken when the

+	application started to get a count from that reference point, then

+	scale to (simulated) 1/100ths of a millisecond. */

+	if( llTicksPerHundedthMillisecond == 0 )

+	{

+		/* The trace macros can call this function before the kernel has been

+		started, in which case llTicksPerHundedthMillisecond will not have been

+		initialised. */

+		ulReturn = 0;

+	}

+	else

+	{

+		ulReturn = ( unsigned long ) ( ( liCurrentCount.QuadPart - llInitialRunTimeCounterValue ) / llTicksPerHundedthMillisecond );

+	}

+

+	return ulReturn;

+}

+/*-----------------------------------------------------------*/

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/trcConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/trcConfig.h
new file mode 100644
index 0000000..a81aeb8
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/trcConfig.h
@@ -0,0 +1,530 @@
+/*******************************************************************************

+ * Tracealyzer v2.6.0 Recorder Library

+ * Percepio AB, www.percepio.com

+ *

+ * trcConfig.h

+ *

+ * Configuration parameters for the trace recorder library. Before using the 

+ * trace recorder library, please check that the default settings are 

+ * appropriate for your system, and if necessary adjust these. Most likely, you 

+ * will need to adjust the NTask, NISR, NQueue, NMutex and NSemaphore values to 

+ * reflect the number of such objects in your system. These may be 

+ * over-approximated, although larger values values implies more RAM usage.

+ *

+ * Terms of Use

+ * This software is copyright Percepio AB. The recorder library is free for

+ * use together with Percepio products. You may distribute the recorder library

+ * in its original form, including modifications in trcHardwarePort.c/.h

+ * given that these modification are clearly marked as your own modifications

+ * and documented in the initial comment section of these source files. 

+ * This software is the intellectual property of Percepio AB and may not be 

+ * sold or in other ways commercially redistributed without explicit written 

+ * permission by Percepio AB.

+ *

+ * Disclaimer 

+ * The trace tool and recorder library is being delivered to you AS IS and 

+ * Percepio AB makes no warranty as to its use or performance. Percepio AB does 

+ * not and cannot warrant the performance or results you may obtain by using the 

+ * software or documentation. Percepio AB make no warranties, express or 

+ * implied, as to noninfringement of third party rights, merchantability, or 

+ * fitness for any particular purpose. In no event will Percepio AB, its 

+ * technology partners, or distributors be liable to you for any consequential, 

+ * incidental or special damages, including any lost profits or lost savings, 

+ * even if a representative of Percepio AB has been advised of the possibility 

+ * of such damages, or for any claim by any third party. Some jurisdictions do 

+ * not allow the exclusion or limitation of incidental, consequential or special 

+ * damages, or the exclusion of implied warranties or limitations on how long an 

+ * implied warranty may last, so the above limitations may not apply to you.

+ *

+ * Copyright Percepio AB, 2013.

+ * www.percepio.com

+ ******************************************************************************/

+

+#ifndef TRCCONFIG_H

+#define TRCCONFIG_H

+

+/*******************************************************************************

+ * CONFIGURATION RELATED TO CAPACITY AND ALLOCATION 

+ ******************************************************************************/

+

+/*******************************************************************************

+ * EVENT_BUFFER_SIZE

+ *

+ * Macro which should be defined as an integer value.

+ *

+ * This defines the capacity of the event buffer, i.e., the number of records

+ * it may store. Each registered event typically use one record (4 byte), but

+ * vTracePrintF may use multiple records depending on the number of data args.

+ ******************************************************************************/

+

+#define EVENT_BUFFER_SIZE 4000 /* Adjust wrt. to available RAM */

+

+

+/*******************************************************************************

+ * USE_LINKER_PRAGMA

+ *

+ * Macro which should be defined as an integer value, default is 0.

+ *

+ * If this is 1, the header file "recorderdata_linker_pragma.h" is included just

+ * before the declaration of RecorderData (in trcBase.c), i.e., the trace data 

+ * structure. This allows the user to specify a pragma with linker options. 

+ *

+ * Example (for IAR Embedded Workbench and NXP LPC17xx):

+ * #pragma location="AHB_RAM_MEMORY"

+ * 

+ * This example instructs the IAR linker to place RecorderData in another RAM 

+ * bank, the AHB RAM. This can also be used for other compilers with a similar

+ * pragmas for linker options.

+ * 

+ * Note that this only applies if using static allocation, see below.

+ ******************************************************************************/

+

+#define USE_LINKER_PRAGMA 0

+

+

+/*******************************************************************************

+ * SYMBOL_TABLE_SIZE

+ *

+ * Macro which should be defined as an integer value.

+ *

+ * This defines the capacity of the symbol table, in bytes. This symbol table 

+ * stores User Events labels and names of deleted tasks, queues, or other kernel

+ * objects. Note that the names of active objects not stored here but in the 

+ * Object Table. Thus, if you don't use User Events or delete any kernel 

+ * objects you set this to a very low value, e.g. 4, but not zero (0) since 

+ * this causes a declaration of a zero-sized array, for which the C compiler

+ * behavior is not standardized and may cause misaligned data.

+ ******************************************************************************/

+#define SYMBOL_TABLE_SIZE 1000

+

+#if (SYMBOL_TABLE_SIZE == 0)

+#error "SYMBOL_TABLE_SIZE may not be zero!"

+#endif

+

+/*******************************************************************************

+ * USE_SEPARATE_USER_EVENT_BUFFER

+ *

+ * Macro which should be defined as an integer value.

+ * Default is zero (0).

+ *

+ * This enables and disables the use of the separate user event buffer.

+ *

+ * Note: When using the separate user event buffer, you may get an artificial

+ * task instance named "Unknown actor". This is added as a placeholder when the 

+ * user event history is longer than the task scheduling history.

+ ******************************************************************************/

+#define USE_SEPARATE_USER_EVENT_BUFFER 0

+

+/*******************************************************************************

+ * USER_EVENT_BUFFER_SIZE

+ *

+ * Macro which should be defined as an integer value.

+ *

+ * This defines the capacity of the user event buffer, in number of slots.

+ * A single user event can use between 1 and X slots, depending on the data.

+ *

+ * Only in use if USE_SEPARATE_USER_EVENT_BUFFER is set to 1.

+ ******************************************************************************/

+#define USER_EVENT_BUFFER_SIZE 500

+

+/*******************************************************************************

+ * USER_EVENT_CHANNELS

+ *

+ * Macro which should be defined as an integer value.

+ *

+ * This defines the number of allowed user event channels.

+ *

+ * Only in use if USE_SEPARATE_USER_EVENT_BUFFER is set to 1.

+ ******************************************************************************/

+#define CHANNEL_FORMAT_PAIRS 32

+

+/*******************************************************************************

+ * NTask, NISR, NQueue, NSemaphore, NMutex

+ *

+ * A group of Macros which should be defined as an integer value of zero (0) 

+ * or larger.

+ *

+ * This defines the capacity of the Object Property Table - the maximum number

+ * of objects active at any given point within each object class.

+ * 

+ * NOTE: In case objects are deleted and created during runtime, this setting

+ * does not limit the total amount of objects, only the number of concurrently

+ * active objects. 

+ *

+ * Using too small values will give an error message through the vTraceError

+ * routine, which makes the error message appear when opening the trace data

+ * in Tracealyzer. If you are using the recorder status monitor task,

+ * any error messages are displayed in console prints, assuming that the

+ * print macro has been defined properly (vConsolePrintMessage). 

+ *

+ * It can be wise to start with very large values for these constants, 

+ * unless you are very confident on these numbers. Then do a recording and

+ * check the actual usage in Tracealyzer. This is shown by selecting

+ * View -> Trace Details -> Resource Usage -> Object Table

+ * 

+ * NOTE 2: Remember to account for all tasks and other objects created by 

+ * the kernel, such as the IDLE task, any timer tasks, and any tasks created 

+ * by other 3rd party software components, such as communication stacks.

+ * Moreover, one task slot is used to indicate "(startup)", i.e., a fictive 

+ * task that represent the time before the scheduler starts. 

+ * NTask should thus be at least 2-3 slots larger than your application task count.

+ *

+ ******************************************************************************/

+#define NTask             15

+#define NISR              15

+#define NQueue            15

+#define NSemaphore        15

+#define NMutex            15

+#define NTimer            15

+#define NEventGroup       15

+

+/* Maximum object name length for each class (includes zero termination) */

+#define NameLenTask       15

+#define NameLenISR        15

+#define NameLenQueue      15

+#define NameLenSemaphore  15

+#define NameLenMutex      15

+#define NameLenTimer      15

+#define NameLenEventGroup 15

+

+/******************************************************************************

+ * TRACE_DESCRIPTION

+ *

+ * Macro which should be defined as a string.

+ *

+ * This string is stored in the trace and displayed in Tracealyzer. Can be

+ * used to store, e.g., system version or build date. This is also used to store

+ * internal error messages from the recorder, which if occurs overwrites the

+ * value defined here. This may be maximum 256 chars.

+ *****************************************************************************/

+#define TRACE_DESCRIPTION "Tracealyzer Recorder Test Program"

+

+/******************************************************************************

+ * TRACE_DESCRIPTION_MAX_LENGTH

+ *

+ * The maximum length (including zero termination) for the TRACE_DESCRIPTION

+ * string. Since this string also is used for internal error messages from the 

+ * recorder do not make it too short, as this may truncate the error messages.

+ * Default is 80. 

+ * Maximum allowed length is 256 - the trace will fail to load if longer.

+ *****************************************************************************/

+#define TRACE_DESCRIPTION_MAX_LENGTH 80

+

+

+/******************************************************************************

+ * TRACE_DATA_ALLOCATION

+ *

+ * This defines how to allocate the recorder data structure, i.e., using a 

+ * static declaration or using a dynamic allocation in runtime (malloc).

+ *

+ * Should be one of these two options:

+ * - TRACE_DATA_ALLOCATION_STATIC (default)

+ * - TRACE_DATA_ALLOCATION_DYNAMIC

+ *

+ * Using static allocation has the benefits of compile-time errors if the buffer 

+ * is too large (too large constants in trcConfig.h) and no need to call the 

+ * initialization routine (xTraceInitTraceData).

+ *

+ * Using dynamic allocation may give more flexibility in some cases.

+ *****************************************************************************/

+

+#define TRACE_DATA_ALLOCATION TRACE_DATA_ALLOCATION_STATIC

+

+

+/******************************************************************************

+ * CONFIGURATION REGARDING WHAT CODE/FEATURES TO INCLUDE

+ *****************************************************************************/

+

+/******************************************************************************

+ * USE_TRACE_ASSERT

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 0.

+ *

+ * If this is one (1), the TRACE_ASSERT macro will verify that a condition is 

+ * true. If the condition is false, vTraceError() will be called.

+ *****************************************************************************/

+#define USE_TRACE_ASSERT 1

+

+/******************************************************************************

+ * INCLUDE_FLOAT_SUPPORT

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * If this is zero (0), all references to floating point values are removed,

+ * in case floating point values are not supported by the platform used.

+ * Floating point values are only used in vTracePrintF and its subroutines, to 

+ * store float (%f) or double (%lf) argments. 

+ *

+ * Note: vTracePrintF can still be used with integer and string arguments in

+ * either case.

+ *****************************************************************************/

+#define INCLUDE_FLOAT_SUPPORT 0

+

+/******************************************************************************

+ * INCLUDE_USER_EVENTS

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * If this is zero (0) the code for creating User Events is excluded to

+ * reduce code size. User Events are application-generated events, like 

+ * "printf" but for the trace log instead of console output. User Events are 

+ * much faster than a printf and can therefore be used in timing critical code.

+ * See vTraceUserEvent() and vTracePrintF() in trcUser.h

+ * 

+ * Note that User Events are not displayed in FreeRTOS+Trace Free Edition.

+ *****************************************************************************/

+#define INCLUDE_USER_EVENTS 1

+

+/*****************************************************************************

+ * INCLUDE_READY_EVENTS

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * If this is zero (0), the code for recording Ready events is 

+ * excluded. Note, this will make it impossible to calculate the correct

+ * response times.

+ *****************************************************************************/

+#define INCLUDE_READY_EVENTS 1

+

+/*****************************************************************************

+ * INCLUDE_NEW_TIME_EVENTS

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 0.

+ *

+ * If this is zero (1), events will be generated whenever the os clock is

+ * increased.

+ *****************************************************************************/

+#define INCLUDE_NEW_TIME_EVENTS 0

+

+/*****************************************************************************

+ * INCLUDE_ISR_TRACING

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * If this is zero (0), the code for recording Interrupt Service Routines is 

+ * excluded to reduce code size.

+ * 

+ * Note, if the kernel has no central interrupt dispatcher, recording ISRs 

+ * require that you insert calls to vTraceStoreISRBegin and vTraceStoreISREnd 

+ * in your interrupt handlers.

+ *****************************************************************************/

+#define INCLUDE_ISR_TRACING 1

+

+/******************************************************************************

+ * INCLUDE_OBJECT_DELETE

+ * 

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * This must be enabled (1) if tasks, queues or other 

+ * traced kernel objects are deleted at runtime. If no deletes are made, this 

+ * can be set to 0 in order to exclude the delete-handling code.

+ *****************************************************************************/

+#define INCLUDE_OBJECT_DELETE 1

+

+/******************************************************************************

+ * INCLUDE_MEMMANG_EVENTS

+ * 

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * This controls if malloc and free calls should be traced. Set this to zero to

+ * exclude malloc/free calls from the tracing.

+ *****************************************************************************/

+#define INCLUDE_MEMMANG_EVENTS 1

+

+/******************************************************************************

+ * CONFIGURATION RELATED TO BEHAVIOR

+ *****************************************************************************/

+

+/******************************************************************************

+ * TRACE_RECORDER_STORE_MODE

+ *

+ * Macro which should be defined as one of:

+ * - TRACE_STORE_MODE_RING_BUFFER

+ * - TRACE_STORE_MODE_STOP_WHEN_FULL

+ * Default is TRACE_STORE_MODE_RING_BUFFER.

+ *

+ * With TRACE_RECORDER_STORE_MODE set to TRACE_STORE_MODE_RING_BUFFER, the events are 

+ * stored in a ring buffer, i.e., where the oldest events are overwritten when 

+ * the buffer becomes full. This allows you to get the last events leading up 

+ * to an interesting state, e.g., an error, without having a large trace buffer

+ * for string the whole run since startup. In this mode, the recorder can run

+ * "forever" as the buffer never gets full, i.e., in the sense that it always

+ * has room for more events.

+ *

+ * To fetch the trace in mode TRACE_STORE_MODE_RING_BUFFER, you need to first halt the

+ * system using your debugger and then do a RAM dump, or to explicitly stop the

+ * recorder using vTraceStop() and then store/upload the trace data using a

+ * task that you need to provide yourself. The trace data is found in the struct

+ * RecorderData, initialized in trcBase.c.

+ *

+ * Note that, if you upload the trace using a RAM dump, i.e., when the system is 

+ * halted on a breakpoint or by a debugger command, there is no need to stop the 

+ * recorder first.

+ *

+ * When TRACE_RECORDER_STORE_MODE is TRACE_STORE_MODE_STOP_WHEN_FULL, the recording is

+ * stopped when the buffer becomes full. When the recorder stops itself this way

+ * vTracePortEnd() is called which allows for custom actions, such as triggering

+ * a task that stores the trace buffer, i.e., in case taking a RAM dump

+ * using an on-chip debugger is not possible. In the Windows port, vTracePortEnd

+ * saves the trace to file directly, but this is not recommended in a real-time

+ * system since the scheduler is blocked during the processing of vTracePortEnd.

+ *****************************************************************************/

+

+#define TRACE_RECORDER_STORE_MODE TRACE_STORE_MODE_RING_BUFFER

+

+/******************************************************************************

+ * STOP_AFTER_N_EVENTS

+ *

+ * Macro which should be defined as an integer value, or not defined.

+ * Default is -1

+ *

+ * STOP_AFTER_N_EVENTS is intended for tests of the ring buffer mode (when

+ * RECORDER_STORE_MODE is STORE_MODE_RING_BUFFER). It stops the recording when

+ * the specified number of events has been observed. This value can be larger

+ * than the buffer size, to allow for test of the "wrapping around" that occurs

+ * in ring buffer mode . A negative value (or no definition of this macro)

+ * disables this feature.

+ *****************************************************************************/

+#define STOP_AFTER_N_EVENTS -1

+

+/******************************************************************************

+ * USE_IMPLICIT_IFE_RULES

+ *

+ * Macro which should be defined as either zero (0) or one (1). 

+ * Default is 1.

+ *

+ * ### Instance Finish Events (IFE) ###

+ *

+ * For tasks with "infinite" main loops (non-terminating tasks), the concept

+ * of a task instance has no clear definition, it is an application-specific

+ * thing. Tracealyzer allows you to define Instance Finish Events (IFEs),

+ * which marks the point in a cyclic task when the "task instance" ends.

+ * The IFE is a blocking kernel call, typically in the main loop of a task

+ * which typically reads a message queue, waits for a semaphore or performs

+ * an explicit delay.

+ *

+ * If USE_IMPLICIT_IFE_RULES is one (1), the kernel macros (trcKernelPort.h)

+ * will define what kernel calls are considered by default to be IFEs.

+ *

+ * However, Implicit IFEs only applies to blocking kernel calls. If a

+ * service reads a message without blocking, it does not create a new

+ * instance since no blocking occurred.

+ *

+ * Moreover, the actual IFE might sometimes be another blocking call. We 

+ * therefore allow for user-defined Explicit IFEs by calling

+ *

+ *     vTraceTaskInstanceIsFinished()

+ *

+ * right before the kernel call considered as IFE. This does not create an

+ * additional event but instead stores the service code and object handle

+ * of the IFE call as properties of the task.

+ *

+ * If using Explicit IFEs and the task also calls an Implicit IFE, this may 

+ * result in additional incorrect task instances.

+ * This is solved by disabling the Implicit IFEs for the task, by adding

+ * a call to

+ * 

+ *     vTraceTaskSkipDefaultInstanceFinishedEvents()

+ * 

+ * in the very beginning of that task. This allows you to combine Explicit IFEs

+ * for some tasks with Implicit IFEs for the rest of the tasks, if

+ * USE_IMPLICIT_IFE_RULES is 1.

+ *

+ * By setting USE_IMPLICIT_IFE_RULES to zero (0), the implicit IFEs are disabled

+ * for all tasks. Tasks will then be considered to have a single instance only, 

+ * covering all execution fragments, unless you define an explicit IFE in each

+ * task by calling vTraceTaskInstanceIsFinished before the blocking call.

+ *****************************************************************************/

+#define USE_IMPLICIT_IFE_RULES 1

+

+

+/******************************************************************************

+ * USE_16BIT_OBJECT_HANDLES

+ *

+ * Macro which should be defined as either zero (0) or one (1).

+ * Default is 0.

+ *

+ * If set to 0 (zero), the recorder uses 8-bit handles to identify kernel 

+ * objects such as tasks and queues. This limits the supported number of

+ * concurrently active objects to 255 of each type (object class).

+ *

+ * If set to 1 (one), the recorder uses 16-bit handles to identify kernel 

+ * objects such as tasks and queues. This limits the supported number of

+ * concurrent objects to 65535 of each type (object class). However, since the

+ * object property table is limited to 64 KB, the practical limit is about

+ * 3000 objects in total. 

+ * 

+ * NOTE: An object with a high ID (> 255) will generate an extra event 

+ * (= 4 byte) in the event buffer. 

+ * 

+ * NOTE: Some internal tables in the recorder gets larger when using 16-bit 

+ * handles. The additional RAM usage is 5-10 byte plus 1 byte per kernel object

+ *, i.e., task, queue, semaphore, mutex, etc.

+ *****************************************************************************/

+#define USE_16BIT_OBJECT_HANDLES 0

+

+/****** Port Name ******************** Code ** Official ** OS Platform ******

+* PORT_APPLICATION_DEFINED               -2     -           -                 

+* PORT_NOT_SET                           -1     -           -                 

+* PORT_HWIndependent                     0      Yes         Any               

+* PORT_Win32                             1      Yes         FreeRTOS Win32

+* PORT_Atmel_AT91SAM7                    2      No          Any               

+* PORT_Atmel_UC3A0                       3      No          Any               

+* PORT_ARM_CortexM                       4      Yes         Any               

+* PORT_Renesas_RX600                     5      Yes         Any               

+* PORT_Microchip_dsPIC_AND_PIC24         6      Yes         Any               

+* PORT_TEXAS_INSTRUMENTS_TMS570          7      No          Any               

+* PORT_TEXAS_INSTRUMENTS_MSP430          8      No          Any               

+* PORT_MICROCHIP_PIC32                   9      No          Any               

+* PORT_XILINX_PPC405                     10     No          FreeRTOS          

+* PORT_XILINX_PPC440                     11     No          FreeRTOS          

+* PORT_XILINX_MICROBLAZE                 12     No          Any               

+* PORT_NXP_LPC210X                       13     No          Any               

+*****************************************************************************/

+#define SELECTED_PORT PORT_Win32

+

+#if (SELECTED_PORT == PORT_NOT_SET)

+#error "You need to define SELECTED_PORT here!"

+#endif

+

+/******************************************************************************

+* USE_PRIMASK_CS (for Cortex M devices only)

+*

+* An integer constant that selects between two options for the critical

+* sections of the recorder library.

+ *

+*   0: The default FreeRTOS critical section (BASEPRI) - default setting

+*   1: Always disable ALL interrupts (using PRIMASK)

+ *

+* Option 0 uses the standard FreeRTOS macros for critical sections.

+* However, on Cortex-M devices they only disable interrupts with priorities 

+* below a certain configurable level, while higher priority ISRs remain active.

+* Such high-priority ISRs may not use the recorder functions in this mode.

+*

+* Option 1 allows you to safely call the recorder from any ISR, independent of 

+* the interrupt priority. This mode may however cause higher IRQ latencies

+* (some microseconds) since ALL configurable interrupts are disabled during 

+* the recorder's critical sections in this mode, using the PRIMASK register.

+ ******************************************************************************/

+#define USE_PRIMASK_CS 0

+

+/******************************************************************************

+* HEAP_SIZE_BELOW_16M

+*

+* An integer constant that can be used to reduce the buffer usage of memory

+* allocation events (malloc/free). This value should be 1 if the heap size is 

+* below 16 MB (2^24 byte), and you can live with addresses truncated to the 

+* lower 24 bit. Otherwise set it to 0 to get the full 32-bit addresses.

+******************************************************************************/

+#define HEAP_SIZE_BELOW_16M 0

+

+#endif

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/UDPCommandServer.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/UDPCommandServer.c
new file mode 100644
index 0000000..b5ea20e
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/UDPCommandServer.c
@@ -0,0 +1,259 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#pragma comment( lib, "ws2_32.lib" )

+

+/* Win32 includes. */

+#include <WinSock2.h>

+#include <stdio.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* Dimensions the buffer into which input characters are placed. */

+#define cmdMAX_INPUT_SIZE	60

+

+/* Dimensions the buffer into which string outputs can be placed. */

+#define cmdMAX_OUTPUT_SIZE	1024

+

+/* Dimensions the buffer passed to the recvfrom() call. */

+#define cmdSOCKET_INPUT_BUFFER_SIZE 60

+

+/*

+ * Open and configure the UDP socket.

+ */

+static SOCKET prvOpenUDPSocket( void );

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Task that provides the input and output for the FreeRTOS+CLI command

+ * interpreter.  In this case a UDP port is used.  See the URL in the comments

+ * within main.c for the location of the online documentation.

+ */

+void vUDPCommandInterpreterTask( void *pvParameters )

+{

+long lBytes, lByte;

+signed char cInChar, cInputIndex = 0;

+static signed char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ];

+portBASE_TYPE xMoreDataToFollow;

+volatile int iErrorCode = 0;

+struct sockaddr_in xClient;

+int xClientAddressLength = sizeof( struct sockaddr_in );

+SOCKET xSocket;

+

+	/* Just to prevent compiler warnings. */

+	( void ) pvParameters;

+

+	/* Attempt to open the socket. */

+	xSocket = prvOpenUDPSocket();

+

+	if( xSocket != INVALID_SOCKET )

+	{

+		for( ;; )

+		{

+			/* Wait for incoming data on the opened socket. */

+			lBytes = recvfrom( xSocket, cLocalBuffer, sizeof( cLocalBuffer ), 0, ( struct sockaddr * ) &xClient, &xClientAddressLength );

+

+			if( lBytes == SOCKET_ERROR )

+			{

+				/* Something went wrong, but it is not handled by this simple

+				example. */

+				iErrorCode = WSAGetLastError();

+			}

+			else

+			{

+				/* Process each received byte in turn. */

+				lByte = 0;

+				while( lByte < lBytes )

+				{

+					/* The next character in the input buffer. */

+					cInChar = cLocalBuffer[ lByte ];

+					lByte++;

+

+					/* Newline characters are taken as the end of the command

+					string. */

+					if( cInChar == '\n' )

+					{

+						/* Process the input string received prior to the

+						newline. */

+						do

+						{

+							/* Pass the string to FreeRTOS+CLI. */

+							xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE );

+

+							/* Send the output generated by the command's

+							implementation. */

+							sendto( xSocket, cOutputString,  strlen( cOutputString ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength );

+

+						} while( xMoreDataToFollow != pdFALSE ); /* Until the command does not generate any more output. */

+

+						/* All the strings generated by the command processing

+						have been sent.  Clear the input string ready to receive

+						the next command. */

+						cInputIndex = 0;

+						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );

+

+						/* Transmit a spacer, just to make the command console

+						easier to read. */

+						sendto( xSocket, "\r\n",  strlen( "\r\n" ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength );

+					}

+					else

+					{

+						if( cInChar == '\r' )

+						{

+							/* Ignore the character.  Newlines are used to

+							detect the end of the input string. */

+						}

+						else if( cInChar == '\b' )

+						{

+							/* Backspace was pressed.  Erase the last character

+							in the string - if any. */

+							if( cInputIndex > 0 )

+							{

+								cInputIndex--;

+								cInputString[ cInputIndex ] = '\0';

+							}

+						}

+						else

+						{

+							/* A character was entered.  Add it to the string

+							entered so far.  When a \n is entered the complete

+							string will be passed to the command interpreter. */

+							if( cInputIndex < cmdMAX_INPUT_SIZE )

+							{

+								cInputString[ cInputIndex ] = cInChar;

+								cInputIndex++;

+							}

+						}

+					}

+				}

+			}

+		}

+	}

+	else

+	{

+		/* The socket could not be opened. */

+		vTaskDelete( NULL );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static SOCKET prvOpenUDPSocket( void )

+{

+WSADATA xWSAData;

+WORD wVersionRequested;

+struct sockaddr_in xServer;

+SOCKET xSocket = INVALID_SOCKET;

+

+	wVersionRequested = MAKEWORD( 2, 2 );

+

+	/* Prepare to use WinSock. */

+	if( WSAStartup( wVersionRequested, &xWSAData ) != 0 )

+	{

+		fprintf( stderr, "Could not open Windows connection.\n" );

+	}

+	else

+	{

+		xSocket = socket( AF_INET, SOCK_DGRAM, 0 );

+		if( xSocket == INVALID_SOCKET)

+		{

+			fprintf( stderr, "Could not create socket.\n" );

+			WSACleanup();

+		}

+		else

+		{

+			/* Zero out the server structure. */

+			memset( ( void * ) &xServer, 0x00, sizeof( struct sockaddr_in ) );

+

+			/* Set family and port. */

+			xServer.sin_family = AF_INET;

+			xServer.sin_port = htons( configUDP_CLI_PORT_NUMBER );

+

+			/* Assign the loopback address */

+			xServer.sin_addr.S_un.S_un_b.s_b1 = 127;

+			xServer.sin_addr.S_un.S_un_b.s_b2 = 0;

+			xServer.sin_addr.S_un.S_un_b.s_b3 = 0;

+			xServer.sin_addr.S_un.S_un_b.s_b4 = 1;

+

+			/* Bind the address to the socket. */

+			if( bind( xSocket, ( struct sockaddr * ) &xServer, sizeof( struct sockaddr_in ) ) == -1 )

+			{

+				fprintf( stderr, "Could not socket to port %d.\n", configUDP_CLI_PORT_NUMBER );

+				closesocket( xSocket );

+				xSocket = INVALID_SOCKET;

+				WSACleanup();

+			}

+		}

+	}

+

+	return xSocket;

+}

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj
new file mode 100644
index 0000000..e36a30f
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{C686325E-3261-42F7-AEB1-DDE5280E1CEB}</ProjectGuid>

+    <ProjectName>RTOSDemo</ProjectName>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseOfMfc>false</UseOfMfc>

+    <CharacterSet>MultiByte</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseOfMfc>false</UseOfMfc>

+    <CharacterSet>MultiByte</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>

+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>

+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>

+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>

+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>

+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>

+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>

+  </PropertyGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Midl>

+      <TypeLibraryName>.\Debug/WIN32.tlb</TypeLibraryName>

+      <HeaderFileName>

+      </HeaderFileName>

+    </Midl>

+    <ClCompile>

+      <Optimization>Disabled</Optimization>

+      <AdditionalIncludeDirectories>..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\..\FreeRTOS\Source\include;..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\Source\FreeRTOS-Plus-CLI;.\Trace_Recorder_Configuration;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <MinimalRebuild>true</MinimalRebuild>

+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+      <PrecompiledHeaderOutputFile>.\Debug/WIN32.pch</PrecompiledHeaderOutputFile>

+      <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>

+      <ObjectFileName>.\Debug/</ObjectFileName>

+      <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>

+      <WarningLevel>Level4</WarningLevel>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <DisableLanguageExtensions>false</DisableLanguageExtensions>

+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Culture>0x0c09</Culture>

+    </ResourceCompile>

+    <Link>

+      <OutputFile>.\Debug/RTOSDemo.exe</OutputFile>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+      <ProgramDatabaseFile>.\Debug/WIN32.pdb</ProgramDatabaseFile>

+      <SubSystem>Console</SubSystem>

+      <TargetMachine>MachineX86</TargetMachine>

+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>

+      <AdditionalLibraryDirectories>

+      </AdditionalLibraryDirectories>

+    </Link>

+    <Bscmake>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <OutputFile>.\Debug/WIN32.bsc</OutputFile>

+    </Bscmake>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Midl>

+      <TypeLibraryName>.\Release/WIN32.tlb</TypeLibraryName>

+      <HeaderFileName>

+      </HeaderFileName>

+    </Midl>

+    <ClCompile>

+      <Optimization>MaxSpeed</Optimization>

+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>

+      <PreprocessorDefinitions>_WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <StringPooling>true</StringPooling>

+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <PrecompiledHeaderOutputFile>.\Release/WIN32.pch</PrecompiledHeaderOutputFile>

+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>

+      <ObjectFileName>.\Release/</ObjectFileName>

+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>

+      <WarningLevel>Level3</WarningLevel>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <AdditionalIncludeDirectories>..\Common\Utils;..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap;..\Common\ethernet\lwip-1.4.0\src\include\ipv4;..\Common\ethernet\lwip-1.4.0\src\include;..\..\Source\include;..\..\Source\portable\MSVC-MingW;..\Common\ethernet\lwip-1.4.0\ports\win32\include;..\Common\Include;.\lwIP_Apps;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Culture>0x0c09</Culture>

+    </ResourceCompile>

+    <Link>

+      <OutputFile>.\Release/RTOSDemo.exe</OutputFile>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <ProgramDatabaseFile>.\Release/WIN32.pdb</ProgramDatabaseFile>

+      <SubSystem>Console</SubSystem>

+      <TargetMachine>MachineX86</TargetMachine>

+      <AdditionalLibraryDirectories>..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap</AdditionalLibraryDirectories>

+      <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+    <Bscmake>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <OutputFile>.\Release/WIN32.bsc</OutputFile>

+    </Bscmake>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\list.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_3.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcBase.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcHardwarePort.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcKernel.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcKernelPort.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcUser.c" />

+    <ClCompile Include="CLI-commands.c" />

+    <ClCompile Include="main.c">

+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <ClCompile Include="Run-time-stats-utils.c" />

+    <ClCompile Include="UDPCommandServer.c" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcBase.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcHooks.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcKernel.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcKernelPort.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcTypes.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcUser.h" />

+    <ClInclude Include="FreeRTOSConfig.h" />

+    <ClInclude Include="Trace_Recorder_Configuration\trcConfig.h" />

+    <ClInclude Include="Trace_Recorder_Configuration\trcHardwarePort.h" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj.filters b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj.filters
new file mode 100644
index 0000000..42ab973
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj.filters
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{38712199-cebf-4124-bf15-398f7c3419ea}</UniqueIdentifier>

+      <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>

+    </Filter>

+    <Filter Include="Demo App Source">

+      <UniqueIdentifier>{34567deb-d5ab-4a56-8640-0aaec609521a}</UniqueIdentifier>

+      <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS">

+      <UniqueIdentifier>{af3445a1-4908-4170-89ed-39345d90d30c}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS\Source">

+      <UniqueIdentifier>{f32be356-4763-4cae-9020-974a2638cb08}</UniqueIdentifier>

+      <Extensions>*.c</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS\Source\Portable">

+      <UniqueIdentifier>{88f409e6-d396-4ac5-94bd-7a99c914be46}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+">

+      <UniqueIdentifier>{e5ad4ec7-23dc-4295-8add-2acaee488f5a}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+Trace">

+      <UniqueIdentifier>{629e761f-e8a8-430e-b44e-f38d83292b54}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+Trace\Include">

+      <UniqueIdentifier>{e17028e8-51ed-45af-8aa4-22ade709b3fb}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS\Configuration Files">

+      <UniqueIdentifier>{19ff1a34-36de-4c48-9d10-3fb1fa0d1fa4}</UniqueIdentifier>

+      <Extensions>

+      </Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+CLI">

+      <UniqueIdentifier>{fd43c0ed-fdbc-437f-a5a3-c50399690bd7}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Demo App Source\Trace Recorder Configuration">

+      <UniqueIdentifier>{91dffc7b-279b-44f6-a2b2-f5d2e132a85d}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="main.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c">

+      <Filter>FreeRTOS\Source\Portable</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_3.c">

+      <Filter>FreeRTOS\Source\Portable</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\list.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="UDPCommandServer.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+    <ClCompile Include="CLI-commands.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+    <ClCompile Include="Run-time-stats-utils.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c">

+      <Filter>FreeRTOS+\FreeRTOS+CLI</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcUser.c">

+      <Filter>FreeRTOS+\FreeRTOS+Trace</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcBase.c">

+      <Filter>FreeRTOS+\FreeRTOS+Trace</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcKernel.c">

+      <Filter>FreeRTOS+\FreeRTOS+Trace</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcHardwarePort.c">

+      <Filter>FreeRTOS+\FreeRTOS+Trace</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcKernelPort.c">

+      <Filter>FreeRTOS+\FreeRTOS+Trace</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="FreeRTOSConfig.h">

+      <Filter>FreeRTOS\Configuration Files</Filter>

+    </ClInclude>

+    <ClInclude Include="Trace_Recorder_Configuration\trcConfig.h">

+      <Filter>Demo App Source\Trace Recorder Configuration</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcUser.h">

+      <Filter>FreeRTOS+\FreeRTOS+Trace\Include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcBase.h">

+      <Filter>FreeRTOS+\FreeRTOS+Trace\Include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcHooks.h">

+      <Filter>FreeRTOS+\FreeRTOS+Trace\Include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcKernel.h">

+      <Filter>FreeRTOS+\FreeRTOS+Trace\Include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcTypes.h">

+      <Filter>FreeRTOS+\FreeRTOS+Trace\Include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-Trace\Include\trcKernelPort.h">

+      <Filter>FreeRTOS+\FreeRTOS+Trace\Include</Filter>

+    </ClInclude>

+    <ClInclude Include="Trace_Recorder_Configuration\trcHardwarePort.h">

+      <Filter>Demo App Source\Trace Recorder Configuration</Filter>

+    </ClInclude>

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj.user b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj.user
new file mode 100644
index 0000000..695b5c7
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/WIN32.vcxproj.user
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/main.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/main.c
new file mode 100644
index 0000000..7f868b8
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/main.c
@@ -0,0 +1,302 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*

+ ******************************************************************************

+ * -NOTE- The Win32 port is a simulation (or is that emulation?) only!  Do not

+ * expect to get real time behaviour from the Win32 port or this demo

+ * application.  It is provided as a convenient development and demonstration

+ * test bed only.  This was tested using Windows XP on a dual core laptop.

+ *

+ * Windows will not be running the FreeRTOS simulator threads continuously, so

+ * the timing information in the FreeRTOS+Trace logs have no meaningful units.

+ * See the documentation page for the Windows simulator for an explanation of

+ * the slow timing:

+ * http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html

+ * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT -

+ *

+ * Documentation for this demo can be found on:

+ * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_Trace/Free_RTOS_Plus_Trace_CLI_Example.shtml

+ ******************************************************************************

+ *

+ * This is a simple FreeRTOS Windows simulator project that makes it easy to

+ * evaluate FreeRTOS+CLI and FreeRTOS+Trace on a standard desktop PC, without

+ * any external hardware or interfaces being required.

+ *

+ * To keep everything as simple as possible, the command line interface is

+ * accessed through a UDP socket on the default Windows loopback IP address of

+ * 127.0.0.1.  Full instructions are provided on the documentation page

+ * referenced above.

+ *

+ * Commands are provided to both start and stop a FreeRTOS+Trace recording.

+ * Stopping a recording will result in the recorded data being saved to the

+ * hard disk, ready for viewing in the FreeRTOS+Trace graphical user interface.

+ * Again, full instructions are provided on the documentation page referenced

+ * above.

+ *

+ * A queue send task and a queue receive task are defined in this file.  The

+ * queue receive task spends most of its time blocked on the queue waiting for

+ * messages to arrive.  The queue send task periodically sends a message to the

+ * queue, causing the queue receive task to exit the Blocked state.  The

+ * priority of the queue receive task is above that of the queue send task, so

+ * it pre-empts the queue send task as soon as it leaves the Blocked state.  It

+ * then consumes the message from the queue and prints "message received" to

+ * the screen before returning to block on the queue once again.  This

+ * sequencing is clearly visible in the recorded FreeRTOS+Trace data.

+ *

+ */

+

+/* Standard includes. */

+#include <stdio.h>

+#include <stdint.h>

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+#include "task.h"

+#include "queue.h"

+

+/* FreeRTOS+Trace includes. */

+#include "trcUser.h"

+

+/* Priorities at which the tasks are created. */

+#define mainQUEUE_RECEIVE_TASK_PRIORITY		( tskIDLE_PRIORITY + 2 )

+#define	mainQUEUE_SEND_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 )

+#define mainUDP_CLI_TASK_PRIORITY			( tskIDLE_PRIORITY )

+

+/* The rate at which data is sent to the queue.  The (simulated) 250ms value is

+converted to ticks using the portTICK_RATE_MS constant. */

+#define mainQUEUE_SEND_FREQUENCY_MS			( 250 / portTICK_RATE_MS )

+

+/* The number of items the queue can hold.  This is 1 as the receive task

+will remove items as they are added, meaning the send task should always find

+the queue empty. */

+#define mainQUEUE_LENGTH					( 1 )

+

+/*-----------------------------------------------------------*/

+

+/*

+ * The queue send and receive tasks as described in the comments at the top of

+ * this file.

+ */

+static void prvQueueReceiveTask( void *pvParameters );

+static void prvQueueSendTask( void *pvParameters );

+

+/*

+ * The task that implements the UDP command interpreter using FreeRTOS+CLI.

+ */

+extern void vUDPCommandInterpreterTask( void *pvParameters );

+

+/*

+ * Register commands that can be used with FreeRTOS+CLI through the UDP socket.

+ * The commands are defined in CLI-commands.c.

+ */

+extern void vRegisterCLICommands( void );

+

+/* The queue used by both tasks. */

+static xQueueHandle xQueue = NULL;

+

+/* The user trace event posted to the trace recording on each tick interrupt.

+Note tick events will not appear in the trace recording with regular period

+because this project runs in a Windows simulator, and does not therefore

+exhibit deterministic behaviour. */

+traceLabel xTickTraceUserEvent;

+

+/*-----------------------------------------------------------*/

+

+int main( void )

+{

+const uint32_t ulLongTime_ms = 250UL;

+

+	/* Initialise the trace recorder and create the label used to post user

+	events to the trace recording on each tick interrupt. */

+	vTraceInitTraceData();

+	xTickTraceUserEvent = xTraceOpenLabel( "tick" );

+

+	/* Create the queue used to pass messages from the queue send task to the

+	queue receive task. */

+	xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) );

+

+	/* Give the queue a name for the FreeRTOS+Trace log. */

+	vTraceSetQueueName( xQueue, "DemoQ" );

+

+	/* Start the two tasks as described in the comments at the top of this

+	file. */

+	xTaskCreate( prvQueueReceiveTask,				/* The function that implements the task. */

+				"Rx", 								/* The text name assigned to the task - for debug only as it is not used by the kernel. */

+				configMINIMAL_STACK_SIZE, 			/* The size of the stack to allocate to the task.  Not actually used as a stack in the Win32 simulator port. */

+				NULL,								/* The parameter passed to the task - not used in this example. */

+				mainQUEUE_RECEIVE_TASK_PRIORITY, 	/* The priority assigned to the task. */

+				NULL );								/* The task handle is not required, so NULL is passed. */

+

+	xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );

+

+	/* Create the task that handles the CLI on a UDP port.  The port number

+	is set using the configUDP_CLI_PORT_NUMBER setting in FreeRTOSConfig.h. */

+	xTaskCreate( vUDPCommandInterpreterTask, "CLI", configMINIMAL_STACK_SIZE, NULL, mainUDP_CLI_TASK_PRIORITY, NULL );

+

+	/* Register commands with the FreeRTOS+CLI command interpreter. */

+	vRegisterCLICommands();

+

+	/* Start the tasks and timer running. */

+	vTaskStartScheduler();

+

+	/* If all is well, the scheduler will now be running, and the following

+	line will never be reached.  If the following line does execute, then

+	there was insufficient FreeRTOS heap memory available for the idle and/or

+	timer tasks	to be created.  See the memory management section on the

+	FreeRTOS web site for more details (this is standard text that is not not

+	really applicable to the Win32 simulator port). */

+	for( ;; )

+	{

+		Sleep( ulLongTime_ms );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvQueueSendTask( void *pvParameters )

+{

+portTickType xNextWakeTime;

+const unsigned long ulValueToSend = 100UL;

+

+	/* Remove warning about unused parameters. */

+	( void ) pvParameters;

+

+	/* Initialise xNextWakeTime - this only needs to be done once. */

+	xNextWakeTime = xTaskGetTickCount();

+

+	for( ;; )

+	{

+		/* Place this task in the blocked state until it is time to run again.

+		While in the Blocked state this task will not consume any CPU time. */

+		vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );

+

+		/* Send to the queue - causing the queue receive task to unblock and

+		write a message to the display.  0 is used as the block time so the

+		sending operation will not block - it shouldn't need to block as the

+		queue should always	be empty at this point in the code, and it is an

+		error if it is not. */

+		xQueueSend( xQueue, &ulValueToSend, 0U );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvQueueReceiveTask( void *pvParameters )

+{

+unsigned long ulReceivedValue;

+

+	/* Remove warning about unused parameters. */

+	( void ) pvParameters;

+

+	for( ;; )

+	{

+		/* Wait until something arrives in the queue - this task will block

+		indefinitely provided INCLUDE_vTaskSuspend is set to 1 in

+		FreeRTOSConfig.h. */

+		xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );

+

+		/*  To get here something must have been received from the queue, but

+		is it the expected value?  If it is, write the message to the

+		display before looping back to block on the queue again. */

+		if( ulReceivedValue == 100UL )

+		{

+			printf( "Message received!\r\n" );

+			ulReceivedValue = 0U;

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vApplicationIdleHook( void )

+{

+const unsigned long ulMSToSleep = 5;

+

+	/* This function is called on each cycle of the idle task if

+	configUSE_IDLE_HOOK is set to 1 in FreeRTOSConfig.h.  Sleep to reduce CPU

+	load. */

+	Sleep( ulMSToSleep );

+}

+/*-----------------------------------------------------------*/

+

+void vAssertCalled( void )

+{

+const unsigned long ulLongSleep = 1000UL;

+

+	taskDISABLE_INTERRUPTS();

+	for( ;; )

+	{

+		Sleep( ulLongSleep );

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vApplicationTickHook( void )

+{

+	/* Write a user event to the trace log.

+	Note tick events will not appear in the trace recording with regular period

+	because this project runs in a Windows simulator, and does not therefore

+	exhibit deterministic behaviour. */

+	vTraceUserEvent( xTickTraceUserEvent );

+}

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/readme.txt b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/readme.txt
new file mode 100644
index 0000000..1a0cbcf
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/readme.txt
@@ -0,0 +1,7 @@
+Directories:

+

++ FreeRTOS-Plus/Demo_Projects_Using_FreeRTOS_Simulator/FreeRTOS_Plus_CLI_with_Trace

+  contains a FreeRTOS windows simulator demo project for both FreeRTOS+CLI and

+  FreeRTOS+Trace.  See http://www.FreeRTOS.org/trace for information on using

+  the project.

+  

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/FreeRTOSConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/FreeRTOSConfig.h
new file mode 100644
index 0000000..46e67f0
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/FreeRTOSConfig.h
@@ -0,0 +1,135 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef FREERTOS_CONFIG_H

+#define FREERTOS_CONFIG_H

+

+/*-----------------------------------------------------------

+ * Application specific definitions.

+ *

+ * These definitions should be adjusted for your particular hardware and

+ * application requirements.

+ *

+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE

+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.

+ * http://www.freertos.org/a00110.html

+ *----------------------------------------------------------*/

+

+#define configUSE_PREEMPTION			1

+#define configUSE_IDLE_HOOK				1

+#define configUSE_TICK_HOOK				0

+#define configTICK_RATE_HZ				( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */

+#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */

+#define configTOTAL_HEAP_SIZE			( ( size_t ) 0 ) /* This parameter has no effect when heap_3.c is included in the project. */

+#define configMAX_TASK_NAME_LEN			( 7 )

+#define configUSE_TRACE_FACILITY		1

+#define configUSE_16_BIT_TICKS			0

+#define configIDLE_SHOULD_YIELD			1

+#define configUSE_CO_ROUTINES 			0

+#define configUSE_MUTEXES				1

+#define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */

+#define configUSE_RECURSIVE_MUTEXES		1

+#define configQUEUE_REGISTRY_SIZE		0

+#define configUSE_MALLOC_FAILED_HOOK	0

+#define configUSE_APPLICATION_TASK_TAG	0

+#define configUSE_COUNTING_SEMAPHORES	1

+#define configUSE_ALTERNATIVE_API		0

+

+#define configUSE_TIMERS				1

+#define configTIMER_TASK_PRIORITY		2

+#define configTIMER_QUEUE_LENGTH		20

+#define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 )

+

+#define configMAX_PRIORITIES			( ( unsigned portBASE_TYPE ) 7 )

+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

+

+

+/* Co-routine definitions. */

+#define configUSE_CO_ROUTINES 			0

+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

+

+/* Set the following definitions to 1 to include the API function, or zero

+to exclude the API function. */

+

+#define INCLUDE_vTaskPrioritySet			1

+#define INCLUDE_uxTaskPriorityGet			1

+#define INCLUDE_vTaskDelete					1

+#define INCLUDE_vTaskCleanUpResources		0

+#define INCLUDE_vTaskSuspend				1

+#define INCLUDE_vTaskDelayUntil				1

+#define INCLUDE_vTaskDelay					1

+#define INCLUDE_uxTaskGetStackHighWaterMark	1

+#define INCLUDE_xTaskGetSchedulerState		1

+

+/* Run time stats gathering definitions. */

+#define configGENERATE_RUN_TIME_STATS	0

+

+extern void vAssertCalled( void );

+#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled()

+

+/* The TCP port used by both the secure client and the secure server. */

+#define configTCP_PORT_NUMBER	5001

+

+#endif /* FREERTOS_CONFIG_H */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/FreeRTOS_Plus_CyaSSL.sln b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/FreeRTOS_Plus_CyaSSL.sln
new file mode 100644
index 0000000..3f819af
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/FreeRTOS_Plus_CyaSSL.sln
@@ -0,0 +1,20 @@
+

+Microsoft Visual Studio Solution File, Format Version 11.00

+# Visual C++ Express 2010

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WIN32", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}"

+EndProject

+Global

+	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+		Debug|Win32 = Debug|Win32

+		Release|Win32 = Release|Win32

+	EndGlobalSection

+	GlobalSection(ProjectConfigurationPlatforms) = postSolution

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32

+	EndGlobalSection

+	GlobalSection(SolutionProperties) = preSolution

+		HideSolutionNode = FALSE

+	EndGlobalSection

+EndGlobal

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/READ_ME.url b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/READ_ME.url
new file mode 100644
index 0000000..c9b8dac
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/READ_ME.url
@@ -0,0 +1,5 @@
+[InternetShortcut]

+URL=http://www.freertos.org/FreeRTOS-Plus/CyaSSL/FreeRTOS_CyaSSL_Example.shtml

+IDList=

+[{000214A0-0000-0000-C000-000000000046}]

+Prop3=19,2

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/SecureTCPClientTask.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/SecureTCPClientTask.c
new file mode 100644
index 0000000..ee346e6
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/SecureTCPClientTask.c
@@ -0,0 +1,174 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#pragma comment( lib, "ws2_32.lib" )

+

+/* Win32 includes. */

+#include <WinSock2.h>

+

+/* CyaSSL includes. */

+#include "cyassl/ssl.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/*-----------------------------------------------------------*/

+

+/* The CyaSSL context for the client. */

+static CYASSL_CTX* xCyaSSL_ClientContext = NULL;

+

+/*-----------------------------------------------------------*/

+

+/* See the comments at the top of main.c. */

+void vSecureTCPClientTask( void *pvParameters )

+{

+SOCKET xClientSocket;

+struct sockaddr_in xConnection;

+CYASSL* xCyaSSL_Object;

+WORD wVersionRequested;

+WSADATA xWSAData;

+char cString[ 50 ];

+portBASE_TYPE lReturned;

+uint32_t ulCount = 0UL;

+

+	/* Remove compiler warning about unused parameters. */

+	( void ) pvParameters;

+

+	/* Prepare to use WinSock. */

+	wVersionRequested = MAKEWORD( 2, 2 );

+	configASSERT( WSAStartup( wVersionRequested, &xWSAData ) == 0 );

+

+	/* Set family and port for client socket. */

+	memset( ( void * ) &xConnection, 0x00, sizeof( struct sockaddr_in ) );

+	xConnection.sin_family = AF_INET;

+	xConnection.sin_addr.s_addr = inet_addr("127.0.0.1");

+	xConnection.sin_port = htons( configTCP_PORT_NUMBER );

+

+    /* Attempt to create a context that uses the TLS V1 server protocol. */

+    xCyaSSL_ClientContext = CyaSSL_CTX_new( CyaTLSv1_client_method() );

+	configASSERT( xCyaSSL_ClientContext );

+

+    /* Load the CA certificate. */

+    lReturned = CyaSSL_CTX_load_verify_locations( xCyaSSL_ClientContext, "ca-cert.pem", 0 );

+	configASSERT( lReturned == SSL_SUCCESS );

+

+	for( ;; )

+	{

+		/* Create the socket. */

+		xClientSocket = socket( AF_INET, SOCK_STREAM, 0 );

+		configASSERT( xClientSocket != INVALID_SOCKET );

+

+		/* Connect to the secure server. */

+		if( connect( xClientSocket, ( SOCKADDR * ) &xConnection, sizeof( xConnection ) ) == 0 )

+		{

+			/* The connect was successful.  Create a CyaSSL object to associate

+			with this connection. */

+			xCyaSSL_Object = CyaSSL_new( xCyaSSL_ClientContext );

+

+			if( xCyaSSL_Object != NULL )

+			{

+				/* Associate the created CyaSSL object with the connected

+				socket. */

+				lReturned = CyaSSL_set_fd( xCyaSSL_Object, xClientSocket );

+				configASSERT( lReturned == SSL_SUCCESS );

+

+				/* The count is used to differentiate between messages sent to

+				the server, and to break out of the do while loop below. */

+				ulCount = 0UL;

+

+				do

+				{

+					/* Create the string that is sent to the secure server. */

+					sprintf( cString, "Message number %lu\r\n", ulCount );

+

+					/* The next line is the secure equivalent of the standard

+					sockets call:

+					lReturned = send( xClientSocket, cString, strlen( cString ) + 1, 0 ); */

+					lReturned = CyaSSL_write( xCyaSSL_Object, cString, strlen( cString ) + 1 );

+

+

+					/* Short delay to prevent the messages streaming up the

+					console too quickly. */

+					vTaskDelay( 50 );

+					ulCount++;

+

+				} while( ( lReturned != SOCKET_ERROR ) && ( ulCount < 10UL ) );

+			}

+

+			CyaSSL_free( xCyaSSL_Object );

+			closesocket( xClientSocket );

+

+			/* Delay for a short time before starting over. */

+			vTaskDelay( 250 );

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/SecureTCPServerTask.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/SecureTCPServerTask.c
new file mode 100644
index 0000000..b226979
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/SecureTCPServerTask.c
@@ -0,0 +1,284 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#pragma comment( lib, "ws2_32.lib" )

+

+/* Win32 includes. */

+#include <WinSock2.h>

+

+/* CyaSSL includes. */

+#include "cyassl/ssl.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* This application is using the FreeRTOS Windows simulator, which uses the

+FreeRTOS scheduler to schedule FreeRTOS task within the Windows environment.

+The Windows envrionment must not be allowed to block any Windows threads that

+are running FreeRTOS tasks, unless the FreeRTOS task is running at the FreeRTOS

+idle priority.  For simplicity, this demo uses the Windows TCP/IP stack, the

+API for which can cause Windows threads to block.  Therefore, any FreeRTOS task

+that makes calls to the Windows TCP/IP stack must be assigned the idle prioity.

+Note this is only a restriction of the simulated Windows environment - real

+FreeRTOS ports do not have this restriction. */

+#define sstSECURE_CLIENT_TASK_PRIORITY		( tskIDLE_PRIORITY )

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Open, configures and binds the server's TCP socket.

+ */

+static SOCKET prvOpenServerSocket( void );

+

+/* 

+ * Prepare the CyaSSL library for use.

+ */

+static void prvInitialiseCyaSSL( void );

+

+/*

+ * The task that implements the client side of the connection.

+ */

+extern void vSecureTCPClientTask( void *pvParameters );

+

+/*-----------------------------------------------------------*/

+

+/* The CyaSSL context for the server. */

+static CYASSL_CTX* xCyaSSL_ServerContext = NULL;

+

+/*-----------------------------------------------------------*/

+

+/* See the comments at the top of main.c. */

+void vSecureTCPServerTask( void *pvParameters )

+{

+portBASE_TYPE xReturned;

+long lBytes;

+uint8_t cReceivedString[ 60 ];

+struct sockaddr_in xClient;

+int xClientAddressLength = sizeof( struct sockaddr_in );

+SOCKET xListeningSocket, xConnectedSocket;

+CYASSL* xCyaSSL_Object; /* Only one connection is accepted at a time, so only one object is needed at a time. */

+

+	/* Just to prevent compiler warnings. */

+	( void ) pvParameters;

+

+	/* Perform the initialisation necessary before CyaSSL can be used. */

+	prvInitialiseCyaSSL();

+	configASSERT( xCyaSSL_ServerContext );

+

+	/* Attempt to open the socket. */

+	xListeningSocket = prvOpenServerSocket();

+

+	/* Now the server socket has been created and the CyaSSL library has been

+	initialised, the task that implements the client side can be created. */

+	xTaskCreate( vSecureTCPClientTask, "Client", configMINIMAL_STACK_SIZE, NULL, sstSECURE_CLIENT_TASK_PRIORITY, NULL );

+

+	if( xListeningSocket != INVALID_SOCKET )

+	{

+		for( ;; )

+		{

+			/* Wait until the client connects. */

+			printf( "Waiting for new connection\r\n" );

+			xConnectedSocket = accept( xListeningSocket, ( struct sockaddr * ) &xClient, &xClientAddressLength );

+

+			if( xConnectedSocket != INVALID_SOCKET )

+			{

+				printf( "Connection established\r\n" );

+

+				/* A connection has been accepted by the server.  Create a 

+				CyaSSL object for use with the newly connected socket. */

+				xCyaSSL_Object = NULL;

+				xCyaSSL_Object = CyaSSL_new( xCyaSSL_ServerContext );

+    

+				if( xCyaSSL_Object != NULL )

+				{

+					/* Associate the created CyaSSL object with the connected 

+					socket. */

+					xReturned = CyaSSL_set_fd( xCyaSSL_Object, xConnectedSocket );

+					configASSERT( xReturned == SSL_SUCCESS );

+

+					do

+					{

+						/* The next line is the secure equivalent to the 

+						standard sockets call:

+						lBytes = recv( xConnectedSocket, cReceivedString, 50, 0 ); */

+						lBytes = CyaSSL_read( xCyaSSL_Object, cReceivedString, sizeof( cReceivedString ) );

+						

+						/* Print the received characters. */

+						if( lBytes > 0 )

+						{

+							printf( "Received by the secure server: %s\r\n", cReceivedString );

+						}

+

+					} while ( lBytes > 0 );

+

+					/* The connection was closed, close the socket and free the

+					CyaSSL object. */

+					closesocket( xConnectedSocket );					

+					CyaSSL_free( xCyaSSL_Object );

+					printf( "Connection closed, back to start\r\n\r\n" );

+				}								

+			}

+		} 

+	}

+	else

+	{

+		/* The socket could not be opened. */

+		vTaskDelete( NULL );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static SOCKET prvOpenServerSocket( void )

+{

+WSADATA xWSAData;

+WORD wVersionRequested;

+struct sockaddr_in xConnection;

+SOCKET xSocket = INVALID_SOCKET;

+

+	wVersionRequested = MAKEWORD( 2, 2 );

+

+	/* Prepare to use WinSock. */

+	if( WSAStartup( wVersionRequested, &xWSAData ) != 0 )

+	{

+		fprintf( stderr, "Could not open Windows connection.\n" );

+	}

+	else

+	{

+		xSocket = socket( AF_INET, SOCK_STREAM, 0 );

+		if( xSocket == INVALID_SOCKET)

+		{

+			fprintf( stderr, "Could not create socket.\n" );

+			WSACleanup();

+		}

+		else

+		{

+			/* Zero out the server structure. */

+			memset( ( void * ) &xConnection, 0x00, sizeof( struct sockaddr_in ) );

+

+			xConnection.sin_family = AF_INET;

+			xConnection.sin_addr.s_addr = inet_addr("127.0.0.1");

+			xConnection.sin_port = htons( configTCP_PORT_NUMBER );

+

+			/* Bind the address to the socket. */

+			if( bind( xSocket, ( struct sockaddr * ) &xConnection, sizeof( struct sockaddr_in ) ) == -1 )

+			{

+				fprintf( stderr, "Could not socket to port %d.\n", configTCP_PORT_NUMBER );

+				closesocket( xSocket );

+				xSocket = INVALID_SOCKET;

+				WSACleanup();

+			}

+

+			if( listen( xSocket, 20 ) != 0 )

+			{

+				closesocket( xSocket );

+				xSocket = INVALID_SOCKET;

+				WSACleanup();

+			}

+		}

+	}

+

+	return xSocket;

+}

+/*-----------------------------------------------------------*/

+

+static void prvInitialiseCyaSSL( void )

+{

+int32_t iReturn;

+

+	#ifdef DEBUG_CYASSL

+	{

+		CyaSSL_Debugging_ON();

+	}

+	#endif

+

+    /* Initialise CyaSSL.  This must be done before any other CyaSSL functions

+    are called. */

+    CyaSSL_Init();

+

+    /* Attempt to create a context that uses the TLS V1 server protocol. */

+    xCyaSSL_ServerContext = CyaSSL_CTX_new( CyaTLSv1_server_method() );

+

+    if( xCyaSSL_ServerContext != NULL )

+    {

+        /* Load the CA certificate.  Real applications should ensure that

+        CyaSSL_CTX_load_verify_locations() returns SSL_SUCCESS before 

+		proceeding. */

+        iReturn = CyaSSL_CTX_load_verify_locations( xCyaSSL_ServerContext, "ca-cert.pem", 0 );

+		configASSERT( iReturn == SSL_SUCCESS );

+

+		iReturn = CyaSSL_CTX_use_certificate_file( xCyaSSL_ServerContext, "server-cert.pem", SSL_FILETYPE_PEM );

+		configASSERT( iReturn == SSL_SUCCESS );

+

+		iReturn = CyaSSL_CTX_use_PrivateKey_file( xCyaSSL_ServerContext, "server-key.pem", SSL_FILETYPE_PEM );

+		configASSERT( iReturn == SSL_SUCCESS );

+    }

+}

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj
new file mode 100644
index 0000000..0290eb1
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{C686325E-3261-42F7-AEB1-DDE5280E1CEB}</ProjectGuid>

+    <ProjectName>RTOSDemo</ProjectName>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseOfMfc>false</UseOfMfc>

+    <CharacterSet>MultiByte</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseOfMfc>false</UseOfMfc>

+    <CharacterSet>MultiByte</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>

+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>

+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>

+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>

+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>

+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>

+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>

+  </PropertyGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Midl>

+      <TypeLibraryName>.\Debug/WIN32.tlb</TypeLibraryName>

+      <HeaderFileName>

+      </HeaderFileName>

+    </Midl>

+    <ClCompile>

+      <Optimization>Disabled</Optimization>

+      <AdditionalIncludeDirectories>..\..\Source\CyaSSL;..\..\..\FreeRTOS\Source\include;..\..\..\FreeRTOS\Source\portable\MSVC-MingW;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;SIZEOF_LONG_LONG=8;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <MinimalRebuild>true</MinimalRebuild>

+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+      <PrecompiledHeaderOutputFile>.\Debug/WIN32.pch</PrecompiledHeaderOutputFile>

+      <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>

+      <ObjectFileName>.\Debug/</ObjectFileName>

+      <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>

+      <WarningLevel>Level4</WarningLevel>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <DisableLanguageExtensions>false</DisableLanguageExtensions>

+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Culture>0x0c09</Culture>

+    </ResourceCompile>

+    <Link>

+      <OutputFile>.\Debug/RTOSDemo.exe</OutputFile>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+      <ProgramDatabaseFile>.\Debug/WIN32.pdb</ProgramDatabaseFile>

+      <SubSystem>Console</SubSystem>

+      <TargetMachine>MachineX86</TargetMachine>

+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>

+      <AdditionalLibraryDirectories>

+      </AdditionalLibraryDirectories>

+    </Link>

+    <Bscmake>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <OutputFile>.\Debug/WIN32.bsc</OutputFile>

+    </Bscmake>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Midl>

+      <TypeLibraryName>.\Release/WIN32.tlb</TypeLibraryName>

+      <HeaderFileName>

+      </HeaderFileName>

+    </Midl>

+    <ClCompile>

+      <Optimization>MaxSpeed</Optimization>

+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>

+      <PreprocessorDefinitions>_WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <StringPooling>true</StringPooling>

+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <PrecompiledHeaderOutputFile>.\Release/WIN32.pch</PrecompiledHeaderOutputFile>

+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>

+      <ObjectFileName>.\Release/</ObjectFileName>

+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>

+      <WarningLevel>Level3</WarningLevel>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <AdditionalIncludeDirectories>..\..\Source\include;..\..\Source\portable\MSVC-MingW;..\Common\Include;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Culture>0x0c09</Culture>

+    </ResourceCompile>

+    <Link>

+      <OutputFile>.\Release/RTOSDemo.exe</OutputFile>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <ProgramDatabaseFile>.\Release/WIN32.pdb</ProgramDatabaseFile>

+      <SubSystem>Console</SubSystem>

+      <TargetMachine>MachineX86</TargetMachine>

+      <AdditionalLibraryDirectories>..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap</AdditionalLibraryDirectories>

+      <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+    <Bscmake>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <OutputFile>.\Release/WIN32.bsc</OutputFile>

+    </Bscmake>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\aes.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\arc4.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\asn.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\coding.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\des3.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\dh.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\dsa.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\hc128.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\hmac.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\integer.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\logging.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\md4.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\md5.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\memory.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\misc.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\pwdbased.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\rabbit.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\random.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\rsa.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\sha.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\sha256.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\src\internal.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\src\io.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\src\keys.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\src\ssl.c" />

+    <ClCompile Include="..\..\Source\CyaSSL\src\tls.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\list.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_3.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c" />

+    <ClCompile Include="main.c">

+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <ClCompile Include="SecureTCPClientTask.c" />

+    <ClCompile Include="SecureTCPServerTask.c" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="FreeRTOSConfig.h" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj.filters b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj.filters
new file mode 100644
index 0000000..82abb1f
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj.filters
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{38712199-cebf-4124-bf15-398f7c3419ea}</UniqueIdentifier>

+      <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>

+    </Filter>

+    <Filter Include="Demo App Source">

+      <UniqueIdentifier>{34567deb-d5ab-4a56-8640-0aaec609521a}</UniqueIdentifier>

+      <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS">

+      <UniqueIdentifier>{af3445a1-4908-4170-89ed-39345d90d30c}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS\Source">

+      <UniqueIdentifier>{f32be356-4763-4cae-9020-974a2638cb08}</UniqueIdentifier>

+      <Extensions>*.c</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS\Source\Portable">

+      <UniqueIdentifier>{88f409e6-d396-4ac5-94bd-7a99c914be46}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+">

+      <UniqueIdentifier>{e5ad4ec7-23dc-4295-8add-2acaee488f5a}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\CyaSSL">

+      <UniqueIdentifier>{8b481200-a9e5-48a4-98ad-49d2783cd652}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\CyaSSL\ctaocrypt">

+      <UniqueIdentifier>{738eaad9-4e49-4309-9074-c3d9e102fb4a}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="main.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c">

+      <Filter>FreeRTOS\Source\Portable</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_3.c">

+      <Filter>FreeRTOS\Source\Portable</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\list.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\src\internal.c">

+      <Filter>FreeRTOS+\CyaSSL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\src\io.c">

+      <Filter>FreeRTOS+\CyaSSL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\src\keys.c">

+      <Filter>FreeRTOS+\CyaSSL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\src\ssl.c">

+      <Filter>FreeRTOS+\CyaSSL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\src\tls.c">

+      <Filter>FreeRTOS+\CyaSSL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\aes.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\arc4.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\asn.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\coding.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\des3.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\dh.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\dsa.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\hc128.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\hmac.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\integer.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\logging.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\md4.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\md5.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\memory.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\misc.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\pwdbased.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\rabbit.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\random.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\rsa.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\sha256.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\CyaSSL\ctaocrypt\src\sha.c">

+      <Filter>FreeRTOS+\CyaSSL\ctaocrypt</Filter>

+    </ClCompile>

+    <ClCompile Include="SecureTCPServerTask.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+    <ClCompile Include="SecureTCPClientTask.c">

+      <Filter>Demo App Source</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="FreeRTOSConfig.h">

+      <Filter>Demo App Source</Filter>

+    </ClInclude>

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj.user b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj.user
new file mode 100644
index 0000000..695b5c7
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/WIN32.vcxproj.user
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/ca-cert.pem b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/ca-cert.pem
new file mode 100644
index 0000000..4a9786a
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/ca-cert.pem
@@ -0,0 +1,87 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            e9:d0:a7:5f:79:25:f4:3c
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.yassl.com/emailAddress=info@yassl.com
+        Validity
+            Not Before: Oct 24 18:18:15 2011 GMT
+            Not After : Jul 20 18:18:15 2014 GMT
+        Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.yassl.com/emailAddress=info@yassl.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (2048 bit)
+                Modulus (2048 bit):
+                    00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a:
+                    f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac:
+                    de:03:66:ee:2a:f1:d8:b0:7d:6e:07:54:0b:10:98:
+                    21:4d:80:cb:12:20:e7:cc:4f:de:45:7d:c9:72:77:
+                    32:ea:ca:90:bb:69:52:10:03:2f:a8:f3:95:c5:f1:
+                    8b:62:56:1b:ef:67:6f:a4:10:41:95:ad:0a:9b:e3:
+                    a5:c0:b0:d2:70:76:50:30:5b:a8:e8:08:2c:7c:ed:
+                    a7:a2:7a:8d:38:29:1c:ac:c7:ed:f2:7c:95:b0:95:
+                    82:7d:49:5c:38:cd:77:25:ef:bd:80:75:53:94:3c:
+                    3d:ca:63:5b:9f:15:b5:d3:1d:13:2f:19:d1:3c:db:
+                    76:3a:cc:b8:7d:c9:e5:c2:d7:da:40:6f:d8:21:dc:
+                    73:1b:42:2d:53:9c:fe:1a:fc:7d:ab:7a:36:3f:98:
+                    de:84:7c:05:67:ce:6a:14:38:87:a9:f1:8c:b5:68:
+                    cb:68:7f:71:20:2b:f5:a0:63:f5:56:2f:a3:26:d2:
+                    b7:6f:b1:5a:17:d7:38:99:08:fe:93:58:6f:fe:c3:
+                    13:49:08:16:0b:a7:4d:67:00:52:31:67:23:4e:98:
+                    ed:51:45:1d:b9:04:d9:0b:ec:d8:28:b3:4b:bd:ed:
+                    36:79
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Key Identifier: 
+                27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+            X509v3 Authority Key Identifier: 
+                keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+                DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.yassl.com/emailAddress=info@yassl.com
+                serial:E9:D0:A7:5F:79:25:F4:3C
+
+            X509v3 Basic Constraints: 
+                CA:TRUE
+    Signature Algorithm: sha1WithRSAEncryption
+        5f:86:14:f4:51:8b:bc:a5:4e:30:da:5e:ac:9a:f8:6c:d9:26:
+        4b:93:f9:e3:1c:89:6f:9e:ee:b3:9d:77:3e:89:20:76:a3:e6:
+        e8:86:15:21:db:e2:33:b2:34:d5:d0:9f:f3:c1:a4:87:92:5c:
+        f9:d1:ff:30:2f:8e:03:bc:b3:3c:0c:32:a3:90:5f:1a:90:1e:
+        af:9d:f3:9e:d7:07:02:a9:7d:27:66:63:2f:af:18:d7:ac:18:
+        98:8c:83:8f:38:f3:0b:ac:36:10:75:fb:ca:76:13:50:5b:02:
+        8f:73:bf:e3:a0:ee:83:52:25:54:ce:26:ce:9c:bd:2f:79:ab:
+        1b:60:b8:92:f1:03:c0:fc:3b:08:d9:c0:ad:d5:72:08:25:80:
+        61:2d:dc:9f:a7:83:62:07:47:e0:07:4c:4b:07:30:04:a9:87:
+        1c:55:7f:07:12:d0:cb:42:5d:cb:cf:66:01:1a:17:ee:f9:0f:
+        60:b7:db:6f:68:e5:4e:41:62:6e:d3:6f:60:4f:4b:27:de:cf:
+        18:07:f1:13:5d:cb:3f:a9:25:44:da:52:5c:c8:04:e1:56:12:
+        f5:2a:90:4e:d1:e2:af:01:b5:23:a1:ec:31:da:7b:63:69:c4:
+        b8:f3:e7:ce:a1:3d:c0:db:6d:f3:b2:d9:46:c8:9f:c3:b8:70:
+        5a:1f:7f:ca
+-----BEGIN CERTIFICATE-----
+MIIEnjCCA4agAwIBAgIJAOnQp195JfQ8MA0GCSqGSIb3DQEBBQUAMIGQMQswCQYD
+VQQGEwJVUzEQMA4GA1UECBMHTW9udGFuYTEQMA4GA1UEBxMHQm96ZW1hbjERMA8G
+A1UEChMIU2F3dG9vdGgxEzARBgNVBAsTCkNvbnN1bHRpbmcxFjAUBgNVBAMTDXd3
+dy55YXNzbC5jb20xHTAbBgkqhkiG9w0BCQEWDmluZm9AeWFzc2wuY29tMB4XDTEx
+MTAyNDE4MTgxNVoXDTE0MDcyMDE4MTgxNVowgZAxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdNb250YW5hMRAwDgYDVQQHEwdCb3plbWFuMREwDwYDVQQKEwhTYXd0b290
+aDETMBEGA1UECxMKQ29uc3VsdGluZzEWMBQGA1UEAxMNd3d3Lnlhc3NsLmNvbTEd
+MBsGCSqGSIb3DQEJARYOaW5mb0B5YXNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQC/DMotFLIehEJbzTgfSvJNdRDxtjWf38p9A5jTrN4DZu4q
+8diwfW4HVAsQmCFNgMsSIOfMT95FfclydzLqypC7aVIQAy+o85XF8YtiVhvvZ2+k
+EEGVrQqb46XAsNJwdlAwW6joCCx87aeieo04KRysx+3yfJWwlYJ9SVw4zXcl772A
+dVOUPD3KY1ufFbXTHRMvGdE823Y6zLh9yeXC19pAb9gh3HMbQi1TnP4a/H2rejY/
+mN6EfAVnzmoUOIep8Yy1aMtof3EgK/WgY/VWL6Mm0rdvsVoX1ziZCP6TWG/+wxNJ
+CBYLp01nAFIxZyNOmO1RRR25BNkL7Ngos0u97TZ5AgMBAAGjgfgwgfUwHQYDVR0O
+BBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHFBgNVHSMEgb0wgbqAFCeOZxF0wyYd
+P+0zY7Ok2B0w5ejVoYGWpIGTMIGQMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHTW9u
+dGFuYTEQMA4GA1UEBxMHQm96ZW1hbjERMA8GA1UEChMIU2F3dG9vdGgxEzARBgNV
+BAsTCkNvbnN1bHRpbmcxFjAUBgNVBAMTDXd3dy55YXNzbC5jb20xHTAbBgkqhkiG
+9w0BCQEWDmluZm9AeWFzc2wuY29tggkA6dCnX3kl9DwwDAYDVR0TBAUwAwEB/zAN
+BgkqhkiG9w0BAQUFAAOCAQEAX4YU9FGLvKVOMNperJr4bNkmS5P54xyJb57us513
+PokgdqPm6IYVIdviM7I01dCf88Gkh5Jc+dH/MC+OA7yzPAwyo5BfGpAer53zntcH
+Aql9J2ZjL68Y16wYmIyDjzjzC6w2EHX7ynYTUFsCj3O/46Dug1IlVM4mzpy9L3mr
+G2C4kvEDwPw7CNnArdVyCCWAYS3cn6eDYgdH4AdMSwcwBKmHHFV/BxLQy0Jdy89m
+ARoX7vkPYLfbb2jlTkFibtNvYE9LJ97PGAfxE13LP6klRNpSXMgE4VYS9SqQTtHi
+rwG1I6HsMdp7Y2nEuPPnzqE9wNtt87LZRsifw7hwWh9/yg==
+-----END CERTIFICATE-----
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/main.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/main.c
new file mode 100644
index 0000000..7a2f1ba
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/main.c
@@ -0,0 +1,141 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* Standard includes. */

+#include <stdio.h>

+#include <stdint.h>

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+#include "task.h"

+

+/* This application is using the FreeRTOS Windows simulator, which uses the

+FreeRTOS scheduler to schedule FreeRTOS task within the Windows environment.

+The Windows environment must not be allowed to block any Windows threads that

+are running FreeRTOS tasks, unless the FreeRTOS task is running at the FreeRTOS

+idle priority.  For simplicity, this demo uses the Windows TCP/IP stack, the

+API for which can cause Windows threads to block.  Therefore, any FreeRTOS task

+that makes calls to the Windows TCP/IP stack must be assigned the idle priority.

+Note this is only a restriction of the simulated Windows environment - real

+FreeRTOS ports do not have this restriction. */

+#define mainSECURE_SERVER_TASK_PRIORITY		( tskIDLE_PRIORITY )

+

+

+/*-----------------------------------------------------------*/

+

+/*

+ * The task that implements the server side.

+ */

+extern void vSecureTCPServerTask( void *pvParameters );

+

+/*-----------------------------------------------------------*/

+

+int main( void )

+{

+const uint32_t ulLongTime_ms = 250UL;

+

+	/* Create the TCP server task.  This will itself create the client task

+	once it has completed the CyaSSL initialisation. */

+	xTaskCreate( vSecureTCPServerTask, "Server", configMINIMAL_STACK_SIZE, NULL, mainSECURE_SERVER_TASK_PRIORITY, NULL );

+

+	/* Start the task running. */

+	vTaskStartScheduler();

+

+	/* If all is well, the scheduler will now be running, and the following

+	line will never be reached.  If the following line does execute, then

+	there was insufficient FreeRTOS heap memory available for the idle and/or

+	timer tasks	to be created.  See the memory management section on the

+	FreeRTOS web site for more details (this is standard text that is not not 

+	really applicable to the Win32 simulator port). */

+	for( ;; )

+	{

+		Sleep( ulLongTime_ms );

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vApplicationIdleHook( void )

+{

+const unsigned long ulMSToSleep = 5;

+

+	/* This function is called on each cycle of the idle task if

+	configUSE_IDLE_HOOK is set to 1 in FreeRTOSConfig.h.  Sleep to reduce CPU 

+	load. */

+	Sleep( ulMSToSleep );

+}

+/*-----------------------------------------------------------*/

+

+void vAssertCalled( void )

+{

+const unsigned long ulLongSleep = 1000UL;

+

+	taskDISABLE_INTERRUPTS();

+	for( ;; )

+	{

+		Sleep( ulLongSleep );

+	}

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/server-cert.pem b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/server-cert.pem
new file mode 100644
index 0000000..8381265
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/server-cert.pem
@@ -0,0 +1,158 @@
+Certificate:
+    Data:
+        Version: 1 (0x0)
+        Serial Number: 2 (0x2)
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.yassl.com/emailAddress=info@yassl.com
+        Validity
+            Not Before: Oct 24 18:27:13 2011 GMT
+            Not After : Jul 20 18:27:13 2014 GMT
+        Subject: C=US, ST=Montana, L=Bozeman, O=yaSSL, OU=Support, CN=www.yassl.com/emailAddress=info@yassl.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (2048 bit)
+                Modulus (2048 bit):
+                    00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27:
+                    01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6:
+                    f6:1c:88:bc:7c:9f:fb:a8:67:7f:fe:5c:9c:51:75:
+                    f7:8a:ca:07:e7:35:2f:8f:e1:bd:7b:c0:2f:7c:ab:
+                    64:a8:17:fc:ca:5d:7b:ba:e0:21:e5:72:2e:6f:2e:
+                    86:d8:95:73:da:ac:1b:53:b9:5f:3f:d7:19:0d:25:
+                    4f:e1:63:63:51:8b:0b:64:3f:ad:43:b8:a5:1c:5c:
+                    34:b3:ae:00:a0:63:c5:f6:7f:0b:59:68:78:73:a6:
+                    8c:18:a9:02:6d:af:c3:19:01:2e:b8:10:e3:c6:cc:
+                    40:b4:69:a3:46:33:69:87:6e:c4:bb:17:a6:f3:e8:
+                    dd:ad:73:bc:7b:2f:21:b5:fd:66:51:0c:bd:54:b3:
+                    e1:6d:5f:1c:bc:23:73:d1:09:03:89:14:d2:10:b9:
+                    64:c3:2a:d0:a1:96:4a:bc:e1:d4:1a:5b:c7:a0:c0:
+                    c1:63:78:0f:44:37:30:32:96:80:32:23:95:a1:77:
+                    ba:13:d2:97:73:e2:5d:25:c9:6a:0d:c3:39:60:a4:
+                    b4:b0:69:42:42:09:e9:d8:08:bc:33:20:b3:58:22:
+                    a7:aa:eb:c4:e1:e6:61:83:c5:d2:96:df:d9:d0:4f:
+                    ad:d7
+                Exponent: 65537 (0x10001)
+    Signature Algorithm: sha1WithRSAEncryption
+        71:4e:d3:62:df:cc:4c:f7:cd:b7:6e:52:0b:6c:6e:e0:bd:c2:
+        2d:07:d7:c0:b0:6e:43:1e:35:bc:30:01:50:f0:ff:99:23:6c:
+        18:1a:41:b6:11:d6:d4:19:61:fd:e4:77:97:1c:39:e1:57:ab:
+        c5:15:63:77:11:36:5e:74:e2:24:0b:1f:41:78:ad:b7:81:e7:
+        b4:40:66:80:f0:4b:91:a0:6d:a8:6e:3d:53:d9:8b:ce:2a:e1:
+        0b:45:65:87:a1:96:ae:ee:3e:88:d5:12:1f:78:17:ae:2c:c5:
+        73:44:d8:dc:f4:af:d8:cc:ae:4c:e1:0c:be:55:a4:99:f7:6e:
+        96:c0:c8:45:87:bf:dc:51:57:ff:9e:73:37:6a:18:9c:c3:f9:
+        22:7a:f4:b0:52:bd:fc:21:30:f8:c5:ff:1e:87:7d:ad:a2:5a:
+        35:f5:22:a8:b4:0a:76:38:e6:76:b0:98:af:1b:ec:8a:0a:43:
+        74:d2:85:34:37:84:07:e1:f6:23:b2:29:de:a6:b6:b7:4c:57:
+        7e:96:06:cb:a9:16:25:29:3a:03:2d:55:7d:a6:8c:a4:f7:9e:
+        81:c9:95:b6:7c:c1:4a:ce:94:66:0c:ca:88:eb:d2:09:f5:5b:
+        19:58:82:df:27:fd:67:95:78:b7:02:06:d5:a7:61:bd:ef:3a:
+        fc:b2:61:cd
+-----BEGIN CERTIFICATE-----
+MIIDkDCCAngCAQIwDQYJKoZIhvcNAQEFBQAwgZAxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdNb250YW5hMRAwDgYDVQQHEwdCb3plbWFuMREwDwYDVQQKEwhTYXd0b290
+aDETMBEGA1UECxMKQ29uc3VsdGluZzEWMBQGA1UEAxMNd3d3Lnlhc3NsLmNvbTEd
+MBsGCSqGSIb3DQEJARYOaW5mb0B5YXNzbC5jb20wHhcNMTExMDI0MTgyNzEzWhcN
+MTQwNzIwMTgyNzEzWjCBijELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB01vbnRhbmEx
+EDAOBgNVBAcTB0JvemVtYW4xDjAMBgNVBAoTBXlhU1NMMRAwDgYDVQQLEwdTdXBw
+b3J0MRYwFAYDVQQDEw13d3cueWFzc2wuY29tMR0wGwYJKoZIhvcNAQkBFg5pbmZv
+QHlhc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFX
+QfJxbbfSRUEnAWXGRa7yvCQwuJXOL07W9hyIvHyf+6hnf/5cnFF194rKB+c1L4/h
+vXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/XGQ0lT+FjY1GLC2Q/rUO4
+pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bMQLRpo0YzaYduxLsXpvPo
+3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4
+D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHm
+YYPF0pbf2dBPrdcCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAcU7TYt/MTPfNt25S
+C2xu4L3CLQfXwLBuQx41vDABUPD/mSNsGBpBthHW1Blh/eR3lxw54VerxRVjdxE2
+XnTiJAsfQXitt4HntEBmgPBLkaBtqG49U9mLzirhC0Vlh6GWru4+iNUSH3gXrizF
+c0TY3PSv2MyuTOEMvlWkmfdulsDIRYe/3FFX/55zN2oYnMP5Inr0sFK9/CEw+MX/
+Hod9raJaNfUiqLQKdjjmdrCYrxvsigpDdNKFNDeEB+H2I7Ip3qa2t0xXfpYGy6kW
+JSk6Ay1VfaaMpPeegcmVtnzBSs6UZgzKiOvSCfVbGViC3yf9Z5V4twIG1adhve86
+/LJhzQ==
+-----END CERTIFICATE-----
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            e9:d0:a7:5f:79:25:f4:3c
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.yassl.com/emailAddress=info@yassl.com
+        Validity
+            Not Before: Oct 24 18:18:15 2011 GMT
+            Not After : Jul 20 18:18:15 2014 GMT
+        Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.yassl.com/emailAddress=info@yassl.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (2048 bit)
+                Modulus (2048 bit):
+                    00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a:
+                    f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac:
+                    de:03:66:ee:2a:f1:d8:b0:7d:6e:07:54:0b:10:98:
+                    21:4d:80:cb:12:20:e7:cc:4f:de:45:7d:c9:72:77:
+                    32:ea:ca:90:bb:69:52:10:03:2f:a8:f3:95:c5:f1:
+                    8b:62:56:1b:ef:67:6f:a4:10:41:95:ad:0a:9b:e3:
+                    a5:c0:b0:d2:70:76:50:30:5b:a8:e8:08:2c:7c:ed:
+                    a7:a2:7a:8d:38:29:1c:ac:c7:ed:f2:7c:95:b0:95:
+                    82:7d:49:5c:38:cd:77:25:ef:bd:80:75:53:94:3c:
+                    3d:ca:63:5b:9f:15:b5:d3:1d:13:2f:19:d1:3c:db:
+                    76:3a:cc:b8:7d:c9:e5:c2:d7:da:40:6f:d8:21:dc:
+                    73:1b:42:2d:53:9c:fe:1a:fc:7d:ab:7a:36:3f:98:
+                    de:84:7c:05:67:ce:6a:14:38:87:a9:f1:8c:b5:68:
+                    cb:68:7f:71:20:2b:f5:a0:63:f5:56:2f:a3:26:d2:
+                    b7:6f:b1:5a:17:d7:38:99:08:fe:93:58:6f:fe:c3:
+                    13:49:08:16:0b:a7:4d:67:00:52:31:67:23:4e:98:
+                    ed:51:45:1d:b9:04:d9:0b:ec:d8:28:b3:4b:bd:ed:
+                    36:79
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Key Identifier: 
+                27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+            X509v3 Authority Key Identifier: 
+                keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5
+                DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.yassl.com/emailAddress=info@yassl.com
+                serial:E9:D0:A7:5F:79:25:F4:3C
+
+            X509v3 Basic Constraints: 
+                CA:TRUE
+    Signature Algorithm: sha1WithRSAEncryption
+        5f:86:14:f4:51:8b:bc:a5:4e:30:da:5e:ac:9a:f8:6c:d9:26:
+        4b:93:f9:e3:1c:89:6f:9e:ee:b3:9d:77:3e:89:20:76:a3:e6:
+        e8:86:15:21:db:e2:33:b2:34:d5:d0:9f:f3:c1:a4:87:92:5c:
+        f9:d1:ff:30:2f:8e:03:bc:b3:3c:0c:32:a3:90:5f:1a:90:1e:
+        af:9d:f3:9e:d7:07:02:a9:7d:27:66:63:2f:af:18:d7:ac:18:
+        98:8c:83:8f:38:f3:0b:ac:36:10:75:fb:ca:76:13:50:5b:02:
+        8f:73:bf:e3:a0:ee:83:52:25:54:ce:26:ce:9c:bd:2f:79:ab:
+        1b:60:b8:92:f1:03:c0:fc:3b:08:d9:c0:ad:d5:72:08:25:80:
+        61:2d:dc:9f:a7:83:62:07:47:e0:07:4c:4b:07:30:04:a9:87:
+        1c:55:7f:07:12:d0:cb:42:5d:cb:cf:66:01:1a:17:ee:f9:0f:
+        60:b7:db:6f:68:e5:4e:41:62:6e:d3:6f:60:4f:4b:27:de:cf:
+        18:07:f1:13:5d:cb:3f:a9:25:44:da:52:5c:c8:04:e1:56:12:
+        f5:2a:90:4e:d1:e2:af:01:b5:23:a1:ec:31:da:7b:63:69:c4:
+        b8:f3:e7:ce:a1:3d:c0:db:6d:f3:b2:d9:46:c8:9f:c3:b8:70:
+        5a:1f:7f:ca
+-----BEGIN CERTIFICATE-----
+MIIEnjCCA4agAwIBAgIJAOnQp195JfQ8MA0GCSqGSIb3DQEBBQUAMIGQMQswCQYD
+VQQGEwJVUzEQMA4GA1UECBMHTW9udGFuYTEQMA4GA1UEBxMHQm96ZW1hbjERMA8G
+A1UEChMIU2F3dG9vdGgxEzARBgNVBAsTCkNvbnN1bHRpbmcxFjAUBgNVBAMTDXd3
+dy55YXNzbC5jb20xHTAbBgkqhkiG9w0BCQEWDmluZm9AeWFzc2wuY29tMB4XDTEx
+MTAyNDE4MTgxNVoXDTE0MDcyMDE4MTgxNVowgZAxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdNb250YW5hMRAwDgYDVQQHEwdCb3plbWFuMREwDwYDVQQKEwhTYXd0b290
+aDETMBEGA1UECxMKQ29uc3VsdGluZzEWMBQGA1UEAxMNd3d3Lnlhc3NsLmNvbTEd
+MBsGCSqGSIb3DQEJARYOaW5mb0B5YXNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQC/DMotFLIehEJbzTgfSvJNdRDxtjWf38p9A5jTrN4DZu4q
+8diwfW4HVAsQmCFNgMsSIOfMT95FfclydzLqypC7aVIQAy+o85XF8YtiVhvvZ2+k
+EEGVrQqb46XAsNJwdlAwW6joCCx87aeieo04KRysx+3yfJWwlYJ9SVw4zXcl772A
+dVOUPD3KY1ufFbXTHRMvGdE823Y6zLh9yeXC19pAb9gh3HMbQi1TnP4a/H2rejY/
+mN6EfAVnzmoUOIep8Yy1aMtof3EgK/WgY/VWL6Mm0rdvsVoX1ziZCP6TWG/+wxNJ
+CBYLp01nAFIxZyNOmO1RRR25BNkL7Ngos0u97TZ5AgMBAAGjgfgwgfUwHQYDVR0O
+BBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHFBgNVHSMEgb0wgbqAFCeOZxF0wyYd
+P+0zY7Ok2B0w5ejVoYGWpIGTMIGQMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHTW9u
+dGFuYTEQMA4GA1UEBxMHQm96ZW1hbjERMA8GA1UEChMIU2F3dG9vdGgxEzARBgNV
+BAsTCkNvbnN1bHRpbmcxFjAUBgNVBAMTDXd3dy55YXNzbC5jb20xHTAbBgkqhkiG
+9w0BCQEWDmluZm9AeWFzc2wuY29tggkA6dCnX3kl9DwwDAYDVR0TBAUwAwEB/zAN
+BgkqhkiG9w0BAQUFAAOCAQEAX4YU9FGLvKVOMNperJr4bNkmS5P54xyJb57us513
+PokgdqPm6IYVIdviM7I01dCf88Gkh5Jc+dH/MC+OA7yzPAwyo5BfGpAer53zntcH
+Aql9J2ZjL68Y16wYmIyDjzjzC6w2EHX7ynYTUFsCj3O/46Dug1IlVM4mzpy9L3mr
+G2C4kvEDwPw7CNnArdVyCCWAYS3cn6eDYgdH4AdMSwcwBKmHHFV/BxLQy0Jdy89m
+ARoX7vkPYLfbb2jlTkFibtNvYE9LJ97PGAfxE13LP6klRNpSXMgE4VYS9SqQTtHi
+rwG1I6HsMdp7Y2nEuPPnzqE9wNtt87LZRsifw7hwWh9/yg==
+-----END CERTIFICATE-----
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/server-key.pem b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/server-key.pem
new file mode 100644
index 0000000..d1627f4
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_CyaSSL_Windows_Simulator/server-key.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAwJUI4VdB8nFtt9JFQScBZcZFrvK8JDC4lc4vTtb2HIi8fJ/7
+qGd//lycUXX3isoH5zUvj+G9e8AvfKtkqBf8yl17uuAh5XIuby6G2JVz2qwbU7lf
+P9cZDSVP4WNjUYsLZD+tQ7ilHFw0s64AoGPF9n8LWWh4c6aMGKkCba/DGQEuuBDj
+xsxAtGmjRjNph27Euxem8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlk
+wyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlC
+Qgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t1wIDAQABAoIBAQCa0DQPUmIFUAHv
+n+1kbsLE2hryhNeSEEiSxOlq64t1bMZ5OPLJckqGZFSVd8vDmp231B2kAMieTuTd
+x7pnFsF0vKnWlI8rMBr77d8hBSPZSjm9mGtlmrjcxH3upkMVLj2+HSJgKnMw1T7Y
+oqyGQy7E9WReP4l1DxHYUSVOn9iqo85gs+KK2X4b8GTKmlsFC1uqy+XjP24yIgXz
+0PrvdFKB4l90073/MYNFdfpjepcu1rYZxpIm5CgGUFAOeC6peA0Ul7QS2DFAq6EB
+QcIw+AdfFuRhd9Jg8p+N6PS662PeKpeB70xs5lU0USsoNPRTHMRYCj+7r7X3SoVD
+LTzxWFiBAoGBAPIsVHY5I2PJEDK3k62vvhl1loFk5rW4iUJB0W3QHBv4G6xpyzY8
+ZH3c9Bm4w2CxV0hfUk9ZOlV/MsAZQ1A/rs5vF/MOn0DKTq0VO8l56cBZOHNwnAp8
+yTpIMqfYSXUKhcLC/RVz2pkJKmmanwpxv7AEpox6Wm9IWlQ7xrFTF9/nAoGBAMuT
+3ncVXbdcXHzYkKmYLdZpDmOzo9ymzItqpKISjI57SCyySzfcBhh96v52odSh6T8N
+zRtfr1+elltbD6F8r7ObkNtXczrtsCNErkFPHwdCEyNMy/r0FKTV9542fFufqDzB
+hV900jkt/9CE3/uzIHoumxeu5roLrl9TpFLtG8SRAoGBAOyY2rvV/vlSSn0CVUlv
+VW5SL4SjK7OGYrNU0mNS2uOIdqDvixWl0xgUcndex6MEH54ZYrUbG57D8rUy+UzB
+qusMJn3UX0pRXKRFBnBEp1bA1CIUdp7YY1CJkNPiv4GVkjFBhzkaQwsYpVMfORpf
+H0O8h2rfbtMiAP4imHBOGhkpAoGBAIpBVihRnl/Ungs7mKNU8mxW1KrpaTOFJAza
+1AwtxL9PAmk4fNTm3Ezt1xYRwz4A58MmwFEC3rt1nG9WnHrzju/PisUr0toGakTJ
+c/5umYf4W77xfOZltU9s8MnF/xbKixsX4lg9ojerAby/QM5TjI7t7+5ZneBj5nxe
+9Y5L8TvBAoGATUX5QIzFW/QqGoq08hysa+kMVja3TnKW1eWK0uL/8fEYEz2GCbjY
+dqfJHHFSlDBD4PF4dP1hG0wJzOZoKnGtHN9DvFbbpaS+NXCkXs9P/ABVmTo9I89n
+WvUi+LUp0EQR6zUuRr79jhiyX6i/GTKh9dwD5nyaHwx8qbAOITc78bA=
+-----END RSA PRIVATE KEY-----
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/FreeRTOSConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/FreeRTOSConfig.h
new file mode 100644
index 0000000..1042d4a
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/FreeRTOSConfig.h
@@ -0,0 +1,168 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef FREERTOS_CONFIG_H

+#define FREERTOS_CONFIG_H

+

+/*-----------------------------------------------------------

+ * Application specific definitions.

+ *

+ * These definitions should be adjusted for your particular hardware and

+ * application requirements.

+ *

+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE

+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.

+ * http://www.freertos.org/a00110.html

+ *

+ * The bottom of this file contains some constants specific to running the UDP

+ * stack in this demo.  Constants specific to FreeRTOS+UDP itself (rather than

+ * the demo) are contained in FreeRTOSIPConfig.h.

+ *----------------------------------------------------------*/

+

+#define configUSE_PREEMPTION			1

+#define configMAX_PRIORITIES			( ( unsigned portBASE_TYPE ) 7 )

+#define configTICK_RATE_HZ				( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */

+#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */

+#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 32U * 1024U ) )

+#define configMAX_TASK_NAME_LEN			( 7 )

+#define configUSE_TRACE_FACILITY		1

+#define configUSE_16_BIT_TICKS			0

+#define configIDLE_SHOULD_YIELD			1

+#define configUSE_CO_ROUTINES 			0

+#define configUSE_MUTEXES				1

+#define configUSE_RECURSIVE_MUTEXES		1

+#define configQUEUE_REGISTRY_SIZE		0

+#define configUSE_APPLICATION_TASK_TAG	0

+#define configUSE_COUNTING_SEMAPHORES	1

+#define configUSE_ALTERNATIVE_API		0

+

+/* Hook function related definitions. */

+#define configUSE_TICK_HOOK				0

+#define configUSE_IDLE_HOOK				1

+#define configUSE_MALLOC_FAILED_HOOK	1

+#define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */

+

+/* Software timer related definitions. */

+#define configUSE_TIMERS				1

+#define configTIMER_TASK_PRIORITY		( configMAX_PRIORITIES - 1 )

+#define configTIMER_QUEUE_LENGTH		5

+#define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 )

+

+/* Run time stats gathering definitions. */

+unsigned long ulGetRunTimeCounterValue( void );

+void vConfigureTimerForRunTimeStats( void );

+#define configGENERATE_RUN_TIME_STATS	1

+#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()

+#define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeCounterValue()

+

+/* Co-routine definitions. */

+#define configUSE_CO_ROUTINES 			0

+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

+

+/* Set the following definitions to 1 to include the API function, or zero

+to exclude the API function. */

+#define INCLUDE_vTaskPrioritySet			1

+#define INCLUDE_uxTaskPriorityGet			1

+#define INCLUDE_vTaskDelete					1

+#define INCLUDE_vTaskCleanUpResources		0

+#define INCLUDE_vTaskSuspend				1

+#define INCLUDE_vTaskDelayUntil				1

+#define INCLUDE_vTaskDelay					1

+#define INCLUDE_uxTaskGetStackHighWaterMark	1

+#define INCLUDE_xTaskGetSchedulerState		1

+#define INCLUDE_xTimerGetTimerTaskHandle	0

+#define INCLUDE_xTaskGetIdleTaskHandle		0

+#define INCLUDE_xQueueGetMutexHolder		1

+

+/* This demo makes use of one or more example stats formatting functions.  These

+format the raw data provided by the uxTaskGetSystemState() function in to human

+readable ASCII form.  See the notes in the implementation of vTaskList() within 

+FreeRTOS/Source/tasks.c for limitations. */

+#define configUSE_STATS_FORMATTING_FUNCTIONS	1

+

+/* Assert call defined for debug builds. */

+#ifdef _DEBUG

+	extern void vAssertCalled( const char *pcFile, unsigned long ulLine );

+	#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )

+#endif /* _DEBUG */

+

+

+

+/* Application specific definitions follow. **********************************/

+

+/* The UDP port to use for incoming command inputs.  The outgoing port is

+set to ( configUDP_CLI_PORT_NUMBER + 1 ). */

+#define configUDP_CLI_PORT_NUMBER	5001

+

+/* The size of the global output buffer that is available for use when there

+are multiple command interpreters running at once (for example, one on a UART

+and one on TCP/IP).  This is done to prevent an output buffer being defined by

+each implementation - which would waste RAM.  In this case, there is only one

+command interpreter running, and it has its own local output buffer, so the

+global buffer is just set to be one byte long as it is not used and should not

+take up unnecessary RAM. */

+#define configCOMMAND_INT_MAX_OUTPUT_SIZE 1

+

+#endif /* FREERTOS_CONFIG_H */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_fat_sl.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_fat_sl.h
new file mode 100644
index 0000000..8647077
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_fat_sl.h
@@ -0,0 +1,67 @@
+/*

+ * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded

+ *

+ * FreeRTOS+FAT SL is an complementary component provided to Real Time Engineers

+ * Ltd. by HCC Embedded for use with FreeRTOS.  It is not, in itself, part of

+ * the FreeRTOS kernel.  FreeRTOS+FAT SL is licensed separately from FreeRTOS,

+ * and uses a different license to FreeRTOS.  FreeRTOS+FAT SL uses a dual

+ * license model, information on which is provided below:

+ *

+ * - Open source licensing -

+ * FreeRTOS+FAT SL is a free download and may be used, modified and distributed

+ * without charge provided the user adheres to version two of the GNU General

+ * Public license (GPL) and does not remove the copyright notice or this text.

+ * The GPL V2 text is available on the gnu.org web site, and on the following

+ * URL: http://www.FreeRTOS.org/gpl-2.0.txt

+ *

+ * - Commercial licensing -

+ * Businesses and individuals who wish to incorporate FreeRTOS+FAT SL into

+ * proprietary software for redistribution in any form must first obtain a

+ * commercial license - and in-so-doing support the maintenance, support and

+ * further development of the FreeRTOS+FAT SL product.  Commercial licenses can

+ * be obtained from http://shop.freertos.org and do not require any source files

+ * to be changed.

+ *

+ * FreeRTOS+FAT SL is distributed in the hope that it will be useful.  You

+ * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as

+ * is'.  FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the

+ * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A

+ * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all

+ * conditions and terms, be they implied, expressed, or statutory.

+ *

+ * http://www.FreeRTOS.org

+ * http://www.FreeRTOS.org/FreeRTOS-Plus

+ *

+ */

+

+#ifndef _CONFIG_FAT_SL_H

+#define _CONFIG_FAT_SL_H

+

+#include "../version/ver_fat_sl.h"

+#if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2

+ #error Incompatible FAT_SL version number!

+#endif

+

+#include "../api/api_mdriver.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+

+/**************************************************************************

+**

+**  FAT SL user settings

+**

+**************************************************************************/

+#define F_SECTOR_SIZE           512u  /* Disk sector size. */

+#define F_FS_THREAD_AWARE       1     /* Set to one if the file system will be access from more than one task. */

+#define F_MAXPATH               64    /* Maximum length a file name (including its full path) can be. */

+#define F_MAX_LOCK_WAIT_TICKS   20    /* The maximum number of RTOS ticks to wait when attempting to obtain a lock on the file system when F_FS_THREAD_AWARE is set to 1. */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* _CONFIG_FAT_SL_H */

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_fat_sl_test.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_fat_sl_test.h
new file mode 100644
index 0000000..2f56f93
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_fat_sl_test.h
@@ -0,0 +1,62 @@
+/*

+ * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded

+ *

+ * FreeRTOS+FAT SL is an complementary component provided to Real Time Engineers

+ * Ltd. by HCC Embedded for use with FreeRTOS.  It is not, in itself, part of

+ * the FreeRTOS kernel.  FreeRTOS+FAT SL is licensed separately from FreeRTOS,

+ * and uses a different license to FreeRTOS.  FreeRTOS+FAT SL uses a dual

+ * license model, information on which is provided below:

+ *

+ * - Open source licensing -

+ * FreeRTOS+FAT SL is a free download and may be used, modified and distributed

+ * without charge provided the user adheres to version two of the GNU General

+ * Public license (GPL) and does not remove the copyright notice or this text.

+ * The GPL V2 text is available on the gnu.org web site, and on the following

+ * URL: http://www.FreeRTOS.org/gpl-2.0.txt

+ *

+ * - Commercial licensing -

+ * Businesses and individuals who wish to incorporate FreeRTOS+FAT SL into

+ * proprietary software for redistribution in any form must first obtain a

+ * commercial license - and in-so-doing support the maintenance, support and

+ * further development of the FreeRTOS+FAT SL product.  Commercial licenses can

+ * be obtained from http://shop.freertos.org and do not require any source files

+ * to be changed.

+ *

+ * FreeRTOS+FAT SL is distributed in the hope that it will be useful.  You

+ * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as

+ * is'.  FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the

+ * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A

+ * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all

+ * conditions and terms, be they implied, expressed, or statutory.

+ *

+ * http://www.FreeRTOS.org

+ * http://www.FreeRTOS.org/FreeRTOS-Plus

+ *

+ */

+

+#ifndef _CONFIG_FAT_SL_TEST_H

+#define _CONFIG_FAT_SL_TEST_H

+

+#include "../version/ver_fat_sl.h"

+#if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2

+ #error Incompatible FAT_SL version number!

+#endif

+

+

+/*

+** Maximum size for seek test.

+** Options: 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768

+*/

+#define F_MAX_SEEK_TEST 16384

+

+

+/*

+** Defines media type for testing.

+** Options: F_FAT12_MEDIA, F_FAT16_MEDIA, F_FAT32_MEDIA

+*/

+#define F_FAT_TYPE      F_FAT16_MEDIA

+

+

+#endif /* ifndef _CONFIG_STHIN_TEST_H */

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_mdriver_ram.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_mdriver_ram.h
new file mode 100644
index 0000000..51f2018
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/ConfigurationFiles/config_mdriver_ram.h
@@ -0,0 +1,52 @@
+/*

+ * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded

+ *

+ * FreeRTOS+FAT SL is an complementary component provided to Real Time Engineers

+ * Ltd. by HCC Embedded for use with FreeRTOS.  It is not, in itself, part of

+ * the FreeRTOS kernel.  FreeRTOS+FAT SL is licensed separately from FreeRTOS,

+ * and uses a different license to FreeRTOS.  FreeRTOS+FAT SL uses a dual

+ * license model, information on which is provided below:

+ *

+ * - Open source licensing -

+ * FreeRTOS+FAT SL is a free download and may be used, modified and distributed

+ * without charge provided the user adheres to version two of the GNU General

+ * Public license (GPL) and does not remove the copyright notice or this text.

+ * The GPL V2 text is available on the gnu.org web site, and on the following

+ * URL: http://www.FreeRTOS.org/gpl-2.0.txt

+ *

+ * - Commercial licensing -

+ * Businesses and individuals who wish to incorporate FreeRTOS+FAT SL into

+ * proprietary software for redistribution in any form must first obtain a

+ * commercial license - and in-so-doing support the maintenance, support and

+ * further development of the FreeRTOS+FAT SL product.  Commercial licenses can

+ * be obtained from http://shop.freertos.org and do not require any source files

+ * to be changed.

+ *

+ * FreeRTOS+FAT SL is distributed in the hope that it will be useful.  You

+ * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as

+ * is'.  FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the

+ * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A

+ * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all

+ * conditions and terms, be they implied, expressed, or statutory.

+ *

+ * http://www.FreeRTOS.org

+ * http://www.FreeRTOS.org/FreeRTOS-Plus

+ *

+ */

+

+#ifndef _CONFIG_MDRIVER_RAM_H_

+#define _CONFIG_MDRIVER_RAM_H_

+

+#include "../version/ver_mdriver_ram.h"

+#if VER_MDRIVER_RAM_MAJOR != 1 || VER_MDRIVER_RAM_MINOR != 2

+ #error Incompatible MDRIVER_RAM version number!

+#endif

+

+#define MDRIVER_RAM_SECTOR_SIZE   512       /* Sector size */

+

+#define MDRIVER_RAM_VOLUME0_SIZE  (128 * 1024) /* defintion for size of ramdrive0 */

+

+#define MDRIVER_MEM_LONG_ACCESS   1         /* set this value to 1 if 32bit access available */

+

+#endif /* ifndef _CONFIG_MDRIVER_RAM_H_ */

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/File-Releated-CLI-commands.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/File-Releated-CLI-commands.c
new file mode 100644
index 0000000..1ea3370
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/File-Releated-CLI-commands.c
@@ -0,0 +1,610 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* File system includes. */

+#include "fat_sl.h"

+#include "api_mdriver_ram.h"

+#include "test.h"

+

+#ifdef _WINDOWS_

+	#define snprintf _snprintf

+#endif

+

+#define cliNEW_LINE		"\r\n"

+

+/*******************************************************************************

+ * See the URL in the comments within main.c for the location of the online

+ * documentation.

+ ******************************************************************************/

+

+/*

+ * Print out information on a single file.

+ */

+static void prvCreateFileInfoString( char *pcBuffer, F_FIND *pxFindStruct );

+

+/*

+ * Copies an existing file into a newly created file.

+ */

+static portBASE_TYPE prvPerformCopy( const char *pcSourceFile,

+							int32_t lSourceFileLength,

+							const char *pcDestinationFile,

+							char *pxWriteBuffer,

+							size_t xWriteBufferLen );

+

+/*

+ * Implements the DIR command.

+ */

+static portBASE_TYPE prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the CD command.

+ */

+static portBASE_TYPE prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the DEL command.

+ */

+static portBASE_TYPE prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the TYPE command.

+ */

+static portBASE_TYPE prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the COPY command.

+ */

+static portBASE_TYPE prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the TEST command.

+ */

+static portBASE_TYPE prvTESTFSCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/* Structure that defines the DIR command line command, which lists all the

+files in the current directory. */

+static const CLI_Command_Definition_t xDIR =

+{

+	"dir", /* The command string to type. */

+	"\r\ndir:\r\n Lists the files in the current directory\r\n",

+	prvDIRCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the CD command line command, which changes the

+working directory. */

+static const CLI_Command_Definition_t xCD =

+{

+	"cd", /* The command string to type. */

+	"\r\ncd <dir name>:\r\n Changes the working directory\r\n",

+	prvCDCommand, /* The function to run. */

+	1 /* One parameter is expected. */

+};

+

+/* Structure that defines the TYPE command line command, which prints the

+contents of a file to the console. */

+static const CLI_Command_Definition_t xTYPE =

+{

+	"type", /* The command string to type. */

+	"\r\ntype <filename>:\r\n Prints file contents to the terminal\r\n",

+	prvTYPECommand, /* The function to run. */

+	1 /* One parameter is expected. */

+};

+

+/* Structure that defines the DEL command line command, which deletes a file. */

+static const CLI_Command_Definition_t xDEL =

+{

+	"del", /* The command string to type. */

+	"\r\ndel <filename>:\r\n deletes a file or directory\r\n",

+	prvDELCommand, /* The function to run. */

+	1 /* One parameter is expected. */

+};

+

+/* Structure that defines the COPY command line command, which deletes a file. */

+static const CLI_Command_Definition_t xCOPY =

+{

+	"copy", /* The command string to type. */

+	"\r\ncopy <source file> <dest file>:\r\n Copies <source file> to <dest file>\r\n",

+	prvCOPYCommand, /* The function to run. */

+	2 /* Two parameters are expected. */

+};

+

+/* Structure that defines the TEST command line command, which executes some

+file system driver tests. */

+static const CLI_Command_Definition_t xTEST_FS =

+{

+	"test-fs", /* The command string to type. */

+	"\r\ntest-fs:\r\n Executes file system tests.  ALL FILES WILL BE DELETED!!!\r\n",

+	prvTESTFSCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/*-----------------------------------------------------------*/

+

+void vRegisterFileSystemCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xDIR );

+	FreeRTOS_CLIRegisterCommand( &xCD );

+	FreeRTOS_CLIRegisterCommand( &xTYPE );

+	FreeRTOS_CLIRegisterCommand( &xDEL );

+	FreeRTOS_CLIRegisterCommand( &xCOPY );

+	FreeRTOS_CLIRegisterCommand( &xTEST_FS );

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn = pdTRUE;

+static F_FILE *pxFile = NULL;

+int iChar;

+size_t xByte;

+size_t xColumns = 50U;

+

+	/* Ensure there is always a null terminator after each character written. */

+	memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+

+	/* Ensure the buffer leaves space for the \r\n. */

+	configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) );

+	xWriteBufferLen -= strlen( cliNEW_LINE );

+

+	if( xWriteBufferLen < xColumns )

+	{

+		/* Ensure the loop that uses xColumns as an end condition does not

+		write off the end of the buffer. */

+		xColumns = xWriteBufferLen;

+	}

+

+	if( pxFile == NULL )

+	{

+		/* The file has not been opened yet.  Find the file name. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							1,						/* Return the first parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Attempt to open the requested file. */

+		pxFile = f_open( pcParameter, "r" );

+	}

+

+	if( pxFile != NULL )

+	{

+		/* Read the next chunk of data from the file. */

+		for( xByte = 0; xByte < xColumns; xByte++ )

+		{

+			iChar = f_getc( pxFile );

+

+			if( iChar == -1 )

+			{

+				/* No more characters to return. */

+				f_close( pxFile );

+				pxFile = NULL;

+				break;

+			}

+			else

+			{

+				pcWriteBuffer[ xByte ] = ( char ) iChar;

+			}

+		}

+	}

+

+	if( pxFile == NULL )

+	{

+		/* Either the file was not opened, or all the data from the file has

+		been returned and the file is now closed. */

+		xReturn = pdFALSE;

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength;

+unsigned char ucReturned;

+size_t xStringLength;

+

+	/* Obtain the parameter string. */

+	pcParameter = FreeRTOS_CLIGetParameter

+					(

+						pcCommandString,		/* The command string itself. */

+						1,						/* Return the first parameter. */

+						&xParameterStringLength	/* Store the parameter string length. */

+					);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcParameter );

+

+	/* Attempt to move to the requested directory. */

+	ucReturned = f_chdir( pcParameter );

+

+	if( ucReturned == F_NO_ERROR )

+	{

+		sprintf( pcWriteBuffer, "In: " );

+		xStringLength = strlen( pcWriteBuffer );

+		f_getcwd( &( pcWriteBuffer[ xStringLength ] ), ( unsigned char ) ( xWriteBufferLen - xStringLength ) );

+	}

+	else

+	{

+		sprintf( pcWriteBuffer, "Error" );

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+static F_FIND *pxFindStruct = NULL;

+unsigned char ucReturned;

+portBASE_TYPE xReturn = pdFALSE;

+

+	/* This assumes pcWriteBuffer is long enough. */

+	( void ) pcCommandString;

+

+	/* Ensure the buffer leaves space for the \r\n. */

+	configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) );

+	xWriteBufferLen -= strlen( cliNEW_LINE );

+

+	if( pxFindStruct == NULL )

+	{

+		/* This is the first time this function has been executed since the Dir

+		command was run.  Create the find structure. */

+		pxFindStruct = ( F_FIND * ) pvPortMalloc( sizeof( F_FIND ) );

+

+		if( pxFindStruct != NULL )

+		{

+			ucReturned = f_findfirst( "*.*", pxFindStruct );

+

+			if( ucReturned == F_NO_ERROR )

+			{

+				prvCreateFileInfoString( pcWriteBuffer, pxFindStruct );

+				xReturn = pdPASS;

+			}

+			else

+			{

+				snprintf( pcWriteBuffer, xWriteBufferLen, "Error: f_findfirst() failed." );

+			}

+		}

+		else

+		{

+			snprintf( pcWriteBuffer, xWriteBufferLen, "Failed to allocate RAM (using heap_4.c will prevent fragmentation)." );

+		}

+	}

+	else

+	{

+		/* The find struct has already been created.  Find the next file in

+		the directory. */

+		ucReturned = f_findnext( pxFindStruct );

+

+		if( ucReturned == F_NO_ERROR )

+		{

+			prvCreateFileInfoString( pcWriteBuffer, pxFindStruct );

+			xReturn = pdPASS;

+		}

+		else

+		{

+			/* There are no more files.  Free the find structure. */

+			vPortFree( pxFindStruct );

+			pxFindStruct = NULL;

+

+			/* No string to return. */

+			pcWriteBuffer[ 0 ] = 0x00;

+		}

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength;

+unsigned char ucReturned;

+

+	/* This function assumes xWriteBufferLen is large enough! */

+	( void ) xWriteBufferLen;

+

+	/* Obtain the parameter string. */

+	pcParameter = FreeRTOS_CLIGetParameter

+					(

+						pcCommandString,		/* The command string itself. */

+						1,						/* Return the first parameter. */

+						&xParameterStringLength	/* Store the parameter string length. */

+					);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcParameter );

+

+	/* Attempt to delete the file. */

+	ucReturned = f_delete( pcParameter );

+

+	if( ucReturned == F_NO_ERROR )

+	{

+		sprintf( pcWriteBuffer, "%s was deleted", pcParameter );

+	}

+	else

+	{

+		sprintf( pcWriteBuffer, "Error" );

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTESTFSCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+unsigned portBASE_TYPE uxOriginalPriority;

+

+	/* Avoid compiler warnings. */

+	( void ) xWriteBufferLen;

+	( void ) pcCommandString;

+

+	/* Limitations in the interaction with the Windows TCP/IP stack require

+	the command console to run at the idle priority.  Raise the priority for

+	the duration of the tests to ensure there are not multiple switches to the

+	idle task as in the simulated environment the idle task hook function may

+	include a (relatively) long delay. */

+	uxOriginalPriority = uxTaskPriorityGet( NULL );

+	vTaskPrioritySet( NULL, configMAX_PRIORITIES - 1 );

+

+	f_dotest( 0 );

+

+	/* Reset back to the original priority. */

+	vTaskPrioritySet( NULL, uxOriginalPriority );

+

+	sprintf( pcWriteBuffer, "%s", "Test results were sent to Windows console" );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+char *pcSourceFile;

+const char *pcDestinationFile;

+portBASE_TYPE xParameterStringLength;

+long lSourceLength, lDestinationLength = 0;

+

+	/* Obtain the name of the destination file. */

+	pcDestinationFile = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							2,						/* Return the second parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcDestinationFile );

+

+	/* Obtain the name of the source file. */

+	pcSourceFile = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									1,						/* Return the first parameter. */

+									&xParameterStringLength	/* Store the parameter string length. */

+								);

+

+	/* Sanity check something was returned. */

+	configASSERT( pcSourceFile );

+

+	/* Terminate the string. */

+	pcSourceFile[ xParameterStringLength ] = 0x00;

+

+	/* See if the source file exists, obtain its length if it does. */

+	lSourceLength = f_filelength( pcSourceFile );

+

+	if( lSourceLength == 0 )

+	{

+		sprintf( pcWriteBuffer, "Source file does not exist" );

+	}

+	else

+	{

+		/* See if the destination file exists. */

+		lDestinationLength = f_filelength( pcDestinationFile );

+

+		if( lDestinationLength != 0 )

+		{

+			sprintf( pcWriteBuffer, "Error: Destination file already exists" );

+		}

+	}

+

+	/* Continue only if the source file exists and the destination file does

+	not exist. */

+	if( ( lSourceLength != 0 ) && ( lDestinationLength == 0 ) )

+	{

+		if( prvPerformCopy( pcSourceFile, lSourceLength, pcDestinationFile, pcWriteBuffer, xWriteBufferLen ) == pdPASS )

+		{

+			sprintf( pcWriteBuffer, "Copy made" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Error during copy" );

+		}

+	}

+

+	strcat( pcWriteBuffer, cliNEW_LINE );

+

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvPerformCopy( const char *pcSourceFile,

+									int32_t lSourceFileLength,

+									const char *pcDestinationFile,

+									char *pxWriteBuffer,

+									size_t xWriteBufferLen )

+{

+int32_t lBytesRead = 0, lBytesToRead, lBytesRemaining;

+F_FILE *pxFile;

+portBASE_TYPE xReturn = pdPASS;

+

+	/* NOTE:  Error handling has been omitted for clarity. */

+

+	while( lBytesRead < lSourceFileLength )

+	{

+		/* How many bytes are left? */

+		lBytesRemaining = lSourceFileLength - lBytesRead;

+

+		/* How many bytes should be read this time around the loop.  Can't

+		read more bytes than will fit into the buffer. */

+		if( lBytesRemaining > ( long ) xWriteBufferLen )

+		{

+			lBytesToRead = ( long ) xWriteBufferLen;

+		}

+		else

+		{

+			lBytesToRead = lBytesRemaining;

+		}

+

+		/* Open the source file, seek past the data that has already been

+		read from the file, read the next block of data, then close the

+		file again so the destination file can be opened. */

+		pxFile = f_open( pcSourceFile, "r" );

+		if( pxFile != NULL )

+		{

+			f_seek( pxFile, lBytesRead, F_SEEK_SET );

+			f_read( pxWriteBuffer, lBytesToRead, 1, pxFile );

+			f_close( pxFile );

+		}

+		else

+		{

+			xReturn = pdFAIL;

+			break;

+		}

+

+		/* Open the destination file and write the block of data to the end of

+		the file. */

+		pxFile = f_open( pcDestinationFile, "a" );

+		if( pxFile != NULL )

+		{

+			f_write( pxWriteBuffer, lBytesToRead, 1, pxFile );

+			f_close( pxFile );

+		}

+		else

+		{

+			xReturn = pdFAIL;

+			break;

+		}

+

+		lBytesRead += lBytesToRead;

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreateFileInfoString( char *pcBuffer, F_FIND *pxFindStruct )

+{

+const char *pcWritableFile = "writable file", *pcReadOnlyFile = "read only file", *pcDirectory = "directory";

+const char * pcAttrib;

+

+	/* Point pcAttrib to a string that describes the file. */

+	if( ( pxFindStruct->attr & F_ATTR_DIR ) != 0 )

+	{

+		pcAttrib = pcDirectory;

+	}

+	else if( pxFindStruct->attr & F_ATTR_READONLY )

+	{

+		pcAttrib = pcReadOnlyFile;

+	}

+	else

+	{

+		pcAttrib = pcWritableFile;

+	}

+

+	/* Create a string that includes the file name, the file size and the

+	attributes string. */

+	sprintf( pcBuffer, "%s [%s] [size=%d]", pxFindStruct->filename, pcAttrib, pxFindStruct->filesize );

+}

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/File-system-demo.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/File-system-demo.c
new file mode 100644
index 0000000..94767c5
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/File-system-demo.c
@@ -0,0 +1,372 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*******************************************************************************

+ * See the URL in the comments within main.c for the location of the online

+ * documentation.

+ ******************************************************************************/

+

+/* Standard includes. */

+#include <stdio.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+

+/* File system includes. */

+#include "fat_sl.h"

+#include "api_mdriver_ram.h"

+

+/* 8.3 format, plus null terminator. */

+#define fsMAX_FILE_NAME_LEN				13

+

+/* The number of bytes read/written to the example files at a time. */

+#define fsRAM_BUFFER_SIZE 				200

+

+/* The number of bytes written to the file that uses f_putc() and f_getc(). */

+#define fsPUTC_FILE_SIZE				100

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Creates and verifies different files on the volume, demonstrating the use of

+ * various different API functions.

+ */

+void vCreateAndVerifySampleFiles( void );

+

+/*

+ * Create a set of example files in the root directory of the volume using

+ * f_write().

+ */

+static void prvCreateDemoFilesUsing_f_write( void );

+

+/*

+ * Use f_read() to read back and verify the files that were created by

+ * prvCreateDemoFilesUsing_f_write().

+ */

+static void prvVerifyDemoFileUsing_f_read( void );

+

+/*

+ * Create an example file in a sub-directory using f_putc().

+ */

+static void prvCreateDemoFileUsing_f_putc( void );

+

+/*

+ * Use f_getc() to read back and verify the file that was created by

+ * prvCreateDemoFileUsing_f_putc().

+ */

+static void prvVerifyDemoFileUsing_f_getc( void );

+

+/*-----------------------------------------------------------*/

+

+/* A buffer used to both create content to write to disk, and read content back

+from a disk.  Note there is no mutual exclusion on this buffer. */

+static char cRAMBuffer[ fsRAM_BUFFER_SIZE ];

+

+/* Names of directories that are created. */

+static const char *pcRoot = "/", *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2";

+

+/*-----------------------------------------------------------*/

+

+void vCreateAndVerifySampleFiles( void )

+{

+unsigned char ucStatus;

+

+	/* First create the volume. */

+	ucStatus = f_initvolume( ram_initfunc );

+

+	/* It is expected that the volume is not formatted. */

+	if( ucStatus == F_ERR_NOTFORMATTED )

+	{

+		/* Format the created volume. */

+		ucStatus = f_format( F_FAT12_MEDIA );

+	}

+

+	if( ucStatus == F_NO_ERROR )

+	{

+		/* Create a set of files using f_write(). */

+		prvCreateDemoFilesUsing_f_write();

+

+		/* Read back and verify the files that were created using f_write(). */

+		prvVerifyDemoFileUsing_f_read();

+

+		/* Create sub directories two deep then create a file using putc. */

+		prvCreateDemoFileUsing_f_putc();

+

+		/* Read back and verify the file created by

+		prvCreateDemoFileUsing_f_putc(). */

+		prvVerifyDemoFileUsing_f_getc();

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreateDemoFilesUsing_f_write( void )

+{

+portBASE_TYPE xFileNumber, xWriteNumber;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+const portBASE_TYPE xMaxFiles = 5;

+long lItemsWritten;

+F_FILE *pxFile;

+

+	/* Create xMaxFiles files.  Each created file will be

+	( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled

+	with a different repeating character. */

+	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )

+	{

+		/* Generate a file name. */

+		sprintf( cFileName, "root%03d.txt", xFileNumber );

+

+		/* Obtain the current working directory and print out the file name and

+		the	directory into which the file is being written. */

+		f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+		printf( "Creating file %s in %s\r\n", cFileName, cRAMBuffer );

+

+		/* Open the file, creating the file if it does not already exist. */

+		pxFile = f_open( cFileName, "w" );

+		configASSERT( pxFile );

+

+		/* Fill the RAM buffer with data that will be written to the file.  This

+		is just a repeating ascii character that indicates the file number. */

+		memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );

+

+		/* Write the RAM buffer to the opened file a number of times.  The

+		number of times the RAM buffer is written to the file depends on the

+		file number, so the length of each created file will be different. */

+		for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )

+		{

+			lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );

+			configASSERT( lItemsWritten == 1 );

+		}

+

+		/* Close the file so another file can be created. */

+		f_close( pxFile );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvVerifyDemoFileUsing_f_read( void )

+{

+portBASE_TYPE xFileNumber, xReadNumber;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+const portBASE_TYPE xMaxFiles = 5;

+long lItemsRead, lChar;

+F_FILE *pxFile;

+

+	/* Read back the files that were created by

+	prvCreateDemoFilesUsing_f_write(). */

+	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )

+	{

+		/* Generate the file name. */

+		sprintf( cFileName, "root%03d.txt", xFileNumber );

+

+		/* Obtain the current working directory and print out the file name and

+		the	directory from which the file is being read. */

+		f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+		printf( "Reading file %s from %s\r\n", cFileName, cRAMBuffer );

+

+		/* Open the file for reading. */

+		pxFile = f_open( cFileName, "r" );

+		configASSERT( pxFile );

+

+		/* Read the file into the RAM buffer, checking the file contents are as

+		expected.  The size of the file depends on the file number. */

+		for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )

+		{

+			/* Start with the RAM buffer clear. */

+			memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );

+

+			lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );

+			configASSERT( lItemsRead == 1 );

+

+			/* Check the RAM buffer is filled with the expected data.  Each

+			file contains a different repeating ascii character that indicates

+			the number of the file. */

+			for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ )

+			{

+				configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) );

+			}

+		}

+

+		/* Close the file. */

+		f_close( pxFile );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreateDemoFileUsing_f_putc( void )

+{

+unsigned char ucReturn;

+int iByte, iReturned;

+F_FILE *pxFile;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	printf( "In directory %s\r\n", cRAMBuffer );

+

+	/* Create a sub directory. */

+	ucReturn = f_mkdir( pcDirectory1 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Move into the created sub-directory. */

+	ucReturn = f_chdir( pcDirectory1 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	printf( "In directory %s\r\n", cRAMBuffer );

+

+	/* Create a subdirectory in the new directory. */

+	ucReturn = f_mkdir( pcDirectory2 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Move into the directory just created - now two directories down from

+	the root. */

+	ucReturn = f_chdir( pcDirectory2 );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	printf( "In directory %s\r\n", cRAMBuffer );

+	configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );

+

+	/* Generate the file name. */

+	sprintf( cFileName, "%s.txt", pcDirectory2 );

+

+	/* Print out the file name and the directory into which the file is being

+	written. */

+	printf( "Writing file %s in %s\r\n", cFileName, cRAMBuffer );

+

+	pxFile = f_open( cFileName, "w" );

+

+	/* Create a file 1 byte at a time.  The file is filled with incrementing

+	ascii characters starting from '0'. */

+	for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )

+	{

+		iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile );

+		configASSERT( iReturned ==  ( ( int ) '0' + iByte ) );

+	}

+

+	/* Finished so close the file. */

+	f_close( pxFile );

+

+	/* Move back to the root directory. */

+	ucReturn = f_chdir( "../.." );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	printf( "Back in root directory %s\r\n", cRAMBuffer );

+	configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 );

+}

+/*-----------------------------------------------------------*/

+

+static void prvVerifyDemoFileUsing_f_getc( void )

+{

+unsigned char ucReturn;

+int iByte, iReturned;

+F_FILE *pxFile;

+char cFileName[ fsMAX_FILE_NAME_LEN ];

+

+	/* Move into the directory in which the file was created. */

+	ucReturn = f_chdir( pcFullPath );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	printf( "Back in directory %s\r\n", cRAMBuffer );

+	configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );

+

+	/* Generate the file name. */

+	sprintf( cFileName, "%s.txt", pcDirectory2 );

+

+	/* Print out the file name and the directory from which the file is being

+	read. */

+	printf( "Reading file %s in %s\r\n", cFileName, cRAMBuffer );

+

+	/* This time the file is opened for reading. */

+	pxFile = f_open( cFileName, "r" );

+

+	/* Read the file 1 byte at a time. */

+	for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )

+	{

+		iReturned = f_getc( pxFile );

+		configASSERT( iReturned ==  ( ( int ) '0' + iByte ) );

+	}

+

+	/* Finished so close the file. */

+	f_close( pxFile );

+

+	/* Move back to the root directory. */

+	ucReturn = f_chdir( "../.." );

+	configASSERT( ucReturn == F_NO_ERROR );

+

+	/* Obtain and print out the working directory. */

+	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );

+	printf( "Back in root directory %s\r\n", cRAMBuffer );

+}

+

+

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/FreeRTOS_Plus_FAT_SL_with_CLI.sln b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/FreeRTOS_Plus_FAT_SL_with_CLI.sln
new file mode 100644
index 0000000..3f819af
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/FreeRTOS_Plus_FAT_SL_with_CLI.sln
@@ -0,0 +1,20 @@
+

+Microsoft Visual Studio Solution File, Format Version 11.00

+# Visual C++ Express 2010

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WIN32", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}"

+EndProject

+Global

+	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+		Debug|Win32 = Debug|Win32

+		Release|Win32 = Release|Win32

+	EndGlobalSection

+	GlobalSection(ProjectConfigurationPlatforms) = postSolution

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32

+		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32

+	EndGlobalSection

+	GlobalSection(SolutionProperties) = preSolution

+		HideSolutionNode = FALSE

+	EndGlobalSection

+EndGlobal

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/READ_ME.url b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/READ_ME.url
new file mode 100644
index 0000000..9c6b614
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/READ_ME.url
@@ -0,0 +1,5 @@
+[InternetShortcut]

+URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT_SL/Demos/File_System_Win32_Simulator_demo.shtml

+IDList=

+[{000214A0-0000-0000-C000-000000000046}]

+Prop3=19,2

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/Run-time-stats-utils.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/Run-time-stats-utils.c
new file mode 100644
index 0000000..1d81470
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/Run-time-stats-utils.c
@@ -0,0 +1,128 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*

+ * Utility functions required to gather run time statistics.  See:

+ * http://www.freertos.org/rtos-run-time-stats.html

+ *

+ * Note that this is a simulated port, where simulated time is a lot slower than

+ * real time, therefore the run time counter values have no real meaningful

+ * units.

+ *

+ * Also note that it is assumed this demo is going to be used for short periods

+ * of time only, and therefore timer overflows are not handled.

+*/

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+

+/* Variables used in the creation of the run time stats time base.  Run time 

+stats record how much time each task spends in the Running state. */

+static long long llInitialRunTimeCounterValue = 0LL, llTicksPerHundedthMillisecond = 0LL;

+

+/*-----------------------------------------------------------*/

+

+void vConfigureTimerForRunTimeStats( void )

+{

+LARGE_INTEGER liPerformanceCounterFrequency, liInitialRunTimeValue;

+

+	/* Initialise the variables used to create the run time stats time base.

+	Run time stats record how much time each task spends in the Running 

+	state. */

+

+	if( QueryPerformanceFrequency( &liPerformanceCounterFrequency ) == 0 )

+	{

+		llTicksPerHundedthMillisecond = 1;

+	}

+	else

+	{

+		/* How many times does the performance counter increment in 1/100th

+		millisecond. */

+		llTicksPerHundedthMillisecond = liPerformanceCounterFrequency.QuadPart / 100000LL;

+

+		/* What is the performance counter value now, this will be subtracted

+		from readings taken at run time. */

+		QueryPerformanceCounter( &liInitialRunTimeValue );

+		llInitialRunTimeCounterValue = liInitialRunTimeValue.QuadPart;

+	}

+}

+/*-----------------------------------------------------------*/

+

+unsigned long ulGetRunTimeCounterValue( void )

+{

+LARGE_INTEGER liCurrentCount;

+unsigned long ulReturn;

+

+	/* What is the performance counter value now? */

+	QueryPerformanceCounter( &liCurrentCount );

+

+	/* Subtract the performance counter value reading taken when the 

+	application started to get a count from that reference point, then

+	scale to (simulated) 1/100ths of a millisecond. */

+	ulReturn = ( unsigned long ) ( ( liCurrentCount.QuadPart - llInitialRunTimeCounterValue ) / llTicksPerHundedthMillisecond );

+

+	return ulReturn;

+}

+/*-----------------------------------------------------------*/

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/Sample-CLI-commands.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/Sample-CLI-commands.c
new file mode 100644
index 0000000..6d45976
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/Sample-CLI-commands.c
@@ -0,0 +1,417 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+ /******************************************************************************

+ *

+ * See the following URL for information on the commands defined in this file:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml

+ *

+ ******************************************************************************/

+

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+#ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS

+	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0

+#endif

+

+

+/*

+ * Implements the run-time-stats command.

+ */

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the task-stats command.

+ */

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-three-parameters command.

+ */

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-parameters command.

+ */

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the "trace start" and "trace stop" commands;

+ */

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+#endif

+

+/* Structure that defines the "run-time-stats" command line command.   This

+generates a table that shows how much run time each task has */

+static const CLI_Command_Definition_t xRunTimeStats =

+{

+	"run-time-stats", /* The command string to type. */

+	"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n",

+	prvRunTimeStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "task-stats" command line command.  This generates

+a table that gives information on each task in the system. */

+static const CLI_Command_Definition_t xTaskStats =

+{

+	"task-stats", /* The command string to type. */

+	"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n",

+	prvTaskStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "echo_3_parameters" command line command.  This

+takes exactly three parameters that the command simply echos back one at a

+time. */

+static const CLI_Command_Definition_t xThreeParameterEcho =

+{

+	"echo-3-parameters",

+	"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n",

+	prvThreeParameterEchoCommand, /* The function to run. */

+	3 /* Three parameters are expected, which can take any value. */

+};

+

+/* Structure that defines the "echo_parameters" command line command.  This

+takes a variable number of parameters that the command simply echos back one at

+a time. */

+static const CLI_Command_Definition_t xParameterEcho =

+{

+	"echo-parameters",

+	"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n",

+	prvParameterEchoCommand, /* The function to run. */

+	-1 /* The user can enter any number of commands. */

+};

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	/* Structure that defines the "trace" command line command.  This takes a single

+	parameter, which can be either "start" or "stop". */

+	static const CLI_Command_Definition_t xStartStopTrace =

+	{

+		"trace",

+		"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n",

+		prvStartStopTraceCommand, /* The function to run. */

+		1 /* One parameter is expected.  Valid values are "start" and "stop". */

+	};

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

+

+/*-----------------------------------------------------------*/

+

+void vRegisterSampleCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xTaskStats );

+	FreeRTOS_CLIRegisterCommand( &xRunTimeStats );

+	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xParameterEcho );

+

+	#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )

+	{

+		FreeRTOS_CLIRegisterCommand( & xStartStopTrace );

+	}

+	#endif

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskList( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The three parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Return the parameter string. */

+		memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+		sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+		strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+		/* If this is the last of the three parameters then there are no more

+		strings to return after this one. */

+		if( lParameterNumber == 3L )

+		{

+			/* If this is the last of the three parameters then there are no more

+			strings to return after this one. */

+			xReturn = pdFALSE;

+			lParameterNumber = 0L;

+		}

+		else

+		{

+			/* There are more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		if( pcParameter != NULL )

+		{

+			/* Return the parameter string. */

+			memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+			sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+			strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+			/* There might be more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+		else

+		{

+			/* No more parameters were found.  Make sure the write buffer does

+			not contain a valid string. */

+			pcWriteBuffer[ 0 ] = 0x00;

+

+			/* No more data to return. */

+			xReturn = pdFALSE;

+

+			/* Start over the next time this command is executed. */

+			lParameterNumber = 0;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	const char *pcParameter;

+	portBASE_TYPE lParameterStringLength;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							1,						/* Return the first parameter. */

+							&lParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* There are only two valid parameter values. */

+		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )

+		{

+			/* Start or restart the trace. */

+			vTraceStop();

+			vTraceClear();

+			vTraceStart();

+

+			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );

+		}

+		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )

+		{

+			/* End the trace, if one is running. */

+			vTraceStop();

+			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );

+		}

+

+		/* There is no more data to return after this single string, so return

+		pdFALSE. */

+		return pdFALSE;

+	}

+

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/UDPCommandServer.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/UDPCommandServer.c
new file mode 100644
index 0000000..8a25339
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/UDPCommandServer.c
@@ -0,0 +1,267 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+

+#pragma comment( lib, "ws2_32.lib" )

+

+/* Win32 includes. */

+#include <WinSock2.h>

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* Dimensions the buffer into which input characters are placed. */

+#define cmdMAX_INPUT_SIZE	60

+

+/* Dimensions the buffer into which string outputs can be placed. */

+#define cmdMAX_OUTPUT_SIZE	1024

+

+/* Dimensions the buffer passed to the recvfrom() call. */

+#define cmdSOCKET_INPUT_BUFFER_SIZE 60

+

+/* DEL acts as a backspace. */

+#define cmdASCII_DEL		( 0x7F )

+

+/*

+ * Open and configure the UDP socket.

+ */

+static SOCKET prvOpenUDPSocket( void );

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Task that provides the input and output for the FreeRTOS+CLI command

+ * interpreter.  In this case a WinSock UDP port is used for convenience as this

+ * demo runs in a simulated environment on a Windows PC.  See the URL in the

+ * comments within main.c for the location of the online documentation.

+ */

+void vUDPCommandInterpreterTask( void *pvParameters )

+{

+long lBytes, lByte;

+signed char cInChar, cInputIndex = 0;

+static signed char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ];

+portBASE_TYPE xMoreDataToFollow;

+volatile int iErrorCode = 0;

+struct sockaddr_in xClient;

+int xClientAddressLength = sizeof( struct sockaddr_in );

+SOCKET xSocket;

+

+	/* Just to prevent compiler warnings. */

+	( void ) pvParameters;

+

+	/* Attempt to open the socket. */

+	xSocket = prvOpenUDPSocket();

+

+	if( xSocket != INVALID_SOCKET )

+	{

+		for( ;; )

+		{

+			/* Wait for incoming data on the opened socket. */

+			lBytes = recvfrom( xSocket, cLocalBuffer, sizeof( cLocalBuffer ), 0, ( struct sockaddr * ) &xClient, &xClientAddressLength );

+

+			if( lBytes == SOCKET_ERROR )

+			{

+				/* Something went wrong, but it is not handled by this simple

+				example. */

+				iErrorCode = WSAGetLastError();

+			}

+			else

+			{

+				/* Process each received byte in turn. */

+				lByte = 0;

+				while( lByte < lBytes )

+				{

+					/* The next character in the input buffer. */

+					cInChar = cLocalBuffer[ lByte ];

+					lByte++;

+

+					/* Newline characters are taken as the end of the command

+					string. */

+					if( cInChar == '\n' )

+					{

+						/* Process the input string received prior to the

+						newline. */

+						do

+						{

+							/* Pass the string to FreeRTOS+CLI. */

+							xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE );

+

+							/* Send the output generated by the command's

+							implementation. */

+							sendto( xSocket, cOutputString,  strlen( cOutputString ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength );

+

+						} while( xMoreDataToFollow != pdFALSE ); /* Until the command does not generate any more output. */

+

+						/* All the strings generated by the command processing

+						have been sent.  Clear the input string ready to receive

+						the next command. */

+						cInputIndex = 0;

+						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );

+

+						/* Transmit a spacer, just to make the command console

+						easier to read. */

+						sendto( xSocket, "\r\n",  strlen( "\r\n" ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength );

+					}

+					else

+					{

+						if( cInChar == '\r' )

+						{

+							/* Ignore the character.  Newlines are used to

+							detect the end of the input string. */

+						}

+						else if( ( cInChar == '\b' ) || ( cInChar == cmdASCII_DEL ) )

+						{

+							/* Backspace was pressed.  Erase the last character

+							in the string - if any. */

+							if( cInputIndex > 0 )

+							{

+								cInputIndex--;

+								cInputString[ cInputIndex ] = '\0';

+							}

+						}

+						else

+						{

+							/* A character was entered.  Add it to the string

+							entered so far.  When a \n is entered the complete

+							string will be passed to the command interpreter. */

+							if( cInputIndex < cmdMAX_INPUT_SIZE )

+							{

+								cInputString[ cInputIndex ] = cInChar;

+								cInputIndex++;

+							}

+						}

+					}

+				}

+			}

+		}

+	}

+	else

+	{

+		/* The socket could not be opened. */

+		vTaskDelete( NULL );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static SOCKET prvOpenUDPSocket( void )

+{

+WSADATA xWSAData;

+WORD wVersionRequested;

+struct sockaddr_in xServer;

+SOCKET xSocket = INVALID_SOCKET;

+

+	wVersionRequested = MAKEWORD( 2, 2 );

+

+	/* Prepare to use WinSock. */

+	if( WSAStartup( wVersionRequested, &xWSAData ) != 0 )

+	{

+		fprintf( stderr, "Could not open Windows connection.\n" );

+	}

+	else

+	{

+		xSocket = socket( AF_INET, SOCK_DGRAM, 0 );

+		if( xSocket == INVALID_SOCKET)

+		{

+			fprintf( stderr, "Could not create socket.\n" );

+			WSACleanup();

+		}

+		else

+		{

+			/* Zero out the server structure. */

+			memset( ( void * ) &xServer, 0x00, sizeof( struct sockaddr_in ) );

+

+			/* Set family and port. */

+			xServer.sin_family = AF_INET;

+			xServer.sin_port = htons( configUDP_CLI_PORT_NUMBER );

+

+			/* Assign the loopback address */

+			xServer.sin_addr.S_un.S_un_b.s_b1 = 127;

+			xServer.sin_addr.S_un.S_un_b.s_b2 = 0;

+			xServer.sin_addr.S_un.S_un_b.s_b3 = 0;

+			xServer.sin_addr.S_un.S_un_b.s_b4 = 1;

+

+			/* Bind the address to the socket. */

+			if( bind( xSocket, ( struct sockaddr * ) &xServer, sizeof( struct sockaddr_in ) ) == -1 )

+			{

+				fprintf( stderr, "Could not socket to port %d.\n", configUDP_CLI_PORT_NUMBER );

+				closesocket( xSocket );

+				xSocket = INVALID_SOCKET;

+				WSACleanup();

+			}

+		}

+	}

+

+	return xSocket;

+}

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj
new file mode 100644
index 0000000..6257eb7
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{C686325E-3261-42F7-AEB1-DDE5280E1CEB}</ProjectGuid>

+    <ProjectName>RTOSDemo</ProjectName>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseOfMfc>false</UseOfMfc>

+    <CharacterSet>MultiByte</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseOfMfc>false</UseOfMfc>

+    <CharacterSet>MultiByte</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>

+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>

+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>

+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>

+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>

+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>

+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>

+  </PropertyGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Midl>

+      <TypeLibraryName>.\Debug/WIN32.tlb</TypeLibraryName>

+      <HeaderFileName>

+      </HeaderFileName>

+    </Midl>

+    <ClCompile>

+      <Optimization>Disabled</Optimization>

+      <AdditionalIncludeDirectories>..\..\..\FreeRTOS\Source\include;..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\Source\FreeRTOS-Plus-CLI;.;.\..\..\Source\FreeRTOS-Plus-FAT-SL\api;.\..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\test;.\ConfigurationFiles;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <MinimalRebuild>true</MinimalRebuild>

+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+      <PrecompiledHeaderOutputFile>.\Debug/WIN32.pch</PrecompiledHeaderOutputFile>

+      <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>

+      <ObjectFileName>.\Debug/</ObjectFileName>

+      <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>

+      <WarningLevel>Level4</WarningLevel>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <DisableLanguageExtensions>false</DisableLanguageExtensions>

+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Culture>0x0c09</Culture>

+    </ResourceCompile>

+    <Link>

+      <OutputFile>.\Debug/RTOSDemo.exe</OutputFile>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+      <ProgramDatabaseFile>.\Debug/WIN32.pdb</ProgramDatabaseFile>

+      <SubSystem>Console</SubSystem>

+      <TargetMachine>MachineX86</TargetMachine>

+      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>

+      <AdditionalLibraryDirectories>.\WinPCap</AdditionalLibraryDirectories>

+    </Link>

+    <Bscmake>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <OutputFile>.\Debug/WIN32.bsc</OutputFile>

+    </Bscmake>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Midl>

+      <TypeLibraryName>.\Release/WIN32.tlb</TypeLibraryName>

+      <HeaderFileName>

+      </HeaderFileName>

+    </Midl>

+    <ClCompile>

+      <Optimization>MaxSpeed</Optimization>

+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>

+      <PreprocessorDefinitions>_WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <StringPooling>true</StringPooling>

+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <PrecompiledHeaderOutputFile>.\Release/WIN32.pch</PrecompiledHeaderOutputFile>

+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>

+      <ObjectFileName>.\Release/</ObjectFileName>

+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>

+      <WarningLevel>Level3</WarningLevel>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <AdditionalIncludeDirectories>..\Common\Utils;..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap;..\Common\ethernet\lwip-1.4.0\src\include\ipv4;..\Common\ethernet\lwip-1.4.0\src\include;..\..\Source\include;..\..\Source\portable\MSVC-MingW;..\Common\ethernet\lwip-1.4.0\ports\win32\include;..\Common\Include;.\lwIP_Apps;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Culture>0x0c09</Culture>

+    </ResourceCompile>

+    <Link>

+      <OutputFile>.\Release/RTOSDemo.exe</OutputFile>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <ProgramDatabaseFile>.\Release/WIN32.pdb</ProgramDatabaseFile>

+      <SubSystem>Console</SubSystem>

+      <TargetMachine>MachineX86</TargetMachine>

+      <AdditionalLibraryDirectories>..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap</AdditionalLibraryDirectories>

+      <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+    <Bscmake>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <OutputFile>.\Release/WIN32.bsc</OutputFile>

+    </Bscmake>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_4.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\list.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c" />

+    <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\f_lock.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\test\test.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\psp\target\fat_sl\psp_test.c" />

+    <ClCompile Include="File-Releated-CLI-commands.c" />

+    <ClCompile Include="File-system-demo.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\dir.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\drv.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\fat.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\file.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util_sfn.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\volume.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\media-drv\ram\ramdrv_f.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\psp\target\rtc\psp_rtc.c" />

+    <ClCompile Include="main.c">

+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <ClCompile Include="Run-time-stats-utils.c" />

+    <ClCompile Include="Sample-CLI-commands.c" />

+    <ClCompile Include="UDPCommandServer.c" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\FreeRTOS.h" />

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\projdefs.h" />

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\queue.h" />

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\semphr.h" />

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\task.h" />

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\timers.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\api\fat_sl.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\f_lock.h" />

+    <ClInclude Include="ConfigurationFiles\config_fat_sl.h" />

+    <ClInclude Include="ConfigurationFiles\config_fat_sl_test.h" />

+    <ClInclude Include="FreeRTOSConfig.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\dir.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\drv.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\fat.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\file.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util_sfn.h" />

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\volume.h" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj.filters b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj.filters
new file mode 100644
index 0000000..72966a4
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj.filters
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{38712199-cebf-4124-bf15-398f7c3419ea}</UniqueIdentifier>

+      <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS">

+      <UniqueIdentifier>{af3445a1-4908-4170-89ed-39345d90d30c}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS\Source">

+      <UniqueIdentifier>{f32be356-4763-4cae-9020-974a2638cb08}</UniqueIdentifier>

+      <Extensions>*.c</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS\Source\Portable">

+      <UniqueIdentifier>{88f409e6-d396-4ac5-94bd-7a99c914be46}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+">

+      <UniqueIdentifier>{e5ad4ec7-23dc-4295-8add-2acaee488f5a}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+CLI">

+      <UniqueIdentifier>{fd43c0ed-fdbc-437f-a5a3-c50399690bd7}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+CLI\include">

+      <UniqueIdentifier>{c5889fe2-af0f-4cea-927f-6a6935ec5e14}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL">

+      <UniqueIdentifier>{d261611a-5416-4455-bb33-3bd84381ea40}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL\Media_Driver">

+      <UniqueIdentifier>{17c1a794-a4a6-4358-850f-2a88bfe3bd33}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL\psp">

+      <UniqueIdentifier>{fb7ccc1d-c4ad-475a-98d9-2e8ae2301c99}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL\psp\target">

+      <UniqueIdentifier>{34bb4a98-fb88-41fc-81f2-4e3f1c50c528}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL\psp\target\rtc">

+      <UniqueIdentifier>{286bf65c-93cd-4480-8363-0fb2c2bc7ce1}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Configuration Files">

+      <UniqueIdentifier>{19ff1a34-36de-4c48-9d10-3fb1fa0d1fa4}</UniqueIdentifier>

+      <Extensions>h;hpp;hxx;hm;inl</Extensions>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL\tests">

+      <UniqueIdentifier>{e4105d81-802a-4210-b40b-d5dd3cf6e643}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS\Source\include">

+      <UniqueIdentifier>{ab23827c-126c-4e5a-bc99-8efa44d8a8bd}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="FreeRTOS+\FreeRTOS+FAT SL\api">

+      <UniqueIdentifier>{9e1c9cf5-c2c7-4f8d-b09d-0b7f329eac57}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c">

+      <Filter>FreeRTOS\Source\Portable</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\list.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c">

+      <Filter>FreeRTOS\Source</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_4.c">

+      <Filter>FreeRTOS\Source\Portable</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c">

+      <Filter>FreeRTOS+\FreeRTOS+CLI</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\media-drv\ram\ramdrv_f.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL\Media_Driver</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\psp\target\rtc\psp_rtc.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL\psp\target\rtc</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\dir.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\drv.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\fat.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\file.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util_sfn.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\volume.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="UDPCommandServer.c" />

+    <ClCompile Include="File-Releated-CLI-commands.c" />

+    <ClCompile Include="File-system-demo.c" />

+    <ClCompile Include="main.c" />

+    <ClCompile Include="Run-time-stats-utils.c" />

+    <ClCompile Include="Sample-CLI-commands.c" />

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\psp\target\fat_sl\psp_test.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\test\test.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL\tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\f_lock.c">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="FreeRTOSConfig.h">

+      <Filter>Configuration Files</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.h">

+      <Filter>FreeRTOS+\FreeRTOS+CLI\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\volume.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\dir.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\drv.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\fat.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\file.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\util_sfn.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="ConfigurationFiles\config_fat_sl.h">

+      <Filter>Configuration Files</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\timers.h">

+      <Filter>FreeRTOS\Source\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\FreeRTOS.h">

+      <Filter>FreeRTOS\Source\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\projdefs.h">

+      <Filter>FreeRTOS\Source\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\queue.h">

+      <Filter>FreeRTOS\Source\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\semphr.h">

+      <Filter>FreeRTOS\Source\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\..\FreeRTOS\Source\include\task.h">

+      <Filter>FreeRTOS\Source\include</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\api\fat_sl.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL\api</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\Source\FreeRTOS-Plus-FAT-SL\fat_sl\common\f_lock.h">

+      <Filter>FreeRTOS+\FreeRTOS+FAT SL</Filter>

+    </ClInclude>

+    <ClInclude Include="ConfigurationFiles\config_fat_sl_test.h">

+      <Filter>Configuration Files</Filter>

+    </ClInclude>

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj.user b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj.user
new file mode 100644
index 0000000..695b5c7
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/WIN32.vcxproj.user
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+</Project>
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/main.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/main.c
new file mode 100644
index 0000000..ee7340f
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator/main.c
@@ -0,0 +1,228 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/******************************************************************************

+ *

+ * This demo is described on the following web page:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT_SL/Demos/File_System_Win32_Simulator_demo.shtml

+ *

+ ******************************************************************************/

+

+/* Standard includes. */

+#include <stdio.h>

+#include <stdint.h>

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+#include "task.h"

+#include "queue.h"

+#include "semphr.h"

+

+/* File system includes. */

+#include "config_fat_sl.h"

+

+/* Priorities at which the tasks are created. */

+#define mainUDP_CLI_TASK_PRIORITY			( tskIDLE_PRIORITY )

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Register the generic commands that can be used with FreeRTOS+CLI.

+ */

+extern void vRegisterSampleCLICommands( void );

+

+/*

+ * Register the file system commands that can be used with FreeRTOS+CLI.

+ */

+extern void vRegisterFileSystemCLICommands( void );

+

+/*

+ * The task that implements the UDP command interpreter using FreeRTOS+CLI.

+ */

+extern void vUDPCommandInterpreterTask( void *pvParameters );

+

+/*

+ * Creates and verifies different files on the volume, demonstrating the use of

+ * various different API functions.

+ */

+extern void vCreateAndVerifySampleFiles( void );

+

+/*-----------------------------------------------------------*/

+

+/******************************************************************************

+ *

+ * This demo is described on the following web page:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT_SL/Demos/File_System_Win32_Simulator_demo.shtml

+ *

+ ******************************************************************************/

+

+int main( void )

+{

+const uint32_t ulLongTime_ms = 250UL;

+

+	/* If the file system is only going to be accessed from one task then

+	F_FS_THREAD_AWARE can be set to 0 and the set of example files are created

+	before the RTOS scheduler is started.  If the file system is going to be

+	access from more than one task then F_FS_THREAD_AWARE must be set to 1 and

+	the	set of sample files are created from the idle task hook function

+	vApplicationIdleHook() - which is defined in this file. */

+	#if F_FS_THREAD_AWARE == 0

+	{

+		/* Initialise the drive and file system, then create a few example

+		files.  The output from this function just goes to the stdout window,

+		allowing the output to be viewed when the UDP command console is not

+		connected. */

+		vCreateAndVerifySampleFiles();

+	}

+	#endif

+

+	/* Register generic commands with the FreeRTOS+CLI command interpreter. */

+	vRegisterSampleCLICommands();

+

+	/* Register file system related commands with the FreeRTOS+CLI command

+	interpreter. */

+	vRegisterFileSystemCLICommands();

+

+	/* Create the task that handles the CLI on a UDP port.  The port number

+	is set using the configUDP_CLI_PORT_NUMBER setting in FreeRTOSConfig.h. */

+	xTaskCreate( vUDPCommandInterpreterTask, 	/* The function that implements the command interpreter IO handling. */

+				"CLI", 							/* The name of the task - just to assist debugging. */

+				configMINIMAL_STACK_SIZE, NULL, /* The size of the stack allocated to the task. */

+				mainUDP_CLI_TASK_PRIORITY, 		/* The priority at which the task will run. */

+				NULL );							/* A handle to the task is not required, so NULL is passed. */

+

+	/* Start the RTOS scheduler. */

+	vTaskStartScheduler();

+

+	/* If all is well, the scheduler will now be running, and the following

+	line will never be reached.  If the following line does execute, then

+	there was insufficient FreeRTOS heap memory available for the idle and/or

+	timer tasks	to be created.  See the memory management section on the

+	FreeRTOS web site for more details (this is standard text that is not not

+	really applicable to the Win32 simulator port). */

+	for( ;; )

+	{

+		Sleep( ulLongTime_ms );

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vApplicationIdleHook( void )

+{

+const unsigned long ulMSToSleep = 5;

+

+	/* If the file system is only going to be accessed from one task then

+	F_FS_THREAD_AWARE can be set to 0 and the set of example files is created

+	before the RTOS scheduler is started.  If the file system is going to be

+	access from more than one task then F_FS_THREAD_AWARE must be set to 1 and

+	the	set of sample files are created from the idle task hook function. */

+	#if F_FS_THREAD_AWARE == 1

+	{

+		static portBASE_TYPE xCreatedSampleFiles = pdFALSE;

+

+		/* Initialise the drive and file system, then create a few example

+		files.  The output from this function just goes to the stdout window,

+		allowing the output to be viewed when the UDP command console is not

+		connected. */

+		if( xCreatedSampleFiles == pdFALSE )

+		{

+			vCreateAndVerifySampleFiles();

+			xCreatedSampleFiles = pdTRUE;

+		}

+	}

+	#endif

+

+	/* This function is called on each cycle of the idle task if

+	configUSE_IDLE_HOOK is set to 1 in FreeRTOSConfig.h.  Sleep to reduce CPU

+	load. */

+	Sleep( ulMSToSleep );

+}

+/*-----------------------------------------------------------*/

+

+void vAssertCalled( const char *pcFile, unsigned long ulLine )

+{

+	printf( "ASSERT FAILED: File %s, line %u\r\n", pcFile, ulLine );

+}

+/*-----------------------------------------------------------*/

+

+void vApplicationMallocFailedHook( void )

+{

+	/* vApplicationMallocFailedHook() will only be called if

+	configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h.  It is a hook

+	function that will get called if a call to pvPortMalloc() fails.

+	pvPortMalloc() is called internally by the kernel whenever a task, queue,

+	timer or semaphore is created.  It is also called by various parts of the

+	demo application.  If heap_1.c, heap_2.c or heap_4.c are used, then the

+	size of the heap available to pvPortMalloc() is defined by

+	configTOTAL_HEAP_SIZE in FreeRTOSConfig.h, and the xPortGetFreeHeapSize()

+	API function can be used to query the size of free heap space that remains

+	(although it does not provide information on how the remaining heap might

+	be fragmented). */

+	taskDISABLE_INTERRUPTS();

+	for( ;; );

+}

+

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_CLI_FAT_SL_SAM4E_Atmel_Studio/Read_Me_Instructions.url b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_CLI_FAT_SL_SAM4E_Atmel_Studio/Read_Me_Instructions.url
new file mode 100644
index 0000000..86d28f1
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_CLI_FAT_SL_SAM4E_Atmel_Studio/Read_Me_Instructions.url
@@ -0,0 +1,5 @@
+[InternetShortcut]

+URL=http://www.freertos.org/Atmel_SAM4E_RTOS_Demo.html

+IDList=

+[{000214A0-0000-0000-C000-000000000046}]

+Prop3=19,2

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.cproject b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.cproject
new file mode 100644
index 0000000..8107b25
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.cproject
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>

+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">

+	<storageModule moduleId="org.eclipse.cdt.core.settings">

+		<cconfiguration id="com.crt.advproject.config.exe.debug.56486929">

+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.56486929" moduleId="org.eclipse.cdt.core.settings" name="Debug">

+				<externalSettings/>

+				<extensions>

+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>

+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>

+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>

+					<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+				</extensions>

+			</storageModule>

+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">

+				<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.56486929" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;; # arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; ; checksum -p ${TargetChip} -d &quot;${BuildArtifactFileBaseName}.bin&quot;;  ">

+					<folderInfo id="com.crt.advproject.config.exe.debug.56486929." name="/" resourcePath="">

+						<toolChain id="com.crt.advproject.toolchain.exe.debug.1736903826" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug">

+							<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.358467611" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>

+							<builder buildPath="${workspace_loc:/FreeRTOS_UDP_Demo/Debug}" id="com.crt.advproject.builder.exe.debug.710857417" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug">

+								<outputEntries>

+									<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>

+									<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release"/>

+								</outputEntries>

+							</builder>

+							<tool id="com.crt.advproject.cpp.exe.debug.359174792" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug"/>

+							<tool id="com.crt.advproject.gcc.exe.debug.517029683" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug">

+								<option id="com.crt.advproject.gcc.arch.79720019" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/>

+								<option id="com.crt.advproject.gcc.thumb.1093240773" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/>

+								<option id="gnu.c.compiler.option.preprocessor.def.symbols.156210417" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">

+									<listOptionValue builtIn="false" value="__REDLIB__"/>

+									<listOptionValue builtIn="false" value="__USE_CMSIS"/>

+									<listOptionValue builtIn="false" value="DEBUG"/>

+									<listOptionValue builtIn="false" value="__CODE_RED"/>

+									<listOptionValue builtIn="false" value="CORE_M3"/>

+									<listOptionValue builtIn="false" value="__LPC18XX__"/>

+								</option>

+								<option id="gnu.c.compiler.option.misc.other.732935978" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -Wextra" valueType="string"/>

+								<option id="com.crt.advproject.gcc.hdrlib.1620518189" name="Use headers for C library" superClass="com.crt.advproject.gcc.hdrlib" value="com.crt.advproject.gcc.hdrlib.codered" valueType="enumerated"/>

+								<option id="gnu.c.compiler.option.include.paths.1643954527" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/ThirdParty/FreeRTOS_Plus_Trace_Recorder/include}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/ThirdParty/FreeRTOS_Plus_Trace_Recorder/Trace_Recorder_Configuration}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Plus_CLI}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Examples/include}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/ThirdParty/USB_CDC/include}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/ARM_CM3}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Plus_UDP/include}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Plus_UDP/portable/Compiler/GCC}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/inc}&quot;"/>

+								</option>

+								<inputType id="com.crt.advproject.compiler.input.927112517" superClass="com.crt.advproject.compiler.input"/>

+							</tool>

+							<tool id="com.crt.advproject.gas.exe.debug.281614531" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug">

+								<option id="com.crt.advproject.gas.arch.247575353" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/>

+								<option id="com.crt.advproject.gas.thumb.852781844" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>

+								<option id="gnu.both.asm.option.flags.crt.1159577990" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DDEBUG -D__CODE_RED" valueType="string"/>

+								<option id="com.crt.advproject.gas.hdrlib.1844219337" name="Use headers for C library" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.codered" valueType="enumerated"/>

+								<option id="gnu.both.asm.option.include.paths.1881892397" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>

+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1850237032" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>

+								<inputType id="com.crt.advproject.assembler.input.1243504913" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>

+							</tool>

+							<tool id="com.crt.advproject.link.cpp.exe.debug.1490011469" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug"/>

+							<tool id="com.crt.advproject.link.exe.debug.1212311005" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug">

+								<option id="com.crt.advproject.link.arch.1240101764" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/>

+								<option id="com.crt.advproject.link.thumb.570286733" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>

+								<option id="com.crt.advproject.link.script.1691634442" name="Linker script" superClass="com.crt.advproject.link.script" value="&quot;FreeRTOS_UDP_Demo_Debug.ld&quot;" valueType="string"/>

+								<option id="com.crt.advproject.link.manage.234522607" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>

+								<option id="gnu.c.link.option.nostdlibs.2023812520" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>

+								<option id="gnu.c.link.option.other.1608563250" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">

+									<listOptionValue builtIn="false" value="-Map=&quot;${BuildArtifactFileBaseName}.map&quot;"/>

+									<listOptionValue builtIn="false" value="--gc-sections"/>

+								</option>

+								<option id="com.crt.advproject.link.gcc.hdrlib.2006557555" name="Use C library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.nohost" valueType="enumerated"/>

+								<option id="gnu.c.link.option.nodeflibs.2072403274" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs" value="false" valueType="boolean"/>

+								<option id="com.crt.advproject.link.gcc.multicore.slave.1911982348" name="Multicore slave" superClass="com.crt.advproject.link.gcc.multicore.slave"/>

+								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1085761099" superClass="cdt.managedbuild.tool.gnu.c.linker.input">

+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>

+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>

+								</inputType>

+							</tool>

+						</toolChain>

+					</folderInfo>

+					<folderInfo id="com.crt.advproject.config.exe.debug.56486929.1781697322" name="/" resourcePath="ThirdParty/CMSISv2p10_LPC18xx_DriverLib">

+						<toolChain id="com.crt.advproject.toolchain.exe.debug.222538953" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug" unusedChildren="">

+							<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>

+							<tool id="com.crt.advproject.cpp.exe.debug.906161578" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug.359174792"/>

+							<tool id="com.crt.advproject.gcc.exe.debug.1015468334" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug.517029683">

+								<option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.2021633161" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level" value="gnu.c.optimization.level.size" valueType="enumerated"/>

+								<inputType id="com.crt.advproject.compiler.input.1878730423" superClass="com.crt.advproject.compiler.input"/>

+							</tool>

+							<tool id="com.crt.advproject.gas.exe.debug.253843695" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug.281614531">

+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1935362347" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>

+								<inputType id="com.crt.advproject.assembler.input.190369423" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>

+							</tool>

+							<tool id="com.crt.advproject.link.cpp.exe.debug.1715304950" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug.1490011469"/>

+							<tool id="com.crt.advproject.link.exe.debug.536813209" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug.1212311005"/>

+						</toolChain>

+					</folderInfo>

+					<folderInfo id="com.crt.advproject.config.exe.debug.56486929.2106668528" name="/" resourcePath="ThirdParty/USB_CDC">

+						<toolChain id="com.crt.advproject.toolchain.exe.debug.1865989435" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug" unusedChildren="">

+							<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>

+							<tool id="com.crt.advproject.cpp.exe.debug.1158267972" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug.359174792"/>

+							<tool id="com.crt.advproject.gcc.exe.debug.1784372430" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug.517029683">

+								<option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.369260631" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level" value="gnu.c.optimization.level.size" valueType="enumerated"/>

+								<inputType id="com.crt.advproject.compiler.input.466388069" superClass="com.crt.advproject.compiler.input"/>

+							</tool>

+							<tool id="com.crt.advproject.gas.exe.debug.401476199" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug.281614531">

+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1255426283" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>

+								<inputType id="com.crt.advproject.assembler.input.882456885" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>

+							</tool>

+							<tool id="com.crt.advproject.link.cpp.exe.debug.2009352548" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug.1490011469"/>

+							<tool id="com.crt.advproject.link.exe.debug.1734116997" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug.1212311005"/>

+						</toolChain>

+					</folderInfo>

+					<fileInfo id="com.crt.advproject.config.exe.debug.56486929.src/cr_startup_lpc18xx.cpp" name="cr_startup_lpc18xx.cpp" rcbsApplicability="disable" resourcePath="src/cr_startup_lpc18xx.cpp" toolsToInvoke=""/>

+					<sourceEntries>

+						<entry excluding="ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_wwdt.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_utils.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_uart.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_timer.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_ssp.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_sct.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_rtc.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_rit.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_qei.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_pwr.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_nvic.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_mcpwm.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_libcfg_default.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_lcd.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_i2s.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_i2c.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_gpdma.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_evrt.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_emc.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_dac.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_can.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_atimer.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/lpc18xx_adc.c|ThirdParty/CMSISv2p10_LPC18xx_DriverLib/src/debug_frmwrk.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>

+					</sourceEntries>

+				</configuration>

+			</storageModule>

+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>

+		</cconfiguration>

+	</storageModule>

+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">

+		<project id="FreeRTOS_UDP_Demo.com.crt.advproject.projecttype.exe.1394466011" name="Executable" projectType="com.crt.advproject.projecttype.exe"/>

+	</storageModule>

+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>

+	<storageModule moduleId="com.crt.config">

+		<projectStorage>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#13;

+&lt;TargetConfig&gt;&#13;

+&lt;Properties property_0="" property_2="LPC1850A_4350A_SPIFI.cfx" property_3="NXP" property_4="LPC1830" property_count="5" version="60000"/&gt;&#13;

+&lt;infoList vendor="NXP"&gt;&lt;info chip="LPC1830" match_id="0x0" name="LPC1830" resetscript="LPC18LPC43ExternalFLASHBootResetscript.scp" stub="crt_emu_lpc18_43_nxp"&gt;&lt;chip&gt;&lt;name&gt;LPC1830&lt;/name&gt;&#13;

+&lt;family&gt;LPC18xx&lt;/family&gt;&#13;

+&lt;vendor&gt;NXP (formerly Philips)&lt;/vendor&gt;&#13;

+&lt;reset board="None" core="Real" sys="Real"/&gt;&#13;

+&lt;clock changeable="TRUE" freq="20MHz" is_accurate="TRUE"/&gt;&#13;

+&lt;memory can_program="true" id="Flash" is_ro="true" type="Flash"/&gt;&#13;

+&lt;memory id="RAM" type="RAM"/&gt;&#13;

+&lt;memory id="Periph" is_volatile="true" type="Peripheral"/&gt;&#13;

+&lt;memoryInstance derived_from="Flash" edited="true" id="SPIFlash" location="0x14000000" size="0x400000"/&gt;&#13;

+&lt;memoryInstance derived_from="RAM" edited="true" id="RamLoc96" location="0x10000000" size="0x18000"/&gt;&#13;

+&lt;memoryInstance derived_from="RAM" edited="true" id="RamLoc40" location="0x10080000" size="0xa000"/&gt;&#13;

+&lt;memoryInstance derived_from="RAM" edited="true" id="RamAHB32" location="0x20000000" size="0x8000"/&gt;&#13;

+&lt;memoryInstance derived_from="RAM" edited="true" id="RamAHB16" location="0x20008000" size="0x4000"/&gt;&#13;

+&lt;memoryInstance derived_from="RAM" edited="true" id="RamAHB_ETB16" location="0x2000c000" size="0x4000"/&gt;&#13;

+&lt;peripheralInstance derived_from="V7M_MPU" id="MPU" location="0xe000ed90"/&gt;&#13;

+&lt;peripheralInstance derived_from="V7M_NVIC" id="NVIC" location="0xe000e000"/&gt;&#13;

+&lt;peripheralInstance derived_from="V7M_DCR" id="DCR" location="0xe000edf0"/&gt;&#13;

+&lt;peripheralInstance derived_from="V7M_ITM" id="ITM" location="0xe0000000"/&gt;&#13;

+&lt;peripheralInstance derived_from="SCT" id="SCT" location="0x40000000"/&gt;&#13;

+&lt;peripheralInstance derived_from="GPDMA" id="GPDMA" location="0x40002000"/&gt;&#13;

+&lt;peripheralInstance derived_from="SDMMC" id="SDMMC" location="0x40004000"/&gt;&#13;

+&lt;peripheralInstance derived_from="EMC" id="EMC" location="0x40005000"/&gt;&#13;

+&lt;peripheralInstance derived_from="USB0" id="USB0" location="0x40006000"/&gt;&#13;

+&lt;peripheralInstance derived_from="USB1" id="USB1" location="0x40007000"/&gt;&#13;

+&lt;peripheralInstance derived_from="ETHERNET" id="ETHERNET" location="0x40010000"/&gt;&#13;

+&lt;peripheralInstance derived_from="ATIMER" id="ATIMER" location="0x40040000"/&gt;&#13;

+&lt;peripheralInstance derived_from="REGFILE" id="REGFILE" location="0x40041000"/&gt;&#13;

+&lt;peripheralInstance derived_from="PMC" id="PMC" location="0x40042000"/&gt;&#13;

+&lt;peripheralInstance derived_from="CREG" id="CREG" location="0x40043000"/&gt;&#13;

+&lt;peripheralInstance derived_from="EVENTROUTER" id="EVENTROUTER" location="0x40044000"/&gt;&#13;

+&lt;peripheralInstance derived_from="RTC" id="RTC" location="0x40046000"/&gt;&#13;

+&lt;peripheralInstance derived_from="CGU" id="CGU" location="0x40050000"/&gt;&#13;

+&lt;peripheralInstance derived_from="CCU1" id="CCU1" location="0x40051000"/&gt;&#13;

+&lt;peripheralInstance derived_from="CCU2" id="CCU2" location="0x40052000"/&gt;&#13;

+&lt;peripheralInstance derived_from="RGU" id="RGU" location="0x40053000"/&gt;&#13;

+&lt;peripheralInstance derived_from="WWDT" id="WWDT" location="0x40080000"/&gt;&#13;

+&lt;peripheralInstance derived_from="USART0" id="USART0" location="0x40081000"/&gt;&#13;

+&lt;peripheralInstance derived_from="USART2" id="USART2" location="0x400c1000"/&gt;&#13;

+&lt;peripheralInstance derived_from="USART3" id="USART3" location="0x400c2000"/&gt;&#13;

+&lt;peripheralInstance derived_from="UART1" id="UART1" location="0x40082000"/&gt;&#13;

+&lt;peripheralInstance derived_from="SSP0" id="SSP0" location="0x40083000"/&gt;&#13;

+&lt;peripheralInstance derived_from="SSP1" id="SSP1" location="0x400c5000"/&gt;&#13;

+&lt;peripheralInstance derived_from="TIMER0" id="TIMER0" location="0x40084000"/&gt;&#13;

+&lt;peripheralInstance derived_from="TIMER1" id="TIMER1" location="0x40085000"/&gt;&#13;

+&lt;peripheralInstance derived_from="TIMER2" id="TIMER2" location="0x400c3000"/&gt;&#13;

+&lt;peripheralInstance derived_from="TIMER3" id="TIMER3" location="0x400c4000"/&gt;&#13;

+&lt;peripheralInstance derived_from="SCU" id="SCU" location="0x40086000"/&gt;&#13;

+&lt;peripheralInstance derived_from="GPIO-PIN-INT" id="GPIO-PIN-INT" location="0x40087000"/&gt;&#13;

+&lt;peripheralInstance derived_from="GPIO-GROUP-INT0" id="GPIO-GROUP-INT0" location="0x40088000"/&gt;&#13;

+&lt;peripheralInstance derived_from="GPIO-GROUP-INT1" id="GPIO-GROUP-INT1" location="0x40089000"/&gt;&#13;

+&lt;peripheralInstance derived_from="MCPWM" id="MCPWM" location="0x400a0000"/&gt;&#13;

+&lt;peripheralInstance derived_from="I2C0" id="I2C0" location="0x400a1000"/&gt;&#13;

+&lt;peripheralInstance derived_from="I2C1" id="I2C1" location="0x400e0000"/&gt;&#13;

+&lt;peripheralInstance derived_from="I2S0" id="I2S0" location="0x400a2000"/&gt;&#13;

+&lt;peripheralInstance derived_from="I2S1" id="I2S1" location="0x400a3000"/&gt;&#13;

+&lt;peripheralInstance derived_from="C-CAN1" id="C-CAN1" location="0x400a4000"/&gt;&#13;

+&lt;peripheralInstance derived_from="RITIMER" id="RITIMER" location="0x400c0000"/&gt;&#13;

+&lt;peripheralInstance derived_from="QEI" id="QEI" location="0x400c6000"/&gt;&#13;

+&lt;peripheralInstance derived_from="GIMA" id="GIMA" location="0x400c7000"/&gt;&#13;

+&lt;peripheralInstance derived_from="DAC" id="DAC" location="0x400e1000"/&gt;&#13;

+&lt;peripheralInstance derived_from="C-CAN0" id="C-CAN0" location="0x400e2000"/&gt;&#13;

+&lt;peripheralInstance derived_from="ADC0" id="ADC0" location="0x400e3000"/&gt;&#13;

+&lt;peripheralInstance derived_from="ADC1" id="ADC1" location="0x400e4000"/&gt;&#13;

+&lt;peripheralInstance derived_from="GPIO-PORT" id="GPIO-PORT" location="0x400f4000"/&gt;&#13;

+&lt;peripheralInstance derived_from="EEPROM" id="EEPROM" location="0x4000e000"/&gt;&#13;

+&lt;/chip&gt;&#13;

+&lt;processor&gt;&lt;name gcc_name="cortex-m3"&gt;Cortex-M3&lt;/name&gt;&#13;

+&lt;family&gt;Cortex-M&lt;/family&gt;&#13;

+&lt;/processor&gt;&#13;

+&lt;link href="nxp_lpc18xx_peripheral.xme" show="embed" type="simple"/&gt;&#13;

+&lt;/info&gt;&#13;

+&lt;/infoList&gt;&#13;

+&lt;/TargetConfig&gt;</projectStorage>

+	</storageModule>

+	<storageModule moduleId="refreshScope" versionNumber="2">

+		<configuration configurationName="Release">

+			<resource resourceType="PROJECT" workspacePath="/FreeRTOS_UDP_Demo"/>

+		</configuration>

+		<configuration configurationName="Debug">

+			<resource resourceType="PROJECT" workspacePath="/FreeRTOS_UDP_Demo"/>

+		</configuration>

+	</storageModule>

+	<storageModule moduleId="scannerConfiguration">

+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>

+		<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.56486929;com.crt.advproject.config.exe.debug.56486929.;com.crt.advproject.gcc.exe.debug.517029683;com.crt.advproject.compiler.input.927112517">

+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/>

+		</scannerConfigBuildInfo>

+		<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.56486929;com.crt.advproject.config.exe.debug.56486929.;com.crt.advproject.gas.exe.debug.281614531;com.crt.advproject.assembler.input.1243504913">

+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/>

+		</scannerConfigBuildInfo>

+	</storageModule>

+</cproject>

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.project b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.project
new file mode 100644
index 0000000..aa42a5e
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.project
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>FreeRTOS_UDP_Demo</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>

+			<triggers>clean,full,incremental,</triggers>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>

+			<triggers>full,incremental,</triggers>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.cdt.core.cnature</nature>

+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>

+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>

+	</natures>

+</projectDescription>

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.settings/org.eclipse.cdt.codan.core.prefs b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.settings/org.eclipse.cdt.codan.core.prefs
new file mode 100644
index 0000000..733f315
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.settings/org.eclipse.cdt.codan.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1

+useParentScope=false

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.settings/org.eclipse.ltk.core.refactoring.prefs b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..cfcd1d3
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1

+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/CLI-commands.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/CLI-commands.c
new file mode 100644
index 0000000..09ee590
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/CLI-commands.c
@@ -0,0 +1,667 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+ /******************************************************************************

+ *

+ * See the following URL for information on the commands defined in this file:

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml

+ *

+ ******************************************************************************/

+

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Standard includes. */

+#include <stdint.h>

+#include <stdio.h>

+#include <stdlib.h>

+

+/* FreeRTOS+CLI includes. */

+#include "FreeRTOS_CLI.h"

+

+/* FreeRTOS+UDP includes, just to make the stats available to the CLI

+commands. */

+#include "FreeRTOS_UDP_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+#ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS

+	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0

+#endif

+

+

+/*

+ * Implements the run-time-stats command.

+ */

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the task-stats command.

+ */

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-three-parameters command.

+ */

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the echo-parameters command.

+ */

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that prints out IP address information.

+ */

+static portBASE_TYPE prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that prints out the gathered demo debug stats.

+ */

+static portBASE_TYPE prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Defines a command that sends an ICMP ping request to an IP address.

+ */

+static portBASE_TYPE prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+

+/*

+ * Implements the "trace start" and "trace stop" commands;

+ */

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );

+#endif

+

+/* Structure that defines the "ip-config" command line command. */

+static const CLI_Command_Definition_t xIPConfig =

+{

+	"ip-config",

+	"ip-config:\r\n Displays IP address configuration\r\n\r\n",

+	prvDisplayIPConfig,

+	0

+};

+

+#if configINCLUDE_DEMO_DEBUG_STATS != 0

+	/* Structure that defines the "ip-debug-stats" command line command. */

+	static const CLI_Command_Definition_t xIPDebugStats =

+	{

+		"ip-debug-stats", /* The command string to type. */

+		"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",

+		prvDisplayIPDebugStats, /* The function to run. */

+		0 /* No parameters are expected. */

+	};

+#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+/* Structure that defines the "run-time-stats" command line command.   This

+generates a table that shows how much run time each task has */

+static const CLI_Command_Definition_t xRunTimeStats =

+{

+	"run-time-stats", /* The command string to type. */

+	"run-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n\r\n",

+	prvRunTimeStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "task-stats" command line command.  This generates

+a table that gives information on each task in the system. */

+static const CLI_Command_Definition_t xTaskStats =

+{

+	"task-stats", /* The command string to type. */

+	"task-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n\r\n",

+	prvTaskStatsCommand, /* The function to run. */

+	0 /* No parameters are expected. */

+};

+

+/* Structure that defines the "echo_3_parameters" command line command.  This

+takes exactly three parameters that the command simply echos back one at a

+time. */

+static const CLI_Command_Definition_t xThreeParameterEcho =

+{

+	"echo-3-parameters",

+	"echo-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n\r\n",

+	prvThreeParameterEchoCommand, /* The function to run. */

+	3 /* Three parameters are expected, which can take any value. */

+};

+

+/* Structure that defines the "echo_parameters" command line command.  This

+takes a variable number of parameters that the command simply echos back one at

+a time. */

+static const CLI_Command_Definition_t xParameterEcho =

+{

+	"echo-parameters",

+	"echo-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n\r\n",

+	prvParameterEchoCommand, /* The function to run. */

+	-1 /* The user can enter any number of commands. */

+};

+

+#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+

+	/* Structure that defines the "ping" command line command.  This takes an IP

+	address or host name and (optionally) the number of bytes to ping as

+	parameters. */

+	static const CLI_Command_Definition_t xPing =

+	{

+		"ping",

+		"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n",

+		prvPingCommand, /* The function to run. */

+		-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */

+	};

+

+#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	/* Structure that defines the "trace" command line command.  This takes a single

+	parameter, which can be either "start" or "stop". */

+	static const CLI_Command_Definition_t xStartStopTrace =

+	{

+		"trace",

+		"trace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n\r\n",

+		prvStartStopTraceCommand, /* The function to run. */

+		1 /* One parameter is expected.  Valid values are "start" and "stop". */

+	};

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

+

+/*-----------------------------------------------------------*/

+

+void vRegisterCLICommands( void )

+{

+	/* Register all the command line commands defined immediately above. */

+	FreeRTOS_CLIRegisterCommand( &xTaskStats );

+	FreeRTOS_CLIRegisterCommand( &xRunTimeStats );

+	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xParameterEcho );

+	FreeRTOS_CLIRegisterCommand( &xIPDebugStats );

+	FreeRTOS_CLIRegisterCommand( &xIPConfig );

+

+	#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+	{

+		FreeRTOS_CLIRegisterCommand( &xPing );

+	}

+	#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+	#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+		FreeRTOS_CLIRegisterCommand( & xStartStopTrace );

+	#endif

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskList( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n";

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	/* Generate a table of task stats. */

+	strcpy( pcWriteBuffer, pcHeader );

+	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );

+

+	/* There is no more data to return after this single string, so return

+	pdFALSE. */

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The three parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Return the parameter string. */

+		memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+		sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+		strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+		/* If this is the last of the three parameters then there are no more

+		strings to return after this one. */

+		if( lParameterNumber == 3L )

+		{

+			/* If this is the last of the three parameters then there are no more

+			strings to return after this one. */

+			xReturn = pdFALSE;

+			lParameterNumber = 0L;

+		}

+		else

+		{

+			/* There are more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+const char *pcParameter;

+portBASE_TYPE xParameterStringLength, xReturn;

+static portBASE_TYPE lParameterNumber = 0;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	if( lParameterNumber == 0 )

+	{

+		/* The first time the function is called after the command has been

+		entered just a header string is returned. */

+		sprintf( pcWriteBuffer, "The parameters were:\r\n" );

+

+		/* Next time the function is called the first parameter will be echoed

+		back. */

+		lParameterNumber = 1L;

+

+		/* There is more data to be returned as no parameters have been echoed

+		back yet. */

+		xReturn = pdPASS;

+	}

+	else

+	{

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							lParameterNumber,		/* Return the next parameter. */

+							&xParameterStringLength	/* Store the parameter string length. */

+						);

+

+		if( pcParameter != NULL )

+		{

+			/* Return the parameter string. */

+			memset( pcWriteBuffer, 0x00, xWriteBufferLen );

+			sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );

+			strncat( pcWriteBuffer, pcParameter, xParameterStringLength );

+			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );

+

+			/* There might be more parameters to return after this one. */

+			xReturn = pdTRUE;

+			lParameterNumber++;

+		}

+		else

+		{

+			/* No more parameters were found.  Make sure the write buffer does

+			not contain a valid string. */

+			pcWriteBuffer[ 0 ] = 0x00;

+

+			/* No more data to return. */

+			xReturn = pdFALSE;

+

+			/* Start over the next time this command is executed. */

+			lParameterNumber = 0;

+		}

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+#if ipconfigSUPPORT_OUTGOING_PINGS == 1

+

+	static portBASE_TYPE prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	char * pcParameter;

+	portBASE_TYPE lParameterStringLength, xReturn;

+	uint32_t ulIPAddress, ulBytesToPing;

+	const uint32_t ulDefaultBytesToPing = 8UL;

+	char cBuffer[ 16 ];

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Start with an empty string. */

+		pcWriteBuffer[ 0 ] = 0x00;

+

+		/* Obtain the number of bytes to ping. */

+		pcParameter = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									2,						/* Return the second parameter. */

+									&lParameterStringLength	/* Store the parameter string length. */

+								);

+

+		if( pcParameter == NULL )

+		{

+			/* The number of bytes was not specified, so default it. */

+			ulBytesToPing = ulDefaultBytesToPing;

+		}

+		else

+		{

+			ulBytesToPing = atol( pcParameter );

+		}

+

+		/* Obtain the IP address string. */

+		pcParameter = ( char * ) FreeRTOS_CLIGetParameter

+								(

+									pcCommandString,		/* The command string itself. */

+									1,						/* Return the first parameter. */

+									&lParameterStringLength	/* Store the parameter string length. */

+								);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* Attempt to obtain the IP address.   If the first character is not a

+		digit, assume the host name has been passed in. */

+		if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )

+		{

+			ulIPAddress = FreeRTOS_inet_addr( pcParameter );

+		}

+		else

+		{

+			/* Terminate the host name. */

+			pcParameter[ lParameterStringLength ] = 0x00;

+

+			/* Attempt to resolve host. */

+			ulIPAddress = FreeRTOS_gethostbyname( pcParameter );

+		}

+

+		/* Convert IP address, which may have come from a DNS lookup, to string. */

+		FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );

+

+		if( ulIPAddress != 0 )

+		{

+			xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );

+		}

+		else

+		{

+			xReturn = pdFALSE;

+		}

+

+		if( xReturn == pdFALSE )

+		{

+			sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, xReturn );

+		}

+

+		return pdFALSE;

+	}

+	/*-----------------------------------------------------------*/

+

+#endif /* ipconfigSUPPORT_OUTGOING_PINGS */

+

+#if configINCLUDE_DEMO_DEBUG_STATS != 0

+

+	static portBASE_TYPE prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	static portBASE_TYPE xIndex = -1;

+	extern xExampleDebugStatEntry_t xIPTraceValues[];

+	portBASE_TYPE xReturn;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		xIndex++;

+

+		if( xIndex < xExampleDebugStatEntries() )

+		{

+			sprintf( pcWriteBuffer, "%s %d\r\n", xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );

+			xReturn = pdPASS;

+		}

+		else

+		{

+			/* Reset the index for the next time it is called. */

+			xIndex = -1;

+

+			/* Ensure nothing remains in the write buffer. */

+			pcWriteBuffer[ 0 ] = 0x00;

+			xReturn = pdFALSE;

+		}

+

+		return xReturn;

+	}

+	/*-----------------------------------------------------------*/

+

+#endif /* configINCLUDE_DEMO_DEBUG_STATS */

+

+static portBASE_TYPE prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+{

+static portBASE_TYPE xIndex = 0;

+portBASE_TYPE xReturn;

+uint32_t ulAddress;

+

+	/* Remove compile time warnings about unused parameters, and check the

+	write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+	write buffer length is adequate, so does not check for buffer overflows. */

+	( void ) pcCommandString;

+	( void ) xWriteBufferLen;

+	configASSERT( pcWriteBuffer );

+

+	switch( xIndex )

+	{

+		case 0 :

+			FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );

+			sprintf( pcWriteBuffer, "\r\nIP address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 1 :

+			FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );

+			sprintf( pcWriteBuffer, "\r\nNet mask " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 2 :

+			FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );

+			sprintf( pcWriteBuffer, "\r\nGateway address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		case 3 :

+			FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );

+			sprintf( pcWriteBuffer, "\r\nDNS server address " );

+			xReturn = pdTRUE;

+			xIndex++;

+			break;

+

+		default :

+			ulAddress = 0;

+			sprintf( pcWriteBuffer, "\r\n\r\n" );

+			xReturn = pdFALSE;

+			xIndex = 0;

+			break;

+	}

+

+	if( ulAddress != 0 )

+	{

+		FreeRTOS_inet_ntoa( ulAddress,  &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) );

+	}

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+

+	static portBASE_TYPE prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )

+	{

+	const char *pcParameter;

+	portBASE_TYPE lParameterStringLength;

+

+		/* Remove compile time warnings about unused parameters, and check the

+		write buffer is not NULL.  NOTE - for simplicity, this example assumes the

+		write buffer length is adequate, so does not check for buffer overflows. */

+		( void ) pcCommandString;

+		( void ) xWriteBufferLen;

+		configASSERT( pcWriteBuffer );

+

+		/* Obtain the parameter string. */

+		pcParameter = FreeRTOS_CLIGetParameter

+						(

+							pcCommandString,		/* The command string itself. */

+							1,						/* Return the first parameter. */

+							&lParameterStringLength	/* Store the parameter string length. */

+						);

+

+		/* Sanity check something was returned. */

+		configASSERT( pcParameter );

+

+		/* There are only two valid parameter values. */

+		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )

+		{

+			/* Start or restart the trace. */

+			vTraceStop();

+			vTraceClear();

+			vTraceStart();

+

+			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );

+		}

+		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )

+		{

+			/* End the trace, if one is running. */

+			vTraceStop();

+			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );

+		}

+		else

+		{

+			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );

+		}

+

+		/* There is no more data to return after this single string, so return

+		pdFALSE. */

+		return pdFALSE;

+	}

+

+#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/CreateProjectDirectoryStructure.bat b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/CreateProjectDirectoryStructure.bat
new file mode 100644
index 0000000..e60a79e
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/CreateProjectDirectoryStructure.bat
@@ -0,0 +1,80 @@
+REM This file should be executed from the command line prior to the first

+REM build.  It will be necessary to refresh the Eclipse project once the

+REM .bat file has been executed (normally just press F5 to refresh).

+

+REM Copies all the required files from their location within the standard

+REM FreeRTOS directory structure to under the Eclipse project directory.

+REM This permits the Eclipse project to be used in 'managed' mode and without

+REM having to setup any linked resources.

+

+REM Standard paths

+SET FREERTOS_SOURCE=..\..\..\FreeRTOS\Source

+SET FREERTOS_UDP_SOURCE=..\..\Source\FreeRTOS-Plus-UDP

+SET FREERTOS_CLI_SOURCE=..\..\Source\FreeRTOS-Plus-CLI

+set FREERTOS_TRACE_RECORDER_SOURCE=..\..\Source\FreeRTOS-Plus-Trace

+

+REM Have the files already been copied?

+IF EXIST FreeRTOS_Source Goto END

+

+    REM Create the required directory structure.

+    MD FreeRTOS_Source

+    MD FreeRTOS_Source\include

+    MD FreeRTOS_Source\portable\

+	MD FreeRTOS_Source\portable\GCC

+    MD FreeRTOS_Source\portable\GCC\ARM_CM3

+    MD FreeRTOS_Source\portable\MemMang

+	MD FreeRTOS_Plus_UDP

+	MD FreeRTOS_Plus_UDP\include

+	MD FreeRTOS_Plus_UDP\portable

+	MD FreeRTOS_Plus_UDP\portable\Compiler

+	MD FreeRTOS_Plus_UDP\portable\Compiler\GCC

+	MD FreeRTOS_Plus_UDP\portable\BufferManagement

+	MD FreeRTOS_Plus_UDP\portable\NetworkInterface

+	MD FreeRTOS_Plus_UDP\portable\NetworkInterface\LPC18xx

+	MD FreeRTOS_Plus_CLI

+	MD Examples\Ethernet

+

+    REM Copy the core kernel files into the SDK projects directory

+    copy %FREERTOS_SOURCE%\tasks.c FreeRTOS_Source

+    copy %FREERTOS_SOURCE%\queue.c FreeRTOS_Source

+    copy %FREERTOS_SOURCE%\list.c FreeRTOS_Source

+    copy %FREERTOS_SOURCE%\timers.c FreeRTOS_Source

+

+    REM Copy the common header files into the SDK projects directory

+    copy %FREERTOS_SOURCE%\include\*.* FreeRTOS_Source\include

+

+    REM Copy the portable layer files into the projects directory

+    copy %FREERTOS_SOURCE%\portable\GCC\ARM_CM3\*.* FreeRTOS_Source\portable\GCC\ARM_CM3

+

+    REM Copy the memory allocation file into the project's directory

+    copy %FREERTOS_SOURCE%\portable\MemMang\heap_4.c FreeRTOS_Source\portable\MemMang

+

+	REM Copy the FreeRTOS+UDP core files

+	copy %FREERTOS_UDP_SOURCE%\*.c FreeRTOS_Plus_UDP

+	copy %FREERTOS_UDP_SOURCE%\readme.txt FreeRTOS_Plus_UDP

+	copy %FREERTOS_UDP_SOURCE%\include\*.* FreeRTOS_Plus_UDP\include

+

+	REM Copy the FreeRTOS+UDP portable layer files

+	copy %FREERTOS_UDP_SOURCE%\portable\NetworkInterface\LPC18xx\Using_CMSISv2p10_LPC18xx_DriverLib\*.* FreeRTOS_Plus_UDP\portable\NetworkInterface\LPC18xx

+	copy %FREERTOS_UDP_SOURCE%\portable\BufferManagement\BufferAllocation_2.c FreeRTOS_Plus_UDP\portable\BufferManagement

+	copy %FREERTOS_UDP_SOURCE%\portable\Compiler\GCC\*.* FreeRTOS_Plus_UDP\portable\Compiler\GCC

+

+	REM Copy the FreeRTOS+CLI files

+	copy %FREERTOS_CLI_SOURCE%\*.* FreeRTOS_Plus_CLI

+	

+	REM Copy the FreeRTOS+Trace recorder files

+	copy %FREERTOS_TRACE_RECORDER_SOURCE%\*.* ThirdParty\FreeRTOS_Plus_Trace_Recorder

+	copy %FREERTOS_TRACE_RECORDER_SOURCE%\include\*.* ThirdParty\FreeRTOS_Plus_Trace_Recorder\include

+

+	REM Copy the echo client example implementation

+	copy ..\Common\FreeRTOS_Plus_UDP_Demos\EchoClients\TwoEchoClients.c Examples\Ethernet

+	copy ..\Common\FreeRTOS_Plus_UDP_Demos\EchoClients\TwoEchoClients.h Examples\include

+

+	REM Copy the example IP trace macro implementation

+	copy ..\Common\FreeRTOS_Plus_UDP_Demos\TraceMacros\Example1\DemoIPTrace.c Examples\Ethernet

+	copy ..\Common\FreeRTOS_Plus_UDP_Demos\TraceMacros\Example1\DemoIPTrace.h Examples\include

+

+	REM Copy the CLI commands implementation into the project directory.

+	copy ..\Common\FreeRTOS_Plus_UDP_Demos\CLICommands\CLI-commands.c .

+

+: END

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/USB_CDC/CDCCommandConsole.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/USB_CDC/CDCCommandConsole.c
new file mode 100644
index 0000000..c6d2e33
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/USB_CDC/CDCCommandConsole.c
@@ -0,0 +1,339 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/*

+ * NOTE:  This file uses a third party USB CDC driver.

+ */

+

+/* Standard includes. */

+#include "string.h"

+#include "stdio.h"

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "semphr.h"

+

+/* Driver includes. */

+#include "usbhw.h"

+#include "cdcuser.h"

+#include "usbcfg.h"

+#include "usbuser.h"

+

+/* Example includes. */

+#include "FreeRTOS_CLI.h"

+#include "CDCCommandConsole.h"

+

+/* Dimensions the buffer into which input characters are placed. */

+#define cmdMAX_INPUT_SIZE		50

+

+/* The maximum time in ticks to wait for the CDC access mutex. */

+#define cmdMAX_MUTEX_WAIT		( 200 / portTICK_RATE_MS )

+

+/*-----------------------------------------------------------*/

+

+/*

+ * The task that implements the command console processing.

+ */

+static void prvCDCCommandConsoleTask( void *pvParameters );

+

+/*

+ * Obtain a character from the CDC input.  The calling task will be held in the

+ * Blocked state (so other tasks can execute) until a character is avilable.

+ */

+char cGetCDCChar( void );

+

+/*

+ * Initialise the third party virtual comport files driver

+ */

+static void prvSetupUSBDrivers( void );

+

+/*-----------------------------------------------------------*/

+

+/* 'Given' by the CDC interrupt to unblock the receiving task when new data

+is available. */

+static xSemaphoreHandle xNewDataSemaphore = NULL;

+

+/* Used to guard access to the CDC output, which is used by more than one

+task. */

+static xSemaphoreHandle xCDCMutex = NULL;

+

+/* Const messages output by the command console. */

+static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";

+static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";

+static const char * const pcNewLine = "\r\n";

+

+/*-----------------------------------------------------------*/

+

+void vCDCCommandConsoleStart( uint16_t usStackSize, unsigned portBASE_TYPE uxPriority )

+{

+	/* Create the semaphores and mutexes used by the CDC to task interface. */

+	xCDCMutex = xSemaphoreCreateMutex();

+	vSemaphoreCreateBinary( xNewDataSemaphore );

+	configASSERT( xCDCMutex );

+	configASSERT( xNewDataSemaphore );

+

+	/* Add the semaphore and mutex to the queue registry for viewing in the

+	kernel aware state viewer. */

+	vQueueAddToRegistry( xCDCMutex, "CDCMu" );

+	vQueueAddToRegistry( xNewDataSemaphore, "CDCDat" );

+

+	/* Create that task that handles the console itself. */

+	xTaskCreate( 	prvCDCCommandConsoleTask,	/* The task that implements the command console. */

+					"CDCCmd",					/* Text name assigned to the task.  This is just to assist debugging.  The kernel does not use this name itself. */

+					usStackSize,				/* The size of the stack allocated to the task. */

+					NULL,						/* The parameter is not used, so NULL is passed. */

+					uxPriority,					/* The priority allocated to the task. */

+					NULL );						/* A handle is not required, so just pass NULL. */

+}

+/*-----------------------------------------------------------*/

+

+static void prvCDCCommandConsoleTask( void *pvParameters )

+{

+char cRxedChar;

+uint8_t ucInputIndex = 0;

+char *pcOutputString;

+static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];

+portBASE_TYPE xReturned;

+

+	( void ) pvParameters;

+

+	/* Obtain the address of the output buffer.  Note there is no mutual

+	exclusion on this buffer as it is assumed only one command console

+	interface will be used at any one time. */

+	pcOutputString = FreeRTOS_CLIGetOutputBuffer();

+

+	/* Initialise the virtual com port (CDC) interface. */

+	prvSetupUSBDrivers();

+

+	/* Send the welcome message.  This probably won't be seen as the console

+	will not have been connected yet. */

+	USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcWelcomeMessage, strlen( pcWelcomeMessage ) );

+

+	for( ;; )

+	{

+		/* No characters received yet for the current input string. */

+		cRxedChar = 0;

+

+		/* Only interested in reading one character at a time. */

+		cRxedChar = cGetCDCChar();

+

+		if( xSemaphoreTake( xCDCMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )

+		{

+			/* Echo the character back. */

+			USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) &cRxedChar, sizeof( uint8_t ) );

+

+			/* Was it the end of the line? */

+			if( cRxedChar == '\n' || cRxedChar == '\r' )

+			{

+				/* Just to space the output from the input. */

+				USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcNewLine, strlen( pcNewLine ) );

+

+				/* See if the command is empty, indicating that the last command is

+				to be executed again. */

+				if( ucInputIndex == 0 )

+				{

+					/* Copy the last command back into the input string. */

+					strcpy( cInputString, cLastInputString );

+				}

+

+				/* Pass the received command to the command interpreter.  The

+				command interpreter is called repeatedly until it returns pdFALSE

+				(indicating there is no more output) as it might generate more than

+				one string. */

+				do

+				{

+					/* Get the next output string from the command interpreter. */

+					xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );

+

+					/* Write the generated string to the CDC. */

+					USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcOutputString, strlen( pcOutputString ) );

+					vTaskDelay( 1 );

+

+				} while( xReturned != pdFALSE );

+

+				/* All the strings generated by the input command have been sent.

+				Clear the input	string ready to receive the next command.  Remember

+				the command that was just processed first in case it is to be

+				processed again. */

+				strcpy( cLastInputString, cInputString );

+				ucInputIndex = 0;

+				memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );

+

+				USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ) );

+			}

+			else

+			{

+				if( cRxedChar == '\r' )

+				{

+					/* Ignore the character. */

+				}

+				else if( cRxedChar == '\b' )

+				{

+					/* Backspace was pressed.  Erase the last character in the

+					string - if any. */

+					if( ucInputIndex > 0 )

+					{

+						ucInputIndex--;

+						cInputString[ ucInputIndex ] = '\0';

+					}

+				}

+				else

+				{

+					/* A character was entered.  Add it to the string

+					entered so far.  When a \n is entered the complete

+					string will be passed to the command interpreter. */

+					if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )

+					{

+						if( ucInputIndex < cmdMAX_INPUT_SIZE )

+						{

+							cInputString[ ucInputIndex ] = cRxedChar;

+							ucInputIndex++;

+						}

+					}

+				}

+			}

+

+			/* Must ensure to give the mutex back. */

+			xSemaphoreGive( xCDCMutex );

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vOutputString( const char * const pcMessage )

+{

+	if( xSemaphoreTake( xCDCMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )

+	{

+		USB_WriteEP( CDC_DEP_IN, ( uint8_t * ) pcMessage, strlen( pcMessage ) );

+		xSemaphoreGive( xCDCMutex );

+	}

+}

+/*-----------------------------------------------------------*/

+

+char cGetCDCChar( void )

+{

+int32_t lAvailableBytes, xBytes = 0;

+char cInputChar;

+

+	do

+	{

+		/* Are there any characters already available? */

+		CDC_OutBufAvailChar( &lAvailableBytes );

+		if( lAvailableBytes > 0 )

+		{

+			if( xSemaphoreTake( xCDCMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )

+			{

+				/* Attempt to read one character. */

+				xBytes = 1;

+				xBytes = CDC_RdOutBuf( &cInputChar, &xBytes );

+

+				xSemaphoreGive( xCDCMutex );

+			}

+		}

+

+		if( xBytes == 0 )

+		{

+			/* A character was not available.  Wait until signalled by the

+			CDC Rx callback function that new data has arrived. */

+			xSemaphoreTake( xNewDataSemaphore, portMAX_DELAY );

+		}

+

+	} while( xBytes == 0 );

+

+	return cInputChar;

+}

+/*-----------------------------------------------------------*/

+

+/* Callback function executed by the USB interrupt when new data arrives. */

+void vCDCNewDataNotify( void )

+{

+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

+

+	configASSERT( xNewDataSemaphore );

+

+	/* 'Give' the semaphore that signals the arrival of new data to the command

+	console task. */

+	xSemaphoreGiveFromISR( xNewDataSemaphore, &xHigherPriorityTaskWoken );

+	portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );

+}

+/*-----------------------------------------------------------*/

+

+static void prvSetupUSBDrivers( void )

+{

+LPC_USBDRV_INIT_T xUSBCallback;

+

+	/* Initialise the callback structure. */

+	memset( ( void * ) &xUSBCallback, 0, sizeof( LPC_USBDRV_INIT_T ) );

+	xUSBCallback.USB_Reset_Event = USB_Reset_Event;

+	xUSBCallback.USB_P_EP[ 0 ] = USB_EndPoint0;

+	xUSBCallback.USB_P_EP[ 1 ] = USB_EndPoint1;

+	xUSBCallback.USB_P_EP[ 2 ] = USB_EndPoint2;

+	xUSBCallback.ep0_maxp = USB_MAX_PACKET0;

+

+	/* Initialise then connect the USB. */

+	USB_Init( &xUSBCallback );

+	USB_Connect( pdTRUE );

+}

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/include/CDCCommandConsole.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/include/CDCCommandConsole.h
new file mode 100644
index 0000000..1833c30
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/include/CDCCommandConsole.h
@@ -0,0 +1,78 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef CDC_COMMAND_CONSOLE_H

+#define CDC_COMMAND_CONSOLE_H

+

+/*

+ * Create the task that implements a command console using the USB virtual com

+ * port driver for intput and output.

+ */

+void vCDCCommandConsoleStart( uint16_t usStackSize, unsigned portBASE_TYPE uxPriority );

+

+#endif /* CDC_COMMAND_CONSOLE_H */

+

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/include/TwoEchoClients.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/include/TwoEchoClients.h
new file mode 100644
index 0000000..c69748d
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Examples/include/TwoEchoClients.h
@@ -0,0 +1,76 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef TWO_ECHO_CLIENTS_H

+#define TWO_ECHO_CLIENTS_H

+

+/*

+ * Create the two UDP echo client tasks.  One task uses the standard interface

+ * to send to and receive from an echo server.  The other task uses the zero

+ * copy interface to send to and receive from an echo server.

+ */

+void vStartEchoClientTasks( uint16_t usTaskStackSize, unsigned portBASE_TYPE uxTaskPriority );

+

+#endif /* TWO_ECHO_CLIENTS_H */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Flash_map.xml b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Flash_map.xml
new file mode 100644
index 0000000..1fb1cd3
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/Flash_map.xml
@@ -0,0 +1,12 @@
+<info flash_driver='LPC1850A_4350A_SPIFI.cfx'>

+ <chip>

+  <memory id='Flash' type='Flash' is_ro='true' can_program='true'></memory>

+  <memory id='RAM' type='RAM'></memory>

+   <memoryInstance id='SPIFlash' derived_from='Flash' location='0x14000000' size='0x400000'  edited='true'/>

+   <memoryInstance id='RamLoc96' derived_from='RAM' location='0x10000000' size='0x18000'  edited='true'/>

+   <memoryInstance id='RamLoc40' derived_from='RAM' location='0x10080000' size='0xa000'  edited='true'/>

+   <memoryInstance id='RamAHB32' derived_from='RAM' location='0x20000000' size='0x8000'  edited='true'/>

+   <memoryInstance id='RamAHB16' derived_from='RAM' location='0x20008000' size='0x4000'  edited='true'/>

+   <memoryInstance id='RamAHB_ETB16' derived_from='RAM' location='0x2000c000' size='0x4000'  edited='true'/>

+ </chip>

+</info>

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/FreeRTOSConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/FreeRTOSConfig.h
new file mode 100644
index 0000000..a1d8b78
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/FreeRTOSConfig.h
@@ -0,0 +1,282 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+#ifndef FREERTOS_CONFIG_H

+#define FREERTOS_CONFIG_H

+

+#include <stdint.h>

+extern uint32_t SystemCoreClock;

+

+/*-----------------------------------------------------------

+ * Application specific definitions.

+ *

+ * These definitions should be adjusted for your particular hardware and

+ * application requirements.

+ *

+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE

+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.

+ * http://www.freertos.org/a00110.html

+ *

+ * The bottom of this file contains some constants specific to running the UDP

+ * stack in this demo.  Constants specific to FreeRTOS+UDP itself (rather than

+ * the demo) are contained in FreeRTOSIPConfig.h.

+ *----------------------------------------------------------*/

+

+#define configUSE_PREEMPTION			1

+#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

+#define configUSE_TICKLESS_IDLE			0

+#define configMAX_PRIORITIES			( 7 )

+#define configCPU_CLOCK_HZ				( SystemCoreClock )

+#define configTICK_RATE_HZ				100

+#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 300 )

+#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 40 * 1024 ) ) /* Has not effect in this demo as the heap is manually pointed to AHB RAM. */

+#define configMAX_TASK_NAME_LEN			( 12 )

+#define configIDLE_SHOULD_YIELD			0

+#define configQUEUE_REGISTRY_SIZE		10

+#define configUSE_TRACE_FACILITY		1

+#define configUSE_16_BIT_TICKS			0

+#define configUSE_MUTEXES				1

+#define configUSE_CO_ROUTINES 			0

+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

+#define configUSE_COUNTING_SEMAPHORES 	1

+#define configUSE_ALTERNATIVE_API 		0

+#define configUSE_RECURSIVE_MUTEXES		1

+

+/* Hook function related definitions. */

+#define configUSE_TICK_HOOK				0

+#define configUSE_IDLE_HOOK				0

+#define configUSE_MALLOC_FAILED_HOOK	1

+#define configCHECK_FOR_STACK_OVERFLOW	2

+

+/* Software timer related definitions. */

+#define configUSE_TIMERS				1

+#define configTIMER_TASK_PRIORITY		( configMAX_PRIORITIES - 1 )

+#define configTIMER_QUEUE_LENGTH		5

+#define configTIMER_TASK_STACK_DEPTH	configMINIMAL_STACK_SIZE

+

+/* Run time stats gathering definitions. */

+void vMainConfigureTimerForRunTimeStats( void );

+uint32_t ulMainGetRunTimeCounterValue( void );

+#define configGENERATE_RUN_TIME_STATS	1

+#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vMainConfigureTimerForRunTimeStats()

+#define portGET_RUN_TIME_COUNTER_VALUE() ulMainGetRunTimeCounterValue()

+

+/* Set the following definitions to 1 to include the API function, or zero

+to exclude the API function. */

+#define INCLUDE_vTaskPrioritySet			1

+#define INCLUDE_uxTaskPriorityGet			1

+#define INCLUDE_vTaskDelete					1

+#define INCLUDE_vTaskCleanUpResources		0

+#define INCLUDE_vTaskSuspend				1

+#define INCLUDE_vTaskDelayUntil				1

+#define INCLUDE_vTaskDelay					1

+#define INCLUDE_uxTaskGetStackHighWaterMark	1

+#define INCLUDE_xTimerGetTimerTaskHandle	0

+#define INCLUDE_xTaskGetIdleTaskHandle		0

+#define INCLUDE_xQueueGetMutexHolder		1

+

+/* This demo makes use of one or more example stats formatting functions.  These

+format the raw data provided by the uxTaskGetSystemState() function in to human

+readable ASCII form.  See the notes in the implementation of vTaskList() within

+FreeRTOS/Source/tasks.c for limitations. */

+#define configUSE_STATS_FORMATTING_FUNCTIONS	1

+

+/* Assert statement defined for debug builds. */

+#ifdef DEBUG

+	#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

+#endif

+

+/* Interrupt priority configuration settings follow.

+http://www.freertos.org/RTOS-Cortex-M3-M4.html */

+

+/* Use the system definition for the number of interrupt priorities, if there

+is one */

+#ifdef __NVIC_PRIO_BITS

+	#define configPRIO_BITS       __NVIC_PRIO_BITS

+#else

+	#define configPRIO_BITS       3        /* 8 priority levels */

+#endif

+

+/* The maximum priority an interrupt that uses an interrupt safe FreeRTOS API

+function can have.  Note that lower priority have numerically higher values.  */

+#define configMAX_LIBRARY_INTERRUPT_PRIORITY	( 5 )

+

+/* The minimum possible interrupt priority. */

+#define configMIN_LIBRARY_INTERRUPT_PRIORITY	( 7 )

+

+/* The lowest priority. */

+#define configKERNEL_INTERRUPT_PRIORITY 		( configMIN_LIBRARY_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

+

+/* Priority 5, or 248 as only the top five bits are implemented. */

+#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configMAX_LIBRARY_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

+

+/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS

+standard names. */

+#define vPortSVCHandler SVC_Handler

+#define xPortPendSVHandler PendSV_Handler

+#define xPortSysTickHandler SysTick_Handler

+

+

+/*

+ * DEMO APPLICATION SPECIFIC DEFINITIONS FOLLOW FROM HERE

+ */

+

+/* Set to 1 to include "trace start" and "trace stop" CLI commands.  These

+commands start and stop the FreeRTOS+Trace recording. */

+#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 1

+

+/* Dimensions a buffer that can be used by the FreeRTOS+CLI command

+interpreter.  See the FreeRTOS+CLI documentation for more information:

+http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_CLI/ */

+#define configCOMMAND_INT_MAX_OUTPUT_SIZE		1024

+

+/* The priority used by the Ethernet MAC driver interrupt. */

+#define configMAC_INTERRUPT_PRIORITY		( configMAX_LIBRARY_INTERRUPT_PRIORITY )

+

+/* If configINCLUDE_DEMO_DEBUG_STATS is set to one, then a few basic IP trace

+macros are defined to gather some UDP stack statistics that can then be viewed

+through the CLI interface.  See

+http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/UDP_IP_Trace.shtml*/

+#define configINCLUDE_DEMO_DEBUG_STATS 1

+

+/* The LPC1830 Ethernet peripheral uses a DMA to transmit and receive packets.

+The DMA uses a chain of descriptors to reference Ethernet buffers, and provide

+information on the state of each buffer (full/empty/error/etc.).

+configNUM_RX_ETHERNET_DMA_DESCRIPTORS defines the total number of receive

+descriptors (descriptors that point to buffers into which the DMA will write

+packets received from the network).  An Ethernet buffer is assigned to each

+descriptor.  Having too few descriptors will impact reliability because the DMA

+will have to drop packets that are received when there are no receive

+descriptors free.  It is however only necessary to have a couple of free

+descriptors at a time, and having more wastes the RAM used by the Ethernet

+buffers that are surplus to requirements. */

+#define configNUM_RX_ETHERNET_DMA_DESCRIPTORS	4

+

+/* The LPC1830 Ethernet peripheral uses a DMA to transmit and receive packets.

+The DMA uses a chain of descriptors to reference Ethernet buffers that are

+waiting to be sent onto the network.  configNUM_TX_ETHERNET_DMA_DESCRIPTORS

+defines the total number of transmit descriptors.  An Ethernet buffer is

+not assigned to a transmit descriptor until data is actually sent, but will

+remain assigned to the descriptor until the descriptor is re-used.  It is not

+necessary to have many transmit descriptors as the IP stack task will be held

+in the Blocked state (so other tasks can run) until a descriptor becomes

+available if it attempts to transmit when all the descriptors are in use.  See

+the iptraceWAITING_FOR_TX_DMA_DESCRIPTOR() IP trace macro. */

+#define configNUM_TX_ETHERNET_DMA_DESCRIPTORS	1

+

+/* The address of an echo server that will be used by the two demo echo client

+tasks.

+http://FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Common_Echo_Clients.shtml */

+#define configECHO_SERVER_ADDR0	172

+#define configECHO_SERVER_ADDR1 25

+#define configECHO_SERVER_ADDR2 218

+#define configECHO_SERVER_ADDR3 103

+

+/* MAC address configuration.  In a deployed production system this would

+probably be read from an EEPROM.  In the demo it is just hard coded.  Make sure

+each node on the network has a unique MAC address. */

+#define configMAC_ADDR0	0x00

+#define configMAC_ADDR1	0x01

+#define configMAC_ADDR2	0x02

+#define configMAC_ADDR3	0x03

+#define configMAC_ADDR4	0x04

+#define configMAC_ADDR5	0x08

+

+/* Default IP address configuration.  Used in ipconfigUSE_DNS is set to 0, or

+ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */

+#define configIP_ADDR0		172

+#define configIP_ADDR1		25

+#define configIP_ADDR2		218

+#define configIP_ADDR3		200

+

+/* Default gateway IP address configuration.  Used in ipconfigUSE_DNS is set to

+0, or ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */

+#define configGATEWAY_ADDR0	172

+#define configGATEWAY_ADDR1	25

+#define configGATEWAY_ADDR2	218

+#define configGATEWAY_ADDR3	1

+

+/* Default DNS server configuration.  OpenDNS addresses are 208.67.222.222 and

+208.67.220.220.  Used in ipconfigUSE_DNS is set to 0, or ipconfigUSE_DNS is set

+to 1 but a DNS server cannot be contacted.*/

+#define configDNS_SERVER_ADDR0 	208

+#define configDNS_SERVER_ADDR1 	67

+#define configDNS_SERVER_ADDR2 	222

+#define configDNS_SERVER_ADDR3 	222

+

+/* Defalt netmask configuration.  Used in ipconfigUSE_DNS is set to 0, or

+ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */

+#define configNET_MASK0		255

+#define configNET_MASK1		255

+#define configNET_MASK2		255

+#define configNET_MASK3		0

+

+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1

+	/* Only include the trace macro definitions required by FreeRTOS+Trace if

+	the trace start and trace stop CLI commands are included. */

+	#include "trcKernelPort.h"

+#endif

+

+#endif /* FREERTOS_CONFIG_H */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/FreeRTOSIPConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/FreeRTOSIPConfig.h
new file mode 100644
index 0000000..2dd1ae1
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/FreeRTOSIPConfig.h
@@ -0,0 +1,233 @@
+/*

+ * FreeRTOS+UDP V1.0.1 (C) 2013 Real Time Engineers ltd.

+ * All rights reserved

+ *

+ * FreeRTOS+UDP is an add-on component to FreeRTOS.  It is not, in itself, part

+ * of the FreeRTOS kernel.  FreeRTOS+UDP is licensed separately from FreeRTOS,

+ * and uses a different license to FreeRTOS.  FreeRTOS+UDP uses a dual license

+ * model, information on which is provided below:

+ *

+ * - Open source licensing -

+ * FreeRTOS+UDP is a free download and may be used, modified and distributed

+ * without charge provided the user adheres to version two of the GNU General

+ * Public license (GPL) and does not remove the copyright notice or this text.

+ * The GPL V2 text is available on the gnu.org web site, and on the following

+ * URL: http://www.FreeRTOS.org/gpl-2.0.txt

+ *

+ * - Commercial licensing -

+ * Businesses and individuals who wish to incorporate FreeRTOS+UDP into

+ * proprietary software for redistribution in any form must first obtain a

+ * (very) low cost commercial license - and in-so-doing support the maintenance,

+ * support and further development of the FreeRTOS+UDP product.  Commercial

+ * licenses can be obtained from http://shop.freertos.org and do not require any

+ * source files to be changed.

+ *

+ * FreeRTOS+UDP is distributed in the hope that it will be useful.  You cannot

+ * use FreeRTOS+UDP unless you agree that you use the software 'as is'.

+ * FreeRTOS+UDP is provided WITHOUT ANY WARRANTY; without even the implied

+ * warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR

+ * PURPOSE. Real Time Engineers Ltd. disclaims all conditions and terms, be they

+ * implied, expressed, or statutory.

+ *

+ * 1 tab == 4 spaces!

+ *

+ * http://www.FreeRTOS.org

+ * http://www.FreeRTOS.org/FreeRTOS-Plus

+ *

+ */

+

+/*****************************************************************************

+ *

+ * See the following URL for configuration information.

+ * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/UDP_IP_Configuration.shtml

+ *

+ *****************************************************************************/

+

+#ifndef FREERTOS_IP_CONFIG_H

+#define FREERTOS_IP_CONFIG_H

+

+/* The IP stack executes it its own task (although any application task can make

+use of its services through the published sockets API). ipconfigUDP_TASK_PRIORITY

+sets the priority of the task that executes the IP stack.  The priority is a

+standard FreeRTOS task priority so can take any value from 0 (the lowest

+priority) to (configMAX_PRIORITIES - 1) (the highest priority).

+configMAX_PRIORITIES is a standard FreeRTOS configuration parameter defined in

+FreeRTOSConfig.h, not FreeRTOSIPConfig.h. Consideration needs to be given as to

+the priority assigned to the task executing the IP stack relative to the

+priority assigned to tasks that use the IP stack. */

+#define ipconfigUDP_TASK_PRIORITY			( configMAX_PRIORITIES - 2 )

+

+/* The size, in words (not bytes), of the stack allocated to the FreeRTOS+UDP

+task.  This setting is less important when the FreeRTOS Win32 simulator is used

+as the Win32 simulator only stores a fixed amount of information on the task

+stack.  FreeRTOS includes optional stack overflow detection, see:

+http://www.freertos.org/Stacks-and-stack-overflow-checking.html */

+#define ipconfigUDP_TASK_STACK_SIZE_WORDS	( configMINIMAL_STACK_SIZE * 3 )

+

+/* ipconfigRAND32() is called by the IP stack to generate a random number that

+is then used as a DHCP transaction number.  Random number generation is performed

+via this macro to allow applications to use their own random number generation

+method.  For example, it might be possible to generate a random number by

+sampling noise on an analogue input. */

+#define ipconfigRAND32()	1

+

+/* If ipconfigUSE_NETWORK_EVENT_HOOK is set to 1 then FreeRTOS+UDP will call the

+network event hook at the appropriate times.  If ipconfigUSE_NETWORK_EVENT_HOOK

+is not set to 1 then the network event hook will never be called.  See

+http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/API/vApplicationIPNetworkEventHook.shtml

+*/

+#define ipconfigUSE_NETWORK_EVENT_HOOK 1

+

+/* Sockets have a send block time attribute.  If FreeRTOS_sendto() is called but

+a network buffer cannot be obtained then the calling task is held in the Blocked

+state (so other tasks can continue to executed) until either a network buffer

+becomes available or the send block time expires.  If the send block time expires

+then the send operation is aborted.  The maximum allowable send block time is

+capped to the value set by ipconfigMAX_SEND_BLOCK_TIME_TICKS.  Capping the

+maximum allowable send block time prevents prevents a deadlock occurring when

+all the network buffers are in use and the tasks that process (and subsequently

+free) the network buffers are themselves blocked waiting for a network buffer.

+ipconfigMAX_SEND_BLOCK_TIME_TICKS is specified in RTOS ticks.  A time in

+milliseconds can be converted to a time in ticks by dividing the time in

+milliseconds by portTICK_RATE_MS. */

+#define ipconfigMAX_SEND_BLOCK_TIME_TICKS ( 20 / portTICK_RATE_MS )

+

+/* If ipconfigUSE_DHCP is 1 then FreeRTOS+UDP will attempt to retrieve an IP

+address, netmask, DNS server address and gateway address from a DHCP server.  If

+ipconfigUSE_DHCP is 0 then FreeRTOS+UDP will use a static IP address.  The

+stack will revert to using the static IP address even when ipconfigUSE_DHCP is

+set to 1 if a valid configuration cannot be obtained from a DHCP server for any

+reason.  The static configuration used is that passed into the stack by the

+FreeRTOS_IPInit() function call. */

+#define ipconfigUSE_DHCP	1

+

+/* When ipconfigUSE_DHCP is set to 1, DHCP requests will be sent out at

+increasing time intervals until either a reply is received from a DHCP server

+and accepted, or the interval between transmissions reaches

+ipconfigMAXIMUM_DISCOVER_TX_PERIOD.  The IP stack will revert to using the

+static IP address passed as a parameter to FreeRTOS_IPInit() if the

+re-transmission time interval reaches ipconfigMAXIMUM_DISCOVER_TX_PERIOD without

+a DHCP reply being received. */

+#ifdef _WINDOWS_

+	/* The windows simulated time is not real time so the max delay is much

+	shorter. */

+	#define ipconfigMAXIMUM_DISCOVER_TX_PERIOD		( 999 / portTICK_RATE_MS )

+#else

+	#define ipconfigMAXIMUM_DISCOVER_TX_PERIOD		( 120000 / portTICK_RATE_MS )

+#endif /* _WINDOWS_ */

+

+/* The ARP cache is a table that maps IP addresses to MAC addresses.  The IP

+stack can only send a UDP message to a remove IP address if it knowns the MAC

+address associated with the IP address, or the MAC address of the router used to

+contact the remote IP address.  When a UDP message is received from a remote IP

+address the MAC address and IP address are added to the ARP cache.  When a UDP

+message is sent to a remote IP address that does not already appear in the ARP

+cache then the UDP message is replaced by a ARP message that solicits the

+required MAC address information.  ipconfigARP_CACHE_ENTRIES defines the maximum

+number of entries that can exist in the ARP table at any one time. */

+#define ipconfigARP_CACHE_ENTRIES		6

+

+/* ARP requests that do not result in an ARP response will be re-transmitted a

+maximum of ipconfigMAX_ARP_RETRANSMISSIONS times before the ARP request is

+aborted. */

+#define ipconfigMAX_ARP_RETRANSMISSIONS ( 5 )

+

+/* ipconfigMAX_ARP_AGE defines the maximum time between an entry in the ARP

+table being created or refreshed and the entry being removed because it is stale.

+New ARP requests are sent for ARP cache entries that are nearing their maximum

+age.  ipconfigMAX_ARP_AGE is specified in tens of seconds, so a value of 150 is

+equal to 1500 seconds (or 25 minutes). */

+#define ipconfigMAX_ARP_AGE			150

+

+/* Implementing FreeRTOS_inet_addr() necessitates the use of string handling

+routines, which are relatively large.  To save code space the full

+FreeRTOS_inet_addr() implementation is made optional, and a smaller and faster

+alternative called FreeRTOS_inet_addr_quick() is provided.  FreeRTOS_inet_addr()

+takes an IP in decimal dot format (for example, "192.168.0.1") as its parameter.

+FreeRTOS_inet_addr_quick() takes an IP address as four separate numerical octets

+(for example, 192, 168, 0, 1) as its parameters.  If

+ipconfigINCLUDE_FULL_INET_ADDR is set to 1 then both FreeRTOS_inet_addr() and

+FreeRTOS_indet_addr_quick() are available.  If ipconfigINCLUDE_FULL_INET_ADDR is

+not set to 1 then only FreeRTOS_indet_addr_quick() is available. */

+#define ipconfigINCLUDE_FULL_INET_ADDR	1

+

+/* ipconfigNUM_NETWORK_BUFFERS defines the total number of network buffer that

+are available to the IP stack.  The total number of network buffers is limited

+to ensure the total amount of RAM that can be consumed by the IP stack is capped

+to a pre-determinable value. */

+#define ipconfigNUM_NETWORK_BUFFERS		10

+

+/* A FreeRTOS queue is used to send events from application tasks to the IP

+stack.  ipconfigEVENT_QUEUE_LENGTH sets the maximum number of events that can

+be queued for processing at any one time.  The event queue must be a minimum of

+5 greater than the total number of network buffers. */

+#define ipconfigEVENT_QUEUE_LENGTH		( ipconfigNUM_NETWORK_BUFFERS + 5 )

+

+/* The address of a socket is the combination of its IP address and its port

+number.  FreeRTOS_bind() is used to manually allocate a port number to a socket

+(to 'bind' the socket to a port), but manual binding is not normally necessary

+for client sockets (those sockets that initiate outgoing connections rather than

+wait for incoming connections on a known port number).  If

+ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 1 then calling

+FreeRTOS_sendto() on a socket that has not yet been bound will result in the IP

+stack automatically binding the socket to a port number from the range

+socketAUTO_PORT_ALLOCATION_START_NUMBER to 0xffff.  If

+ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 0 then calling FreeRTOS_sendto()

+on a socket that has not yet been bound will result in the send operation being

+aborted. */

+#define ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND 1

+

+/* Defines the Time To Live (TTL) values used in outgoing UDP packets. */

+#define updconfigIP_TIME_TO_LIVE		128

+

+/* If ipconfigCAN_FRAGMENT_OUTGOING_PACKETS is set to 1 then UDP packets that

+contain more data than will fit in a single network frame will be fragmented

+across multiple IP packets.  Also see the ipconfigNETWORK_MTU setting.  If

+ipconfigCAN_FRAGMENT_OUTGOING_PACKETS is 1 then (ipconfigNETWORK_MTU - 28) must

+be divisible by 8.  Setting ipconfigCAN_FRAGMENT_OUTGOING_PACKETS to 1 will

+increase both the code size and execution time. */

+#define ipconfigCAN_FRAGMENT_OUTGOING_PACKETS 0

+

+/* The MTU is the maximum number of bytes the payload of a network frame can

+contain.  For normal Ethernet V2 frames the maximum MTU is 1500.  Setting a

+lower value can save RAM, depending on the buffer management scheme used.  If

+ipconfigCAN_FRAGMENT_OUTGOING_PACKETS is 1 then (ipconfigNETWORK_MTU - 28) must

+be divisible by 8. */

+#define ipconfigNETWORK_MTU 586

+

+/* Set ipconfigUSE_DNS to 1 to include a basic DNS client/resolver.  DNS is used

+through the FreeRTOS_gethostbyname() API function. */

+#define ipconfigUSE_DNS		1

+

+/* If ipconfigREPLY_TO_INCOMING_PINGS is set to 1 then the IP stack will

+generate replies to incoming ICMP echo (ping) requests. */

+#define ipconfigREPLY_TO_INCOMING_PINGS				1

+

+/* If ipconfigSUPPORT_OUTGOING_PINGS is set to 1 then the

+FreeRTOS_SendPingRequest() API function is available. */

+#define ipconfigSUPPORT_OUTGOING_PINGS				1

+

+/* Used for stack testing only, and must be implemented in the network

+interface. */

+#define updconfigLOOPBACK_ETHERNET_PACKETS	0

+

+/* If ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES is set to 1 then Ethernet frames

+that are not in Ethernet II format will be dropped.  This option is included for

+potential future IP stack developments. */

+#define ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES 1

+

+/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1 then it is the

+responsibility of the Ethernet interface to filter out packets that are of no

+interest.  If the Ethernet interface does not implement this functionality, then

+set ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES to 0 to have the IP stack

+perform the filtering instead (it is much less efficient for the stack to do it

+because the packet will already have been passed into the stack).  If the

+Ethernet driver does all the necessary filtering in hardware then software

+filtering can be removed by using a value other than 1 or 0. */

+#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES	2

+

+/* The example IP trace macros are included here so the definitions are

+available in all the FreeRTOS+UDP source files. */

+#include "DemoIPTrace.h"

+

+#endif /* FREERTOS_IP_CONFIG_H */

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/LEDs.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/LEDs.c
new file mode 100644
index 0000000..833b159
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/LEDs.c
@@ -0,0 +1,137 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* Simple LED IO functions.  LED 0 is toggled by a timer every half second. */

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "timers.h"

+

+/* Library includes. */

+#include "lpc18xx_gpio.h"

+#include "lpc18xx_scu.h"

+#include "lpc18xx_cgu.h"

+

+#define ledTOGGLE_RATE	( 500 / portTICK_RATE_MS )

+

+#define ledLED0_PORT	1

+#define ledLED0_BIT		( 1UL << 11UL )

+

+#define ledLED1_PORT	2

+#define ledLED1_BIT		( 1UL << 12UL )

+

+/*

+ * Toggles an LED just to show the application is running.

+ */

+static void prvLEDToggleTimerCallback( xTimerHandle xTimer );

+

+/*-----------------------------------------------------------*/

+

+void vLEDsInitialise( void )

+{

+static xTimerHandle xLEDToggleTimer = NULL;

+

+	/* Set the LED pin-muxing and configure as output. */

+	scu_pinmux( 0x2 , 11, MD_PUP, FUNC0 );

+	scu_pinmux( 0x2 , 12, MD_PUP, FUNC0 );

+	GPIO_SetDir( ledLED0_PORT, ledLED0_BIT, 1 );

+	GPIO_SetDir( ledLED1_PORT, ledLED1_BIT, 1 );

+

+    /* Create the timer used to toggle LED0. */

+	xLEDToggleTimer = xTimerCreate(	"LEDTmr", 		/* Just a text name to associate with the timer, useful for debugging, but not used by the kernel. */

+									ledTOGGLE_RATE,	/* The period of the timer. */

+									pdTRUE,			/* This timer will autoreload, so uxAutoReload is set to pdTRUE. */

+									NULL,			/* The timer ID is not used, so can be set to NULL. */

+									prvLEDToggleTimerCallback );		/* The callback function executed each time the timer expires. */

+

+    /* Sanity check that the timer was actually created. */

+    configASSERT( xLEDToggleTimer );

+

+    /* Start the timer.  If this is called before the scheduler is started then

+    the block time will automatically get changed to 0 (from portMAX_DELAY). */

+    xTimerStart( xLEDToggleTimer, portMAX_DELAY );

+}

+/*-----------------------------------------------------------*/

+

+static void prvLEDToggleTimerCallback( xTimerHandle xTimer )

+{

+static uint8_t ucState = 0;

+

+	/* Remove compiler warnings. */

+	( void ) xTimer;

+

+	/* Just toggle an LED to show the program is running. */

+	if( ucState == 0 )

+	{

+		GPIO_SetValue( ledLED0_PORT, ledLED0_BIT );

+	}

+	else

+	{

+		GPIO_ClearValue( ledLED0_PORT, ledLED0_BIT );

+	}

+

+	ucState = !ucState;

+}

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/README_FIRST.txt b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/README_FIRST.txt
new file mode 100644
index 0000000..4311d8b
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/README_FIRST.txt
@@ -0,0 +1,11 @@
+This demo is documented on the following web page:

+http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/RTOS_UDP_and_CLI_LPC1830_NGX.shtml

+

+The FreeRTOS+UDP API is documented on the following web page:

+http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/FreeRTOS_UDP_API_Functions.shtml

+

+Other information, including a FreeRTOS+UDP primer, a description of the 

+directory structure, and a glossary of networking terminology, can be found in 

+the FreeRTOS+UDP portal:

+http://www.FreeRTOS.org/udp

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/RunTimeStatsTimer.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/RunTimeStatsTimer.c
new file mode 100644
index 0000000..a01641f
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/RunTimeStatsTimer.c
@@ -0,0 +1,136 @@
+/*

+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 

+    All rights reserved

+

+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

+

+    ***************************************************************************

+     *                                                                       *

+     *    FreeRTOS provides completely free yet professionally developed,    *

+     *    robust, strictly quality controlled, supported, and cross          *

+     *    platform software that has become a de facto standard.             *

+     *                                                                       *

+     *    Help yourself get started quickly and support the FreeRTOS         *

+     *    project by purchasing a FreeRTOS tutorial book, reference          *

+     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *

+     *                                                                       *

+     *    Thank you!                                                         *

+     *                                                                       *

+    ***************************************************************************

+

+    This file is part of the FreeRTOS distribution.

+

+    FreeRTOS is free software; you can redistribute it and/or modify it under

+    the terms of the GNU General Public License (version 2) as published by the

+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.

+

+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<

+    >>!   distribute a combined work that includes FreeRTOS without being   !<<

+    >>!   obliged to provide the source code for proprietary components     !<<

+    >>!   outside of the FreeRTOS kernel.                                   !<<

+

+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY

+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS

+    FOR A PARTICULAR PURPOSE.  Full license text is available from the following

+    link: http://www.freertos.org/a00114.html

+

+    1 tab == 4 spaces!

+

+    ***************************************************************************

+     *                                                                       *

+     *    Having a problem?  Start by reading the FAQ "My application does   *

+     *    not run, what could be wrong?"                                     *

+     *                                                                       *

+     *    http://www.FreeRTOS.org/FAQHelp.html                               *

+     *                                                                       *

+    ***************************************************************************

+

+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,

+    license and Real Time Engineers Ltd. contact details.

+

+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS

+    compatible FAT file system, and our tiny thread aware UDP/IP stack.

+

+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High

+    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS

+    licenses offer ticketed support, indemnification and middleware.

+

+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety

+    engineered and independently SIL3 certified version for use in safety and

+    mission critical applications that require provable dependability.

+

+    1 tab == 4 spaces!

+*/

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+

+/* Utility functions to implement run time stats on Cortex-M CPUs.  The collected

+run time data can be viewed through the CLI interface.  See the following URL for

+more information on run time stats:

+http://www.freertos.org/rtos-run-time-stats.html */

+

+/* Addresses of registers in the Cortex-M debug hardware. */

+#define rtsDWT_CYCCNT 			( *( ( unsigned long * ) 0xE0001004 ) )

+#define rtsDWT_CONTROL 			( *( ( unsigned long * ) 0xE0001000 ) )

+#define rtsSCB_DEMCR 			( *( ( unsigned long * ) 0xE000EDFC ) )

+#define rtsTRCENA_BIT			( 0x01000000UL )

+#define rtsCOUNTER_ENABLE_BIT	( 0x01UL )

+

+/* Simple shift divide for scaling to avoid an overflow occurring too soon.  The

+number of bits to shift depends on the clock speed. */

+#define runtimeSLOWER_CLOCK_SPEEDS	( 70000000UL )

+#define runtimeSHIFT_13				13

+#define runtimeOVERFLOW_BIT_13		( 1UL << ( 32UL - runtimeSHIFT_13 ) )

+#define runtimeSHIFT_14				14

+#define runtimeOVERFLOW_BIT_14		( 1UL << ( 32UL - runtimeSHIFT_14 ) )

+

+/*-----------------------------------------------------------*/

+

+void vMainConfigureTimerForRunTimeStats( void )

+{

+	/* Enable TRCENA. */

+	rtsSCB_DEMCR = rtsSCB_DEMCR | rtsTRCENA_BIT;

+

+	/* Reset counter. */

+	rtsDWT_CYCCNT = 0;

+

+	/* Enable counter. */

+	rtsDWT_CONTROL = rtsDWT_CONTROL | rtsCOUNTER_ENABLE_BIT;

+}

+/*-----------------------------------------------------------*/

+

+uint32_t ulMainGetRunTimeCounterValue( void )

+{

+static unsigned long ulLastCounterValue = 0UL, ulOverflows = 0;

+unsigned long ulValueNow;

+

+	ulValueNow = rtsDWT_CYCCNT;

+

+	/* Has the value overflowed since it was last read. */

+	if( ulValueNow < ulLastCounterValue )

+	{

+		ulOverflows++;

+	}

+	ulLastCounterValue = ulValueNow;

+

+	/* Cannot use configCPU_CLOCK_HZ directly as it may itself not be a constant

+	but instead map to a variable that holds the clock speed. */

+

+	/* There is no prescale on the counter, so simulate in software. */

+	if( configCPU_CLOCK_HZ < runtimeSLOWER_CLOCK_SPEEDS )

+	{

+		ulValueNow >>= runtimeSHIFT_13;

+		ulValueNow += ( runtimeOVERFLOW_BIT_13 * ulOverflows );

+	}

+	else

+	{

+		ulValueNow >>= runtimeSHIFT_14;

+		ulValueNow += ( runtimeOVERFLOW_BIT_14 * ulOverflows );

+	}

+

+	return ulValueNow;

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_cmsis/CMSIS END USER LICENCE AGREEMENT.pdf b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_cmsis/CMSIS END USER LICENCE AGREEMENT.pdf
new file mode 100644
index 0000000..e04afae
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_cmsis/CMSIS END USER LICENCE AGREEMENT.pdf
Binary files differ
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_cmsis/cmsis_readme.txt b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_cmsis/cmsis_readme.txt
new file mode 100644
index 0000000..316499c
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_cmsis/cmsis_readme.txt
@@ -0,0 +1,44 @@
+CMSIS : Cortex Microcontroller Software Interface Standard

+==========================================================

+

+Introduction

+~~~~~~~~~~~~

+CMSIS defines for a Cortex-M Microcontroller System:

+

+    * A common way to access peripheral registers and a 

+      common way to define exception vectors.

+    * The register names of the Core Peripherals and the 

+      names of the Core Exception Vectors.

+    * An device independent interface for RTOS Kernels 

+      including a debug channel.

+

+By using CMSIS compliant software components, the user can 

+easier re-use template code. CMSIS is intended to enable the

+combination of software components from multiple middleware 

+vendors. 

+

+This project contains appropriate files for this MCU family 

+taken from CMSIS. A full copy of the CMSIS files, together

+with additional information on CMSIS can be found at:

+

+  http://www.onarm.com/

+  http://www.arm.com/

+

+Documentation

+~~~~~~~~~~~~~

+The standard CMSIS documentation can be found within the

+Code Red IDE help system, via:

+

+Help -> Help Contents -> Code Red Product Documentation -> CMSIS

+

+More information on the use of CMSIS within the Code Red IDE

+can be found in the Support area of the Code Red website at

+

+  http://www.code-red-tech.com/

+

+At the time of writing, the CMSIS FAQ can be found directly

+at:

+

+  http://support.code-red-tech.com/CodeRedWiki/Support4CMSIS

+

+

diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_nxp_driverlib/LPC1800CMSIS_ReleaseNotes.txt b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_nxp_driverlib/LPC1800CMSIS_ReleaseNotes.txt
new file mode 100644
index 0000000..b91c5ee
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC/ThirdParty/CMSISv2p10_LPC18xx_DriverLib/docs_nxp_driverlib/LPC1800CMSIS_ReleaseNotes.txt
@@ -0,0 +1,325 @@
+RELEASE CMSIS for REV A 20111209

+1/ New LPC18xx.h header file. Changes GPIO structure.

+2/ Addition of lpc18xx_emc.c and lpc18xx_emc.h to configure memory on Hitex board.

+3/ Addition of spifi_rom_api.h, spifi_drv_M3.lib and SPIFI_ROM_support.doc SPIFI driver package

+4/ Updated SPIFI programming driver for Keil MDK which uses the SPIFI lib

+5/ New BOOTFAST example shows how to boot from external flash or QSPI and ramp to 180 MHz

+

+RELEASE CMSIS for REV A 20111130

+1./ lpc18xx_lcd.h LCD_CFG_type add member pcd, lpc18xx_lcd.c add init pcd in LCD_Init function

+2./ protect MAX and MIN macro in lpc_types.h

+3./ Add getPC function to ARM,GNU, IAR startup_lpc18xx.s

+4./ Add VTOR init in SystemInit function

+5./ Change All ADC examples to use ADC port 0

+6./ These example: CortexM3_Mpu, Pwr_DeepPowerDown, Timer_FreqMeasure, SCT_SimpleMatch and all USBDEV_ROM examples Keil project was adjusted

+7./ SDRAM example and LCD example was changed not to use uint64_t in NS2CLK function

+8./ Nvic_VectorTableRelocation.c

+removed: 

+#if __RAM_MODE__//Run in RAM mode

+  memcpy((void *)VTOR_OFFSET, (const void *)0x10000000, 256*4);

+#else

+  memcpy((void *)VTOR_OFFSET, (const void *)0x1C000000, 256*4);

+#endif

+

+added:

+memcpy((void *)VTOR_OFFSET, (const void *)(getPC()& 0xFF000000), 256*4);

+9./ Pwr_PowerDown change method for testing this feature

+

+

+RELEASE CMSIS for REV A 20111028

+1./ Add GNU support

+2./ Addition of new Keil flash drivers for eFlash and SPIFI

+3./ Change of Keil projects to support eFlash and SPIFI operation

+

+PRE-RELEASE CMSIS for REV A 20111011

+1/ PowerDown Example IAR issue fixed

+2/ Upgraded CMSIS to version 2.10

+3/ Upgraded Core header to Rev A

+4/ lpc18xx_can.h remove all bitrates from 8Mhz, add bitrates from 12Mhz

+	/** Bitrate: 100K */

+	#define CAN_BITRATE100K12MHZ           0x00004509

+	/** Bitrate: 125K */

+	#define CAN_BITRATE125K12MHZ           0x00004507

+	/** Bitrate: 250K */

+	#define CAN_BITRATE250K12MHZ           0x00004503

+	/** Bitrate: 500K */

+	#define CAN_BITRATE500K12MHZ            0x00004501

+	/** Bitrate: 1000K */

+	#define CAN_BITRATE1000K12MHZ          0x00004500

+5./ lpc18xx_cgu.* add PLL audio clock, modify alloc connect table and CGU_Entity_ControlReg_Offset

+6./ lpc18xx_evrt.h

+	add EVRT_SRC_SDIO

+7./ lpc18xx_i2s.h separate LPC_I2S0 and LPC_I2S1

+8./ lpc18xx_scu.h

+	redefine, add pin modes and add pin functions 4->7

+9./ debug_frmwrk.c

+	changed pin mode for UART RXD0 and UART RXD1

+10./ lpc_can.c replace LPC_CAN by LPC_CAN0

+11./ lpc18xx_i2c.* replace i2c pin configurations

+12./ lpc18xx_ssp.c down default clock speed to 100kHz

+13./ Examples\CCAN\CCan_SimpleTxRx\CCan_SimpleTxRx.c change RD pin mode to enable input buffer

+14./ Examples\EMAC\Emac_EasyWeb\emac.c

+		replace MII and RMII pin setting by source from CodeBundle

+15./ Examples\EMC\Emc_Sdram\SDRAM_Init.c and Examples\EMC\Emc_NorFlash\SST39VF320.c

+		replace EMC pin setting to be compatible with Rev A

+16./ Examples\I2S\I2s_Audio\I2s_Audio.c

+		replace I2S pin setting to be compatible with Rev A

+		replace I2S to I2S0

+17./ Examples\LCD\Lcd_Demo\IS42S16400D.c

+		replace EMC pin setting to be compatible with Rev A

+18./ Examples\SSP\All SSP examples: replace SSP pin setting to be compatible with Rev A

+19./ Timer_Capture and Timer_FreqMeasure: replace Capture input pin setting to be compatible with Rev A

+20./ Examples\UART\All UART examples: replace UART pin setting to be compatible with Rev A

+21./ Examples\USBDEV\USB_*\usbhw.c

+		replace USB pin setting to be compatible with Rev A

+		correct clock in Init function

+

+RELEASE: LPC1800CMSIS_20110829

+1./ Add GNU Support

+modify pasting in can.c to be compatible with GCC

+

+RELEASE: LPC1800CMSIS_20110729

+1./ IAR flash support is moved to Tools folder

+2./ ADC.h fixed macro ADC_CR_BITACC

+3./ I2S.h fixed comment

+	from #endif /* LPC17XX_SSP_H_ */

+	to #endif /* LPC18XX_I2S_H_ */

+4./ ADC.c fix ADC_Init Clock by rounding clk div value

+5./ i2s.c fixed some comment

+6./ EMC Nor Flash renamed file  flash programing function

+7./ SDRAM can run at MAX EMC Speed

+8./ Removed flash programing support for LHF00L28

+

+RELEASE: LPC1800CMSIS_20110627

+1./ Fix abstract

+2./ Fix I2S FreqConfig mistake

+3./ Add DFU Driver and App

+

+

+RELEASE: LPC1800CMSIS_20110613

+1./ Add DSP Document

+2./ Speed Up External FLash Mode

+3./ Add IAR Flash Support

+4./ Fix GPDMA Flash transfer issue in IAR

+5./ Set default taget is EXFLASH(Keil only)

+

+************************************************************************************************************************************************

+RELEASE: LPC1800CMSIS_20110603

+1./ Add DSP_lib into Core folder

+2./ Update core_cmFunc.h and core_cmInstr.h for solving conflict with IAR EWARM version 6.20 or later

+3./ add IAR startup file and IAR support files in Core\DeviceSupport\NXP\LPC18xx

+4./ Modify SystemInit function to support RAM mode

+	#if (__RAM_MODE__)

+    	SCB->VTOR = 0x10000000;

+	#endif

+5./ Modify CCU1 and CCU2 struct in LPC18xx.h

+6./ Fix bug in uart_set_divisors function

+7./ Change UART clock source from XTAL to PLL1 in uart driver

+8./ Fix RTC bugs

+9./ Modify lpc18xx_GPDMA.c to support IAR compiler

+10./ Modify lpc18xx_cgu.c to support IAR compiler

+11./ Update lpc_types.h to support IAR compiler

+12./ Fix bugs in I2S driver

+13./ Remove Warnings

+14./ Change new header, add more comments

+15./ Standalize example, project, output names

+16./ Support IAR EWARM (RAM mode)

+17./ SUpport Hitex Board as default

+18./ Modify hardware configuration in abstract files

+19./ Set default Target to RAM mode

+

+************************************************************************************************************************************************

+RELEASE: LPC1800CMSIS_20110514

+1./ Change all Keil example projects from device Cortex M3 to LPC1850

+2./ change all examples to support Hitex board only

+3./ Verify all project option

+4./ separated CGU and PWR into 2 independent drivers

+

+************************************************************************************************************************************************

+RELEASE: LPC1800CMSIS_20110421

+1./ Add CAN driver:

+	Drivers/include/lpc18xx_can.h

+	Drivers/source/lpc18xx_can.c

+

+2./ Add CAN example for simple Transceiver

+	Examples\C_CAN\simpleTxRx

+

+3./ Add 4 USB Rom examples:

+	USB_DFU

+	USB_HID

+	USB_MassStorage

+	USB_Composite

+

+4./ Enable _printf function

+	debug_frmwrk.h:

+		uncomment _printf function declaration

+	debug_frmwrk.c:

+		uncomment _printf function

+

+************************************************************************************************************************************************

+RELEASE: LPC1800CMSIS_20110401

+

+1./ Change all Keil example proiects from device NXP LPC1768 to ARM Cortex-M3

+

+2./ Fix bug in I2C driver (customer feedback)

+	Problem description: 

+		I2C_MasterTransferData() is not able to 

+		(1) Send, 

+		(2) doing a repeated Start and 

+		(3) starting to receive with one function call. 

+		Problem is that the repeated start is not generated, but a retransmission of the 

+		last word is startet. 

+	Solve: change 

+		I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; 

+		I2Cx->I2CONSET = I2C_I2CONSET_STA; 

+	to 

+		I2Cx->I2CONSET = I2C_I2CONSET_STA; 

+		I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; 

+		in function I2C_Start ()

+

+3./ lpc18xx_timer.c:

+	Function TIM_ClearIntPending():

+		Change TIMx->IR |= TIM_IR_CLR(IntFlag);

+		To     TIMx->IR = TIM_IR_CLR(IntFlag);

+	Function TIM_ClearIntCapturePending():

+		Change TIMx->IR |= (1<<(4+IntFlag));

+		To     TIMx->IR = (1<<(4+IntFlag));

+	Function TIM_GetCaptureValue(): 

+		Add return 0;

+

+4./ EMC - Nor Flash: remove example build target for FLASH mode as it only can run in RAM mode.

+

+5./ SCT: update Fizzim tool to version 1.1

+

+6./ Tools:

+	Update Flash burning for LHF00L28 and SST39X320X

+

+************************************************************************************************************************************************

+

+RELEASE: LPC1800CMSIS_20110324

+

+1./ Current support hardwares:

+	- NXP LPC1800 Evaluation board through definition 'BOARD_NXP_EA'

+	- Hitex LPC1800 Board through definition 'BOARD_HITEX_LPC1800'

+    Some examples can run on LPC1800 Evaluation board, some can run on Hitex board...Please refer to abstract.txt

+

+2./ Addin new flash support under Tools/Flash/SS