mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 13:31:58 -04:00
Get CLI functioning in SAMD20 demo.
This commit is contained in:
parent
013a3ef944
commit
8ffa1b1736
Binary file not shown.
|
@ -405,7 +405,6 @@
|
||||||
<Value>../../../../../FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI</Value>
|
<Value>../../../../../FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI</Value>
|
||||||
</ListValues>
|
</ListValues>
|
||||||
</armgcc.compiler.directories.IncludePaths>
|
</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.OtherFlags>-fdata-sections</armgcc.compiler.optimization.OtherFlags>
|
||||||
<armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
|
<armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
|
||||||
<armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel>
|
<armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel>
|
||||||
|
@ -499,6 +498,12 @@
|
||||||
<GenerateEepFile>True</GenerateEepFile>
|
<GenerateEepFile>True</GenerateEepFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<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">
|
<None Include="src\ASF\common\services\serial\sam0_usart\usart_serial.h">
|
||||||
<SubType>compile</SubType>
|
<SubType>compile</SubType>
|
||||||
</None>
|
</None>
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -66,89 +66,32 @@
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
|
/* Demo app includes. */
|
||||||
|
#include "UARTCommandConsole.h"
|
||||||
|
|
||||||
/* Library includes. */
|
/* Library includes. */
|
||||||
#include <asf.h>
|
#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 );
|
static void prvSetupHardware( void );
|
||||||
void configure_usart(void);
|
|
||||||
void configure_usart_callbacks(void);
|
|
||||||
void vApplicationMallocFailedHook( void );
|
void vApplicationMallocFailedHook( void );
|
||||||
void vApplicationIdleHook( void );
|
void vApplicationIdleHook( void );
|
||||||
void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName );
|
void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName );
|
||||||
void vApplicationTickHook( void );
|
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)
|
int main (void)
|
||||||
{
|
{
|
||||||
prvSetupHardware();
|
prvSetupHardware();
|
||||||
|
vUARTCommandConsoleStart( ( configMINIMAL_STACK_SIZE * 3 ), tskIDLE_PRIORITY );
|
||||||
|
|
||||||
configure_usart();
|
/* Start the scheduler. */
|
||||||
configure_usart_callbacks();
|
vTaskStartScheduler();
|
||||||
system_interrupt_enable_global();
|
|
||||||
|
|
||||||
uint8_t string[] = "Hello World!\r\n";
|
/* If all is well, the scheduler will now be running, and the following line
|
||||||
usart_write_buffer_job(&usart_instance, string, sizeof(string));
|
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. */
|
||||||
while (true) {
|
for( ;; );
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue