Get CLI functioning in SAMD20 demo.
parent
013a3ef944
commit
8ffa1b1736
Binary file not shown.
@ -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 */
|
@ -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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue