summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2013-10-02 14:24:38 +0000
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2013-10-02 14:24:38 +0000
commitcfcab95c7e6d59b6ffca330fecff4c5844efe94f (patch)
treef8f0eb9c0bd0c6275a45c3cbcba618f669bf3042
parent5b2baaf9a6fab65149b1724dee4a75b7f8d9b838 (diff)
downloadfreertos-cfcab95c7e6d59b6ffca330fecff4c5844efe94f.tar.gz
Get CLI functioning in SAMD20 demo.
git-svn-id: http://svn.code.sf.net/p/freertos/code/trunk@2047 1d2547de-c912-0410-9cb9-b8ca96c0e9e2
-rw-r--r--FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuobin50176 -> 61952 bytes
-rw-r--r--FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/RTOSDemo.cproj7
-rw-r--r--FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/Sample-CLI-commands.c426
-rw-r--r--FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.c345
-rw-r--r--FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.h77
-rw-r--r--FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/main.c85
6 files changed, 868 insertions, 72 deletions
diff --git a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuo b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuo
index 3a6238b46..c05015591 100644
--- a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuo
+++ b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuo
Binary files differ
diff --git a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/RTOSDemo.cproj b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/RTOSDemo.cproj
index 81fb75d46..e3144d198 100644
--- a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/RTOSDemo.cproj
+++ b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/RTOSDemo.cproj
@@ -405,7 +405,6 @@
<Value>../../../../../FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI</Value>
</ListValues>
</armgcc.compiler.directories.IncludePaths>
- <armgcc.compiler.optimization.level>Optimize (-O1)</armgcc.compiler.optimization.level>
<armgcc.compiler.optimization.OtherFlags>-fdata-sections</armgcc.compiler.optimization.OtherFlags>
<armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
<armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel>
@@ -499,6 +498,12 @@
<GenerateEepFile>True</GenerateEepFile>
</PropertyGroup>
<ItemGroup>
+ <Compile Include="src\Sample-CLI-commands.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="src\UARTCommandConsole.c">
+ <SubType>compile</SubType>
+ </Compile>
<None Include="src\ASF\common\services\serial\sam0_usart\usart_serial.h">
<SubType>compile</SubType>
</None>
diff --git a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/Sample-CLI-commands.c b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/Sample-CLI-commands.c
new file mode 100644
index 000000000..6f0b23d39
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/Sample-CLI-commands.c
@@ -0,0 +1,426 @@
+/*
+ FreeRTOS V7.5.2 - Copyright (C) 2013 Real Time Engineers Ltd.
+
+ FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT
+ http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ 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. See the GNU General Public License for more
+ details. You should have received a copy of the GNU General Public License
+ and the FreeRTOS license exception along with FreeRTOS; if not itcan be
+ viewed here: http://www.freertos.org/a00114.html and also obtained by
+ writing to Real Time Engineers Ltd., contact details for whom are available
+ on the FreeRTOS WEB site.
+
+ 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, and our new
+ fully thread aware and reentrant UDP/IP stack.
+
+ http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
+ Integrity Systems, who sell the code with commercial support,
+ indemnification and middleware, under the OpenRTOS brand.
+
+ 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.
+*/
+
+ /******************************************************************************
+ *
+ * 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 <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 run-time-stats command.
+ */
+static portBASE_TYPE prvTaskStatsCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+
+/*
+ * Implements the task-stats command.
+ */
+static portBASE_TYPE prvRunTimeStatsCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+
+/*
+ * Implements the echo-three-parameters command.
+ */
+static portBASE_TYPE prvThreeParameterEchoCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+
+/*
+ * Implements the echo-parameters command.
+ */
+static portBASE_TYPE prvParameterEchoCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+
+/*
+ * Implements the "trace start" and "trace stop" commands;
+ */
+#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
+ static portBASE_TYPE prvStartStopTraceCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *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 =
+{
+ ( const int8_t * const ) "run-time-stats", /* The command string to type. */
+ ( const int8_t * const ) "\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 =
+{
+ ( const int8_t * const ) "task-stats", /* The command string to type. */
+ ( const int8_t * const ) "\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 =
+{
+ ( const int8_t * const ) "echo-3-parameters",
+ ( const int8_t * const ) "\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 =
+{
+ ( const int8_t * const ) "echo-parameters",
+ ( const int8_t * const ) "\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 =
+ {
+ ( const int8_t * const ) "trace",
+ ( const int8_t * const ) "\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( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+{
+const int8_t *const pcHeader = ( int8_t * ) "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( ( char * ) pcWriteBuffer, ( char * ) pcHeader );
+ vTaskList( pcWriteBuffer + strlen( ( char * ) pcHeader ) );
+
+ /* There is no more data to return after this single string, so return
+ pdFALSE. */
+ return pdFALSE;
+}
+/*-----------------------------------------------------------*/
+
+static portBASE_TYPE prvRunTimeStatsCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+{
+const int8_t * const pcHeader = ( int8_t * ) "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( ( char * ) pcWriteBuffer, ( char * ) pcHeader );
+ vTaskGetRunTimeStats( pcWriteBuffer + strlen( ( char * ) pcHeader ) );
+
+ /* There is no more data to return after this single string, so return
+ pdFALSE. */
+ return pdFALSE;
+}
+/*-----------------------------------------------------------*/
+
+static portBASE_TYPE prvThreeParameterEchoCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+{
+int8_t *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( ( char * ) 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 = ( int8_t * ) 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( ( char * ) pcWriteBuffer, "%d: ", ( int ) lParameterNumber );
+ strncat( ( char * ) pcWriteBuffer, ( const char * ) pcParameter, xParameterStringLength );
+ strncat( ( char * ) 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( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+{
+int8_t *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( ( char * ) 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 = ( int8_t * ) 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( ( char * ) pcWriteBuffer, "%d: ", ( int ) lParameterNumber );
+ strncat( ( char * ) pcWriteBuffer, ( const char * ) pcParameter, xParameterStringLength );
+ strncat( ( char * ) 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( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+ {
+ int8_t *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 = ( int8_t * ) 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( ( const char * ) pcParameter, "start", strlen( "start" ) ) == 0 )
+ {
+ /* Start or restart the trace. */
+ vTraceStop();
+ vTraceClear();
+ vTraceStart();
+
+ sprintf( ( char * ) pcWriteBuffer, "Trace recording (re)started.\r\n" );
+ }
+ else if( strncmp( ( const char * ) pcParameter, "stop", strlen( "stop" ) ) == 0 )
+ {
+ /* End the trace, if one is running. */
+ vTraceStop();
+ sprintf( ( char * ) pcWriteBuffer, "Stopping trace recording.\r\n" );
+ }
+ else
+ {
+ sprintf( ( char * ) 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/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.c b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.c
new file mode 100644
index 000000000..9bbdca2ec
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.c
@@ -0,0 +1,345 @@
+/*
+ FreeRTOS V7.5.2 - Copyright (C) 2013 Real Time Engineers Ltd.
+
+ 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 "string.h"
+#include "stdio.h"
+
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "semphr.h"
+
+/* Library includes. */
+#include "asf.h"
+
+/* Example includes. */
+#include "FreeRTOS_CLI.h"
+#include "UARTCommandConsole.h"
+
+/* Dimensions the buffer into which input characters are placed. */
+#define cmdMAX_INPUT_SIZE 50
+
+/* The maximum time in ticks to wait for the UART access mutex. */
+#define cmdMAX_MUTEX_WAIT ( 200 / portTICK_RATE_MS )
+
+/* Characters are only ever received slowly on the CLI so it is ok to pass
+received characters from the UART interrupt to the task on a queue. This sets
+the length of the queue used for that purpose. */
+#define cmdRXED_CHARS_QUEUE_LENGTH ( 10 )
+
+/* DEL acts as a backspace. */
+#define cmdASCII_DEL ( 0x7F )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The task that implements the command console processing.
+ */
+static void prvUARTCommandConsoleTask( void *pvParameters );
+
+/*
+ * Ensure a previous interrupt driven Tx has completed before sending the next
+ * data block to the UART.
+ */
+static void prvSendBuffer( struct usart_module *pxCDCUsart, uint8_t * pcBuffer, size_t xBufferLength );
+
+/*
+ * A UART is used for printf() output and CLI input and output. Configure the
+ * UART and register prvUARTRxNotificationHandler() to handle UART Rx events.
+ */
+static void prvConfigureUART( struct usart_module *pxCDCUsart );
+static void prvUARTTxNotificationHandler( const struct usart_module *const pxUSART );
+static void prvUARTRxNotificationHandler( const struct usart_module *const pxUSART );
+
+/*-----------------------------------------------------------*/
+
+/* Const messages output by the command console. */
+static uint8_t * const pcWelcomeMessage = ( uint8_t * ) "\r\n\r\nFreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";
+static const uint8_t * const pcEndOfOutputMessage = ( uint8_t * ) "\r\n[Press ENTER to execute the previous command again]\r\n>";
+static const uint8_t * const pcNewLine = ( uint8_t * ) "\r\n";
+
+/* This semaphore is used to allow the task to wait for a Tx to complete
+without wasting any CPU time. */
+static xSemaphoreHandle xTxCompleteSemaphore = NULL;
+
+/* This semaphore is sued to allow the task to wait for an Rx to complete
+without wasting any CPU time. */
+static xSemaphoreHandle xRxCompleteSemaphore = NULL;
+
+/*-----------------------------------------------------------*/
+
+void vUARTCommandConsoleStart( uint16_t usStackSize, unsigned portBASE_TYPE uxPriority )
+{
+ /* Create that task that handles the console itself. */
+ xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
+ ( const int8_t * const ) "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 )
+{
+uint8_t ucRxedChar, ucInputIndex = 0, *pucOutputString;
+static int8_t cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
+portBASE_TYPE xReturned;
+static struct usart_module xCDCUsart; /* Static so it doesn't take up too much stack. */
+
+ ( void ) pvParameters;
+
+ /* A UART is used for printf() output and CLI input and output. Note there
+ is no mutual exclusion on the UART, but the demo as it stands does not
+ require mutual exclusion. */
+ prvConfigureUART( &xCDCUsart );
+
+ /* 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. */
+ pucOutputString = ( uint8_t * ) FreeRTOS_CLIGetOutputBuffer();
+
+ /* Send the welcome message. */
+ prvSendBuffer( &xCDCUsart, pcWelcomeMessage, strlen( ( char * ) pcWelcomeMessage ) );
+
+ for( ;; )
+ {
+ /* Wait for the next character to arrive. A semaphore is used to
+ ensure no CPU time is used until data has arrived. */
+ usart_read_buffer_job( &xCDCUsart, &ucRxedChar, sizeof( ucRxedChar ) );
+ if( xSemaphoreTake( xRxCompleteSemaphore, portMAX_DELAY ) == pdPASS )
+ {
+ /* Echo the character back. */
+ prvSendBuffer( &xCDCUsart, ( uint8_t * ) &ucRxedChar, sizeof( ucRxedChar ) );
+
+ /* Was it the end of the line? */
+ if( ucRxedChar == '\n' || ucRxedChar == '\r' )
+ {
+ /* Just to space the output from the input. */
+ prvSendBuffer( &xCDCUsart, ( uint8_t * ) pcNewLine, strlen( ( char * ) 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( ( char * ) cInputString, ( char * ) 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, ( int8_t * ) pucOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
+
+ /* Write the generated string to the UART. */
+ prvSendBuffer( &xCDCUsart, ( uint8_t * ) pucOutputString, strlen( ( char * ) pucOutputString ) );
+
+ } 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( ( char * ) cLastInputString, ( char * ) cInputString );
+ ucInputIndex = 0;
+ memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
+
+ prvSendBuffer( &xCDCUsart, ( uint8_t * ) pcEndOfOutputMessage, strlen( ( char * ) pcEndOfOutputMessage ) );
+ }
+ else
+ {
+ if( ucRxedChar == '\r' )
+ {
+ /* Ignore the character. */
+ }
+ else if( ( ucRxedChar == '\b' ) || ( ucRxedChar == 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( ( ucRxedChar >= ' ' ) && ( ucRxedChar <= '~' ) )
+ {
+ if( ucInputIndex < cmdMAX_INPUT_SIZE )
+ {
+ cInputString[ ucInputIndex ] = ucRxedChar;
+ ucInputIndex++;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvSendBuffer( struct usart_module *pxCDCUsart, uint8_t * pcBuffer, size_t xBufferLength )
+{
+const portTickType xBlockMax50ms = 50 / portTICK_RATE_MS;
+
+ if( xBufferLength > 0 )
+ {
+ usart_write_buffer_job( pxCDCUsart, pcBuffer, xBufferLength );
+
+ /* Wait for the Tx to complete so the buffer can be reused without
+ corrupting the data that is being sent. */
+ xSemaphoreTake( xTxCompleteSemaphore, xBlockMax50ms );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvConfigureUART( struct usart_module *pxCDCUsart )
+{
+struct usart_config xUARTConfig;
+
+ /* This semaphore is used to allow the task to wait for the Tx to complete
+ without wasting any CPU time. */
+ vSemaphoreCreateBinary( xTxCompleteSemaphore );
+ configASSERT( xTxCompleteSemaphore );
+
+ /* This semaphore is used to allow the task to block for an Rx to complete
+ without wasting any CPU time. */
+ vSemaphoreCreateBinary( xRxCompleteSemaphore );
+ configASSERT( xRxCompleteSemaphore );
+
+ /* Take the semaphores so they start in the wanted state. A block time is
+ not necessary, and is therefore set to 0, as it is known that the semaphore s
+ exists - they have just been created. */
+ xSemaphoreTake( xTxCompleteSemaphore, 0 );
+ xSemaphoreTake( xRxCompleteSemaphore, 0 );
+
+ /* Configure the hardware. */
+ usart_get_config_defaults( &xUARTConfig );
+ xUARTConfig.baudrate = 115200;
+ xUARTConfig.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
+ xUARTConfig.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
+ xUARTConfig.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
+ xUARTConfig.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
+ xUARTConfig.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
+ while( usart_init( pxCDCUsart, EDBG_CDC_MODULE, &xUARTConfig ) != STATUS_OK )
+ {
+ /* Nothing to do here. Should include a timeout really but this is
+ init code only. */
+ }
+ usart_enable( pxCDCUsart );
+
+ /* Register the driver callbacks. */
+ usart_register_callback( pxCDCUsart, prvUARTTxNotificationHandler, USART_CALLBACK_BUFFER_TRANSMITTED );
+ usart_register_callback( pxCDCUsart, prvUARTRxNotificationHandler, USART_CALLBACK_BUFFER_RECEIVED );
+ usart_enable_callback( pxCDCUsart, USART_CALLBACK_BUFFER_TRANSMITTED );
+ usart_enable_callback( pxCDCUsart, USART_CALLBACK_BUFFER_RECEIVED );
+}
+/*-----------------------------------------------------------*/
+
+static void prvUARTRxNotificationHandler( const struct usart_module *const pxUSART )
+{
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+ /* Remove compiler warnings. */
+ ( void ) pxUSART;
+
+ /* Give the semaphore to unblock any tasks that might be waiting for an Rx
+ to complete. If a task is unblocked, and the unblocked task has a priority
+ above the currently running task, then xHigherPriorityTaskWoken will be set
+ to pdTRUE inside the xSemaphoreGiveFromISR() function. */
+ xSemaphoreGiveFromISR( xRxCompleteSemaphore, &xHigherPriorityTaskWoken );
+
+ /* portEND_SWITCHING_ISR() or portYIELD_FROM_ISR() can be used here. */
+ portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+}
+/*-----------------------------------------------------------*/
+
+static void prvUARTTxNotificationHandler( const struct usart_module *const pxUSART )
+{
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+ /* Remove compiler warnings. */
+ ( void ) pxUSART;
+
+ /* Give the semaphore to unblock any tasks that might be waiting for a Tx
+ to complete. If a task is unblocked, and the unblocked task has a priority
+ above the currently running task, then xHigherPriorityTaskWoken will be set
+ to pdTRUE inside the xSemaphoreGiveFromISR() function. */
+ xSemaphoreGiveFromISR( xTxCompleteSemaphore, &xHigherPriorityTaskWoken );
+
+ /* portEND_SWITCHING_ISR() or portYIELD_FROM_ISR() can be used here. */
+ portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+}
+
+
diff --git a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.h b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.h
new file mode 100644
index 000000000..fe4507d91
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.h
@@ -0,0 +1,77 @@
+/*
+ FreeRTOS V7.5.2 - Copyright (C) 2013 Real Time Engineers Ltd.
+
+ 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 UART_COMMAND_CONSOLE_H
+#define UART_COMMAND_CONSOLE_H
+
+/*
+ * Create the task that implements a command console using the USB virtual com
+ * port driver for intput and output.
+ */
+void vUARTCommandConsoleStart( uint16_t usStackSize, unsigned portBASE_TYPE uxPriority );
+
+#endif /* UART_COMMAND_CONSOLE_H */
+
+
+
diff --git a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/main.c b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/main.c
index e8f3ba8e9..c69fc589f 100644
--- a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/main.c
+++ b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/main.c
@@ -66,89 +66,32 @@
#include "FreeRTOS.h"
#include "task.h"
+/* Demo app includes. */
+#include "UARTCommandConsole.h"
+
/* Library includes. */
#include <asf.h>
-void usart_read_callback(const struct usart_module *const usart_module);
-void usart_write_callback(const struct usart_module *const usart_module);
static void prvSetupHardware( void );
-void configure_usart(void);
-void configure_usart_callbacks(void);
void vApplicationMallocFailedHook( void );
void vApplicationIdleHook( void );
void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName );
void vApplicationTickHook( void );
-struct usart_module usart_instance;
-#define MAX_RX_BUFFER_LENGTH 5
-volatile uint8_t rx_buffer[MAX_RX_BUFFER_LENGTH];
-#define NUM 1024
-char cChars[ NUM ] = { 0 };
-
-void usart_read_callback(const struct usart_module *const usart_module)
-{
- usart_write_buffer_job(&usart_instance, (uint8_t *)rx_buffer, MAX_RX_BUFFER_LENGTH);
-}
-
-void usart_write_callback(const struct usart_module *const usart_module)
-{
- port_pin_toggle_output_level(LED_0_PIN);
-}
-
-void configure_usart(void)
-{
- struct usart_config config_usart;
- usart_get_config_defaults(&config_usart);
- config_usart.baudrate = 115200;
- config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
- config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
- config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
- config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
- config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
- while (usart_init(&usart_instance,
- EDBG_CDC_MODULE, &config_usart) != STATUS_OK) {
- }
- usart_enable(&usart_instance);
-}
-
-void configure_usart_callbacks(void)
-{
- usart_register_callback(&usart_instance,
- usart_write_callback, USART_CALLBACK_BUFFER_TRANSMITTED);
- usart_register_callback(&usart_instance,
- usart_read_callback, USART_CALLBACK_BUFFER_RECEIVED);
- usart_enable_callback(&usart_instance, USART_CALLBACK_BUFFER_TRANSMITTED);
- usart_enable_callback(&usart_instance, USART_CALLBACK_BUFFER_RECEIVED);
-}
-
-
-
-
int main (void)
{
prvSetupHardware();
-
- configure_usart();
- configure_usart_callbacks();
- system_interrupt_enable_global();
-
- uint8_t string[] = "Hello World!\r\n";
- usart_write_buffer_job(&usart_instance, string, sizeof(string));
-
-
-
- while (true) {
- usart_read_buffer_job(&usart_instance,
- (uint8_t *)rx_buffer, MAX_RX_BUFFER_LENGTH);
- }
-
- while (1) {
- if (port_pin_get_input_level(BUTTON_0_PIN) == BUTTON_0_ACTIVE) {
- port_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
- } else {
- port_pin_set_output_level(LED_0_PIN, !LED_0_ACTIVE);
- }
- }
+ vUARTCommandConsoleStart( ( configMINIMAL_STACK_SIZE * 3 ), tskIDLE_PRIORITY );
+
+ /* Start the 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. */
+ for( ;; );
}
/*-----------------------------------------------------------*/