From 1479a41cdbd40f25498d3465cc86fbb81582efd0 Mon Sep 17 00:00:00 2001 From: richardbarry Date: Wed, 2 Oct 2013 14:24:38 +0000 Subject: [PATCH] Get CLI functioning in SAMD20 demo. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2047 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../RTOSDemo.atsuo | Bin 50176 -> 61952 bytes .../RTOSDemo/RTOSDemo.cproj | 7 +- .../RTOSDemo/src/Sample-CLI-commands.c | 426 ++++++++++++++++++ .../RTOSDemo/src/UARTCommandConsole.c | 345 ++++++++++++++ .../RTOSDemo/src/UARTCommandConsole.h | 77 ++++ .../RTOSDemo/src/main.c | 85 +--- 6 files changed, 868 insertions(+), 72 deletions(-) create mode 100644 FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/Sample-CLI-commands.c create mode 100644 FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.c create mode 100644 FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo/src/UARTCommandConsole.h diff --git a/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuo b/FreeRTOS/Demo/CORTEX_M0+_Atmel_SAMD20_XPlained/RTOSDemo.atsuo index 3a6238b468f3a01018dae3e6f6be256df2f75ce9..c05015591135a7018cf9d0f1d9c37d13f3b57667 100644 GIT binary patch delta 4454 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 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 @@ ../../../../../FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI - Optimize (-O1) -fdata-sections True Maximum (-g3) @@ -499,6 +498,12 @@ True + + compile + + + compile + compile 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 +#include +#include + +/* 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 :\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 -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( ;; ); } /*-----------------------------------------------------------*/ -- 2.39.2