| /* | |
| FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. | |
| All rights reserved | |
| VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. | |
| *************************************************************************** | |
| * * | |
| * FreeRTOS provides completely free yet professionally developed, * | |
| * robust, strictly quality controlled, supported, and cross * | |
| * platform software that has become a de facto standard. * | |
| * * | |
| * Help yourself get started quickly and support the FreeRTOS * | |
| * project by purchasing a FreeRTOS tutorial book, reference * | |
| * manual, or both from: http://www.FreeRTOS.org/Documentation * | |
| * * | |
| * Thank you! * | |
| * * | |
| *************************************************************************** | |
| This file is part of the FreeRTOS distribution. | |
| FreeRTOS is free software; you can redistribute it and/or modify it under | |
| the terms of the GNU General Public License (version 2) as published by the | |
| Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. | |
| >>! NOTE: The modification to the GPL is included to allow you to !<< | |
| >>! distribute a combined work that includes FreeRTOS without being !<< | |
| >>! obliged to provide the source code for proprietary components !<< | |
| >>! outside of the FreeRTOS kernel. !<< | |
| FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY | |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| FOR A PARTICULAR PURPOSE. Full license text is available from the following | |
| link: http://www.freertos.org/a00114.html | |
| 1 tab == 4 spaces! | |
| *************************************************************************** | |
| * * | |
| * Having a problem? Start by reading the FAQ "My application does * | |
| * not run, what could be wrong?" * | |
| * * | |
| * http://www.FreeRTOS.org/FAQHelp.html * | |
| * * | |
| *************************************************************************** | |
| http://www.FreeRTOS.org - Documentation, books, training, latest versions, | |
| license and Real Time Engineers Ltd. contact details. | |
| http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, | |
| including FreeRTOS+Trace - an indispensable productivity tool, a DOS | |
| compatible FAT file system, and our tiny thread aware UDP/IP stack. | |
| http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High | |
| Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS | |
| licenses offer ticketed support, indemnification and middleware. | |
| http://www.SafeRTOS.com - High Integrity Systems also provide a safety | |
| engineered and independently SIL3 certified version for use in safety and | |
| mission critical applications that require provable dependability. | |
| 1 tab == 4 spaces! | |
| */ | |
| /* Standard includes. */ | |
| #include <string.h> | |
| #include <stdio.h> | |
| /* FreeRTOS includes. */ | |
| #include "FreeRTOS.h" | |
| #include "task.h" | |
| #include "timers.h" | |
| #include "queue.h" | |
| /* FreeRTOS+UDP includes. */ | |
| #include "FreeRTOS_UDP_IP.h" | |
| #include "FreeRTOS_Sockets.h" | |
| /* Example includes. */ | |
| #include "TwoEchoClients.h" | |
| #include "CDCCommandConsole.h" | |
| /* Library includes. */ | |
| #include "LPC18xx.h" | |
| /* The size of the stack and the priority used by the two echo client tasks. */ | |
| #define mainECHO_CLIENT_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) | |
| #define mainECHO_CLIENT_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) | |
| /* The size of the stack and the priority used by the USB CDC command console | |
| task. */ | |
| #define mainCDC_COMMAND_CONSOLE_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) | |
| #define mainCDC_COMMAND_CONSOLE_TASK_PRIORITY ( 4U ) | |
| /* | |
| * Register commands that can be used with FreeRTOS+CLI. The commands are | |
| * defined in CLI-commands.c. | |
| */ | |
| extern void vRegisterCLICommands( void ); | |
| /* | |
| * Initialise the LED ports, and create a timer that periodically toggles an LED | |
| * just to provide a visual indication that the program is running. | |
| */ | |
| extern void vLEDsInitialise( void ); | |
| /*-----------------------------------------------------------*/ | |
| /* The default IP and MAC address used by the demo. The address configuration | |
| defined here will be used if ipconfigUSE_DHCP is 0, or if ipconfigUSE_DHCP is | |
| 1 but a DHCP server could not be contacted. See the online documentation for | |
| more information. */ | |
| static const uint8_t ucIPAddress[ 4 ] = { configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 }; | |
| static const uint8_t ucNetMask[ 4 ] = { configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 }; | |
| static const uint8_t ucGatewayAddress[ 4 ] = { configGATEWAY_ADDR0, configGATEWAY_ADDR1, configGATEWAY_ADDR2, configGATEWAY_ADDR3 }; | |
| static const uint8_t ucDNSServerAddress[ 4 ] = { configDNS_SERVER_ADDR0, configDNS_SERVER_ADDR1, configDNS_SERVER_ADDR2, configDNS_SERVER_ADDR3 }; | |
| /* The MAC address used by the demo. In production units the MAC address would | |
| probably be read from flash memory or an EEPROM. Here it is just hard coded. */ | |
| const uint8_t ucMACAddress[ 6 ] = { configMAC_ADDR0, configMAC_ADDR1, configMAC_ADDR2, configMAC_ADDR3, configMAC_ADDR4, configMAC_ADDR5 }; | |
| /*-----------------------------------------------------------*/ | |
| /****************************************************************************** | |
| * | |
| * See the following web page for information on using this demo. | |
| * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/RTOS_UDP_and_CLI_LPC1830_NGX.shtml | |
| * | |
| ******************************************************************************/ | |
| int main( void ) | |
| { | |
| /* Prepare the trace recorder library. */ | |
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | |
| vTraceInitTraceData(); | |
| #endif | |
| /* The examples assume that all priority bits are assigned as preemption | |
| priority bits. */ | |
| NVIC_SetPriorityGrouping( 0UL ); | |
| /* Start the timer that just toggles an LED to show the demo is running. */ | |
| vLEDsInitialise(); | |
| /* Start the tasks that implements the command console on the UART, as | |
| described above. */ | |
| vCDCCommandConsoleStart( mainCDC_COMMAND_CONSOLE_STACK_SIZE, mainCDC_COMMAND_CONSOLE_TASK_PRIORITY ); | |
| /* Register CLI commands. */ | |
| vRegisterCLICommands(); | |
| /* Initialise the network interface. Tasks that use the network are | |
| created in the network event hook when the network is connected and ready | |
| for use. The address values passed in here are used if ipconfigUSE_DHCP is | |
| set to 0, or if ipconfigUSE_DHCP is set to 1 but a DHCP server cannot be | |
| contacted. */ | |
| FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress ); | |
| /* If the trace recorder code is included... */ | |
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | |
| { | |
| extern xQueueHandle xNetworkEventQueue; | |
| /* Name the queue for viewing in FreeRTOS+Trace. */ | |
| vTraceSetQueueName( xNetworkEventQueue, "IPStackEvent" ); | |
| } | |
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 */ | |
| /* Start the FreeRTOS scheduler. */ | |
| vTaskStartScheduler(); | |
| /* The following line should never execute. If it does, it means there was | |
| insufficient FreeRTOS heap memory available to create the Idle and/or timer | |
| tasks. See the memory management section on the http://www.FreeRTOS.org web | |
| site for more information. */ | |
| for( ;; ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationStackOverflowHook( xTaskHandle pxTask, char *pcTaskName ) | |
| { | |
| ( void ) pcTaskName; | |
| ( void ) pxTask; | |
| /* Run time stack overflow checking is performed if | |
| configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook | |
| function is called if a stack overflow is detected. */ | |
| taskDISABLE_INTERRUPTS(); | |
| for( ;; ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationMallocFailedHook( void ) | |
| { | |
| /* vApplicationMallocFailedHook() will only be called if | |
| configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook | |
| function that will get called if a call to pvPortMalloc() fails. | |
| pvPortMalloc() is called internally by the kernel whenever a task, queue, | |
| timer or semaphore is created. It is also called by various parts of the | |
| demo application. If heap_1.c, heap_2.c or heap_4.c are used, then the | |
| size of the heap available to pvPortMalloc() is defined by | |
| configTOTAL_HEAP_SIZE in FreeRTOSConfig.h, and the xPortGetFreeHeapSize() | |
| API function can be used to query the size of free heap space that remains | |
| (although it does not provide information on how the remaining heap might | |
| be fragmented). */ | |
| taskDISABLE_INTERRUPTS(); | |
| for( ;; ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| /* Called by FreeRTOS+UDP when the network connects. */ | |
| void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent ) | |
| { | |
| static portBASE_TYPE xTaskAlreadyCreated = pdFALSE; | |
| if( eNetworkEvent == eNetworkUp ) | |
| { | |
| /* Create the tasks that transmit to and receive from a standard | |
| echo server (see the web documentation for this port) in both | |
| standard and zero copy mode. */ | |
| if( xTaskAlreadyCreated == pdFALSE ) | |
| { | |
| vStartEchoClientTasks( mainECHO_CLIENT_TASK_STACK_SIZE, mainECHO_CLIENT_TASK_PRIORITY ); | |
| xTaskAlreadyCreated = pdTRUE; | |
| } | |
| } | |
| } | |
| /*-----------------------------------------------------------*/ | |
| /* Called by FreeRTOS+UDP when a reply is received to an outgoing ping request. */ | |
| void vApplicationPingReplyHook( ePingReplyStatus_t eStatus, uint16_t usIdentifier ) | |
| { | |
| static const char *pcSuccess = "\r\n\r\nPing reply received - "; | |
| static const char *pcInvalidChecksum = "\r\n\r\nPing reply received with invalid checksum - "; | |
| static const char *pcInvalidData = "\r\n\r\nPing reply received with invalid data - "; | |
| static char cMessage[ 50 ]; | |
| void vOutputString( const char * const pcMessage ); | |
| switch( eStatus ) | |
| { | |
| case eSuccess : | |
| vOutputString( pcSuccess ); | |
| break; | |
| case eInvalidChecksum : | |
| vOutputString( pcInvalidChecksum ); | |
| break; | |
| case eInvalidData : | |
| vOutputString( pcInvalidData ); | |
| break; | |
| default : | |
| /* It is not possible to get here as all enums have their own | |
| case. */ | |
| break; | |
| } | |
| sprintf( cMessage, "identifier %d\r\n\r\n", ( int ) usIdentifier ); | |
| vOutputString( cMessage ); | |
| } | |