From: rtel Date: Mon, 9 Jun 2014 19:35:08 +0000 (+0000) Subject: Move the Zynq's lwIP example from the Full demo into its own configuration as having... X-Git-Tag: V8.1.0~39 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;ds=sidebyside;h=a682e11ed654f8c2bd8cc76fc4f8177d47212877;p=freertos Move the Zynq's lwIP example from the Full demo into its own configuration as having the lwIP tasks at a high priority made the self checking test tasks report failures, while having the lwIP tasks at a low priority slugged the throughput. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2253 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Blinky_Demo/main_blinky.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Blinky_Demo/main_blinky.c index d38b1bcf9..b500404a9 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Blinky_Demo/main_blinky.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Blinky_Demo/main_blinky.c @@ -132,12 +132,6 @@ the queue empty. */ static void prvQueueReceiveTask( void *pvParameters ); static void prvQueueSendTask( void *pvParameters ); -/* - * Called by main() to create the simply blinky style application if - * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1. - */ -void main_blinky( void ); - /*-----------------------------------------------------------*/ /* The queue used by both tasks. */ diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h index 7fdca27e5..c61f9972c 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h @@ -207,7 +207,8 @@ Zynq MPU. */ /****** Network configuration settings. ***************************************/ -#define configLWIP_TASK_PRIORITY ( 5 ) +#define configMAC_INPUT_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) +#define configLWIP_TASK_PRIORITY ( configMAX_PRIORITIES - 2 ) /* MAC address configuration. */ #define configMAC_ADDR0 0x00 diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_Apps/lwIP_Apps.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_Apps/lwIP_Apps.c index c3f8e71f5..4db5a109c 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_Apps/lwIP_Apps.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_Apps/lwIP_Apps.c @@ -165,7 +165,7 @@ static struct netif xNetIf; use of the lwIP raw API. */ httpd_init(); - sys_thread_new( "lwIP Input", xemacif_input_thread, &xNetIf, configMINIMAL_STACK_SIZE * 6, tskIDLE_PRIORITY ); + sys_thread_new( "lwIP Input", xemacif_input_thread, &xNetIf, configMINIMAL_STACK_SIZE, configMAC_INPUT_TASK_PRIORITY ); /* Create the FreeRTOS defined basic command server. This demonstrates use of the lwIP sockets API. */ diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/netif/xemacpsif_dma.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/netif/xemacpsif_dma.c index eecc2a669..33122ebf6 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/netif/xemacpsif_dma.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/netif/xemacpsif_dma.c @@ -56,7 +56,7 @@ static int EmacIntrNum; extern u8 _end; #ifdef OS_IS_FREERTOS -long xInsideISR = 0; +extern BaseType_t xInsideISR; #endif #define XEMACPS_BD_TO_INDEX(ringptr, bdptr) \ diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/sys_arch.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/sys_arch.c index 0f850524e..e2e880521 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/sys_arch.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/lwIP_port/sys_arch.c @@ -48,6 +48,11 @@ #include "lwip/mem.h" #include "lwip/stats.h" +/* Very crude mechanism used to determine if the critical section handling +functions are being called from an interrupt context or not. This relies on +the interrupt handler setting this variable manually. */ +BaseType_t xInsideISR = pdFALSE; + /*---------------------------------------------------------------------------* * Routine: sys_mbox_new *---------------------------------------------------------------------------* @@ -137,8 +142,19 @@ void sys_mbox_post( sys_mbox_t *pxMailBox, void *pxMessageToPost ) err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost ) { err_t xReturn; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; - if( xQueueSend( *pxMailBox, &pxMessageToPost, 0UL ) == pdPASS ) + if( xInsideISR != pdFALSE ) + { + xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + else + { + xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( TickType_t ) 0 ); + } + + if( xReturn == pdPASS ) { xReturn = ERR_OK; } @@ -192,6 +208,8 @@ unsigned long ulReturn; if( ulTimeOut != 0UL ) { + configASSERT( xInsideISR == ( portBASE_TYPE ) 0 ); + if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_PERIOD_MS ) ) { xEndTime = xTaskGetTickCount(); @@ -241,13 +259,25 @@ u32_t sys_arch_mbox_tryfetch( sys_mbox_t *pxMailBox, void **ppvBuffer ) { void *pvDummy; unsigned long ulReturn; +long lResult; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; if( ppvBuffer== NULL ) { ppvBuffer = &pvDummy; } - if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), 0UL ) ) + if( xInsideISR != pdFALSE ) + { + lResult = xQueueReceiveFromISR( *pxMailBox, &( *ppvBuffer ), &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + else + { + lResult = xQueueReceive( *pxMailBox, &( *ppvBuffer ), 0UL ); + } + + if( lResult == pdPASS ) { ulReturn = ERR_OK; } @@ -276,10 +306,16 @@ err_t sys_sem_new( sys_sem_t *pxSemaphore, u8_t ucCount ) { err_t xReturn = ERR_MEM; + //vSemaphoreCreateBinary( ( *pxSemaphore ) ); *pxSemaphore = xSemaphoreCreateCounting( 0xffff, ( unsigned long ) ucCount ); if( *pxSemaphore != NULL ) { + if( ucCount == 0U ) + { +// xSemaphoreTake( *pxSemaphore, 1UL ); + } + xReturn = ERR_OK; SYS_STATS_INC_USED( sem ); } @@ -377,7 +413,20 @@ err_t xReturn = ERR_MEM; * @param mutex the mutex to lock */ void sys_mutex_lock( sys_mutex_t *pxMutex ) { - while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS ); +BaseType_t xGotSemaphore; +BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + if( xInsideISR == 0 ) + { + while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS ); + } + else + { +#warning What happens if the mutex cannot be taken from an ISR in the code below + xGotSemaphore = xSemaphoreTakeFromISR( *pxMutex, &xHigherPriorityTaskWoken ); + configASSERT( xGotSemaphore ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } } /** Unlock a mutex @@ -407,7 +456,17 @@ void sys_mutex_free( sys_mutex_t *pxMutex ) *---------------------------------------------------------------------------*/ void sys_sem_signal( sys_sem_t *pxSemaphore ) { - xSemaphoreGive( *pxSemaphore ); +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + if( xInsideISR != pdFALSE ) + { + xSemaphoreGiveFromISR( *pxSemaphore, &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + else + { + xSemaphoreGive( *pxSemaphore ); + } } /*---------------------------------------------------------------------------* @@ -498,7 +557,10 @@ sys_thread_t xReturn; *---------------------------------------------------------------------------*/ sys_prot_t sys_arch_protect( void ) { - taskENTER_CRITICAL(); + if( xInsideISR == pdFALSE ) + { + taskENTER_CRITICAL(); + } return ( sys_prot_t ) 1; } @@ -516,7 +578,10 @@ sys_prot_t sys_arch_protect( void ) void sys_arch_unprotect( sys_prot_t xValue ) { (void) xValue; - taskEXIT_CRITICAL(); + if( xInsideISR == pdFALSE ) + { + taskEXIT_CRITICAL(); + } } /* diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/main_full.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/main_full.c index e58c5f3ea..9f78a3d50 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/main_full.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/main_full.c @@ -145,9 +145,6 @@ #include "IntQueue.h" #include "EventGroupsDemo.h" -/* lwIP includes. */ -#include "lwip/tcpip.h" - /* Priorities for the demo application tasks. */ #define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1UL ) #define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2UL ) @@ -228,11 +225,6 @@ extern void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriori */ static void prvPseudoRandomiser( void *pvParameters ); -/* - * Defined in lwIPApps.c. - */ -extern void lwIPAppsInit( void *pvArguments ); - /*-----------------------------------------------------------*/ /* The following two variables are used to communicate the status of the @@ -248,9 +240,6 @@ char *pcStatusMessage = "All tasks running without error"; void main_full( void ) { - /* Init lwIP and start lwIP tasks. */ - tcpip_init( lwIPAppsInit, NULL ); - /* Start all the other standard demo/test tasks. They have not particular functionality, but do demonstrate how to use the FreeRTOS API and test the kernel port. */ diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwIP_Demo/main_lwIP.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwIP_Demo/main_lwIP.c new file mode 100644 index 000000000..d7524f19d --- /dev/null +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwIP_Demo/main_lwIP.c @@ -0,0 +1,184 @@ +/* + 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! +*/ + +/****************************************************************************** + * NOTE 1: This project provides two demo applications. A simple blinky style + * project, and a more comprehensive test and demo application. The + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select + * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY + * in main.c. This file implements the simply blinky style version. + * + * NOTE 2: This file only contains the source code that is specific to the + * basic demo. Generic functions, such FreeRTOS hook functions, and functions + * required to configure the hardware are defined in main.c. + ****************************************************************************** + * + * main_blinky() creates one queue, and two tasks. It then starts the + * scheduler. + * + * The Queue Send Task: + * The queue send task is implemented by the prvQueueSendTask() function in + * this file. prvQueueSendTask() sits in a loop that causes it to repeatedly + * block for 200 milliseconds, before sending the value 100 to the queue that + * was created within main_blinky(). Once the value is sent, the task loops + * back around to block for another 200 milliseconds...and so on. + * + * The Queue Receive Task: + * The queue receive task is implemented by the prvQueueReceiveTask() function + * in this file. prvQueueReceiveTask() sits in a loop where it repeatedly + * blocks on attempts to read data from the queue that was created within + * main_blinky(). When data is received, the task checks the value of the + * data, and if the value equals the expected 100, toggles an LED. The 'block + * time' parameter passed to the queue receive function specifies that the + * task should be held in the Blocked state indefinitely to wait for data to + * be available on the queue. The queue receive task will only leave the + * Blocked state when the queue send task writes to the queue. As the queue + * send task writes to the queue every 200 milliseconds, the queue receive + * task leaves the Blocked state every 200 milliseconds, and therefore toggles + * the LED every 200 milliseconds. + */ +#warning Need to update the comment above. +#warning Move lwIP code into the lwIP_Demo directory. + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" + +/* Standard demo includes. */ +#include "partest.h" + +/* lwIP includes. */ +#include "lwip/tcpip.h" + +/* The rate at which data is sent to the queue. The 200ms value is converted +to ticks using the portTICK_PERIOD_MS constant. */ +#define mainTIMER_PERIOD_MS ( 200 / portTICK_PERIOD_MS ) + +/* The LED toggled by the Rx task. */ +#define mainTIMER_LED ( 0 ) + +/* A block time of zero just means "don't block". */ +#define mainDONT_BLOCK ( 0 ) + +/*-----------------------------------------------------------*/ + +/* + * The callback for the timer that just toggles an LED to show the system is + * running. + */ +static void prvLEDToggleTimer( TimerHandle_t pxTimer ); + +/* + * Defined in lwIPApps.c. + */ +extern void lwIPAppsInit( void *pvArguments ); + +/*-----------------------------------------------------------*/ + +void main_lwIP( void ) +{ +TimerHandle_t xTimer; + + /* Init lwIP and start lwIP tasks. */ + tcpip_init( lwIPAppsInit, NULL ); + + /* A timer is used to toggle an LED just to show the application is + executing. */ + xTimer = xTimerCreate( "LED", /* Text name to make debugging easier. */ + mainTIMER_PERIOD_MS, /* The timer's period. */ + pdTRUE, /* This is an auto reload timer. */ + NULL, /* ID is not used. */ + prvLEDToggleTimer ); /* The callback function. */ + + /* Start the timer. */ + configASSERT( xTimer ); + xTimerStart( xTimer, mainDONT_BLOCK ); + + /* Start the tasks and timer running. */ + 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 either insufficient FreeRTOS heap memory available for the idle + and/or timer tasks to be created, or vTaskStartScheduler() was called from + User mode. See the memory management section on the FreeRTOS web site for + more details on the FreeRTOS heap http://www.freertos.org/a00111.html. The + mode from which main() is called is set in the C start up code and must be + a privileged mode (not user mode). */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvLEDToggleTimer( TimerHandle_t pxTimer ) +{ + /* Prevent compiler warnings. */ + ( void ) pxTimer; + + /* Just toggle an LED to show the application is running. */ + vParTestToggleLED( mainTIMER_LED ); +} + + diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwipopts.h b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwipopts.h index 46f8597f8..afc7986b4 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwipopts.h +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwipopts.h @@ -40,6 +40,7 @@ signed char *pcLwipBlockingGetTxBuffer( void ); void vLwipAppsReleaseTxBuffer( void ); #define CONFIG_LINKSPEED_AUTODETECT 1 +#define OS_IS_FREERTOS /* SSI options. */ #define TCPIP_THREAD_NAME "tcpip" @@ -148,10 +149,10 @@ a lot of data that needs to be copied, this should be set high. */ /* The following four are used only with the sequential API and can be set to 0 if the application only will use the raw API. */ /* MEMP_NUM_NETBUF: the number of struct netbufs. */ -#define MEMP_NUM_NETBUF 8 +#define MEMP_NUM_NETBUF 0 /* MEMP_NUM_NETCONN: the number of struct netconns. */ -#define MEMP_NUM_NETCONN 16 +#define MEMP_NUM_NETCONN 10 /* MEMP_NUM_TCPIP_MSG_*: the number of struct tcpip_msg, which is used for sequential API communication and incoming packets. Used in @@ -198,13 +199,6 @@ a lot of data that needs to be copied, this should be set high. */ TCP_SND_BUF/TCP_MSS for things to work. */ #define TCP_SND_QUEUELEN (16 * TCP_SND_BUF/TCP_MSS) -#define CHECKSUM_GEN_TCP 0 -#define CHECKSUM_GEN_UDP 0 -#define CHECKSUM_GEN_IP 0 -#define CHECKSUM_CHECK_TCP 0 -#define CHECKSUM_CHECK_UDP 0 -#define CHECKSUM_CHECK_IP 0 - /* TCP writable space (bytes). This must be less than or equal to TCP_SND_BUF. It is the amount of space which must be available in the tcp snd_buf for select to return writable */ @@ -225,6 +219,9 @@ a lot of data that needs to be copied, this should be set high. */ #define ARP_TABLE_SIZE 10 #define ARP_QUEUEING 1 +#define ICMP_TTL 255 + +#define IP_OPTIONS 0 /* ---------- IP options ---------- */ /* Define IP_FORWARD to 1 if you wish to have the ability to forward @@ -234,15 +231,10 @@ a lot of data that needs to be copied, this should be set high. */ /* IP reassembly and segmentation.These are orthogonal even * if they both deal with IP fragments */ -#define IP_REASSEMBLY 1 -#define IP_REASS_MAX_PBUFS 128 +#define IP_REASSEMBLY 0 +#define IP_REASS_MAX_PBUFS 10 #define MEMP_NUM_REASSDATA 10 -#define IP_FRAG 1 - -#define IP_OPTIONS 0 -#define IP_FRAG_MAX_MTU 1500 -#define IP_DEFAULT_TTL 255 -#define LWIP_CHKSUM_ALGORITHM 3 +#define IP_FRAG 0 /* ---------- ICMP options ---------- */ @@ -290,15 +282,6 @@ a lot of data that needs to be copied, this should be set high. */ #endif /* LWIP_STATS */ -#define NO_SYS_NO_TIMERS 1 -#define MEMP_SEPARATE_POOLS 1 -#define MEMP_NUM_FRAG_PBUF 256 -#define IP_OPTIONS_ALLOWED 0 -#define TCP_OVERSIZE TCP_MSS -#define LWIP_COMPAT_MUTEX 0 -#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 1 - - /* ---------- PPP options ---------- */ #define PPP_SUPPORT 0 /* Set > 0 for PPP */ diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c index 315f824b8..d50d31faf 100644 --- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c +++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c @@ -113,7 +113,7 @@ /* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo, or 0 to run the more comprehensive test and demo application. */ -#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 0 +#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1 /*-----------------------------------------------------------*/ @@ -157,9 +157,13 @@ XScuGic xInterruptController; int main( void ) { +extern void main_lwIP( void ); + /* Configure the hardware ready to run the demo. */ prvSetupHardware(); +main_lwIP(); + /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top of this file. */ #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )