Zynq demo: Fix Xilinx network driver by deferring the function that allocated memory from the interrupt into a task. Add DHCP option.

pull/4/head
Richard Barry 11 years ago
parent f1a0534a56
commit de7df3cfda

@ -117,7 +117,7 @@
#define configUSE_TICK_HOOK 1 #define configUSE_TICK_HOOK 1
#define configMAX_PRIORITIES ( 7 ) #define configMAX_PRIORITIES ( 7 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 80 * 1024 ) ) #define configTOTAL_HEAP_SIZE ( 80 * 1024 )
#define configMAX_TASK_NAME_LEN ( 10 ) #define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 1 #define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0 #define configUSE_16_BIT_TICKS 0
@ -165,7 +165,7 @@ extern XScuWdt xWatchDogInstance;
extern void vInitialiseTimerForRunTimeStats( void ); extern void vInitialiseTimerForRunTimeStats( void );
#define configGENERATE_RUN_TIME_STATS 1 #define configGENERATE_RUN_TIME_STATS 1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vInitialiseTimerForRunTimeStats() #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vInitialiseTimerForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE() ( 0xffffffffUL - XScuWdt_ReadReg( xWatchDogInstance.Config.BaseAddr, XSCUWDT_COUNTER_OFFSET ) ) #define portGET_RUN_TIME_COUNTER_VALUE() ( ( 0xffffffffUL - XScuWdt_ReadReg( xWatchDogInstance.Config.BaseAddr, XSCUWDT_COUNTER_OFFSET ) ) >> 1 )
/* The size of the global output buffer that is available for use when there /* The size of the global output buffer that is available for use when there
are multiple command interpreters running at once (for example, one on a UART are multiple command interpreters running at once (for example, one on a UART

@ -140,7 +140,7 @@ XUartPs_Config *pxConfig;
the semaphore so it is in the correct state the first time the semaphore so it is in the correct state the first time
xSerialSendString() is called. A block time of zero is used when taking xSerialSendString() is called. A block time of zero is used when taking
the semaphore as it is guaranteed to be available (it was just created). */ the semaphore as it is guaranteed to be available (it was just created). */
xTxCompleteSemaphore = xSemaphoreCreateMutex(); xTxCompleteSemaphore = xSemaphoreCreateBinary();
configASSERT( xTxCompleteSemaphore ); configASSERT( xTxCompleteSemaphore );
xSemaphoreTake( xTxCompleteSemaphore, 0 ); xSemaphoreTake( xTxCompleteSemaphore, 0 );
@ -208,7 +208,7 @@ const TickType_t xMaxWait = 200UL / portTICK_PERIOD_MS;
otherwise there is a risk the calling function will overwrite the string otherwise there is a risk the calling function will overwrite the string
pointed to by the pcString parameter while it is still being transmitted. pointed to by the pcString parameter while it is still being transmitted.
The calling task will wait in the Blocked state (so not consuming any The calling task will wait in the Blocked state (so not consuming any
processing time) until the mutex is available. */ processing time) until the semaphore is available. */
xSemaphoreTake( xTxCompleteSemaphore, xMaxWait ); xSemaphoreTake( xTxCompleteSemaphore, xMaxWait );
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -221,7 +221,7 @@ signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar
/* Send the character. */ /* Send the character. */
XUartPs_Send( &xUARTInstance, ( void * ) &cOutChar, sizeof( cOutChar ) ); XUartPs_Send( &xUARTInstance, ( void * ) &cOutChar, sizeof( cOutChar ) );
/* Wait for the transmission to be complete so the mutex is left in the /* Wait for the transmission to be complete so the semaphore is left in the
correct state for the next time vSerialPutString() is called. */ correct state for the next time vSerialPutString() is called. */
xSemaphoreTake( xTxCompleteSemaphore, xBlockTime ); xSemaphoreTake( xTxCompleteSemaphore, xBlockTime );

@ -67,7 +67,7 @@
#include "FreeRTOS_CLI.h" #include "FreeRTOS_CLI.h"
/* Dimensions the buffer into which input characters are placed. */ /* Dimensions the buffer into which input characters are placed. */
#define cmdMAX_INPUT_SIZE 20 #define cmdMAX_INPUT_SIZE 100
/* Dimensions the buffer into which string outputs can be placed. */ /* Dimensions the buffer into which string outputs can be placed. */
#define cmdMAX_OUTPUT_SIZE 1024 #define cmdMAX_OUTPUT_SIZE 1024

@ -62,6 +62,7 @@
/* lwIP core includes */ /* lwIP core includes */
#include "lwip/opt.h" #include "lwip/opt.h"
#include "lwip/tcpip.h" #include "lwip/tcpip.h"
#include "lwip/inet.h"
/* applications includes */ /* applications includes */
#include "apps/httpserver_raw_from_lwIP_download/httpd.h" #include "apps/httpserver_raw_from_lwIP_download/httpd.h"
@ -121,6 +122,21 @@ static signed char cTxBuffer[ lwipappsTX_BUFFER_SIZE ];
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
void vStatusCallback( struct netif *pxNetIf )
{
char pcMessage[20];
if( netif_is_up( pxNetIf ) != 0 )
{
strcpy( pcMessage, "IP=" );
strcat( pcMessage, inet_ntoa( *( struct in_addr* ) &( pxNetIf->ip_addr ) ) );
xil_printf( pcMessage );
}
else
{
xil_printf( "Network is down" );
}
}
/* Called from the TCP/IP thread. */ /* Called from the TCP/IP thread. */
void lwIPAppsInit( void *pvArgument ) void lwIPAppsInit( void *pvArgument )
@ -151,7 +167,16 @@ static struct netif xNetIf;
xNetIf.hwaddr[ 5 ] = configMAC_ADDR5; xNetIf.hwaddr[ 5 ] = configMAC_ADDR5;
netif_set_default( netif_add( &xNetIf, &xIPAddr, &xNetMask, &xGateway, ( void * ) XPAR_XEMACPS_0_BASEADDR, xemacpsif_init, tcpip_input ) ); netif_set_default( netif_add( &xNetIf, &xIPAddr, &xNetMask, &xGateway, ( void * ) XPAR_XEMACPS_0_BASEADDR, xemacpsif_init, tcpip_input ) );
netif_set_status_callback( &xNetIf, vStatusCallback );
#if LWIP_DHCP
{
dhcp_start( &xNetIf );
}
#else
{
netif_set_up( &xNetIf ); netif_set_up( &xNetIf );
}
#endif
/* Install the server side include handler. */ /* Install the server side include handler. */
http_set_ssi_handler( uslwIPAppsSSIHandler, pccSSITags, sizeof( pccSSITags ) / sizeof( char * ) ); http_set_ssi_handler( uslwIPAppsSSIHandler, pccSSITags, sizeof( pccSSITags ) / sizeof( char * ) );

@ -124,6 +124,12 @@ void process_sent_bds(XEmacPs_BdRing *txring)
return; return;
} }
void vPendableSendCompleteFunction( void *pvParameter, uint32_t ulParameter )
{
( void ) ulParameter;
process_sent_bds(pvParameter);
}
void emacps_send_handler(void *arg) void emacps_send_handler(void *arg)
{ {
struct xemac_s *xemac; struct xemac_s *xemac;
@ -139,11 +145,19 @@ void emacps_send_handler(void *arg)
regval = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_TXSR_OFFSET); regval = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_TXSR_OFFSET);
XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,XEMACPS_TXSR_OFFSET, regval); XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,XEMACPS_TXSR_OFFSET, regval);
/* If Transmit done interrupt is asserted, process completed BD's */
process_sent_bds(TxRingPtr);
#ifdef OS_IS_FREERTOS #ifdef OS_IS_FREERTOS
xInsideISR--; xInsideISR--;
#endif #endif
/* If Transmit done interrupt is asserted, process completed BD's - Replaced
a call to process_sent_bds(TxRingPtr); with a pendable function to prevent
the memory allocation files being accessed from the ISR with not redress if
obtaining the mutex fails. */
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xTimerPendFunctionCallFromISR( vPendableSendCompleteFunction, TxRingPtr, 0, &xHigherPriorityTaskWoken );
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
} }
XStatus emacps_sgsend(xemacpsif_s *xemacpsif, struct pbuf *p) XStatus emacps_sgsend(xemacpsif_s *xemacpsif, struct pbuf *p)

@ -69,35 +69,36 @@ void vLwipAppsReleaseTxBuffer( void );
#define LWIP_SO_RCVTIMEO 1 #define LWIP_SO_RCVTIMEO 1
#define LWIP_SO_RCVBUF 1 #define LWIP_SO_RCVBUF 1
//#define LWIP_DEBUG
#ifdef LWIP_DEBUG #ifdef LWIP_DEBUG
#define LWIP_DBG_MIN_LEVEL 0 #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL // LWIP_DBG_LEVEL_SERIOUS
#define PPP_DEBUG LWIP_DBG_ON #define PPP_DEBUG LWIP_DBG_OFF
#define MEM_DEBUG LWIP_DBG_ON #define MEM_DEBUG LWIP_DBG_OFF
#define MEMP_DEBUG LWIP_DBG_ON #define MEMP_DEBUG LWIP_DBG_OFF
#define PBUF_DEBUG LWIP_DBG_ON #define PBUF_DEBUG LWIP_DBG_OFF
#define API_LIB_DEBUG LWIP_DBG_ON #define API_LIB_DEBUG LWIP_DBG_OFF
#define API_MSG_DEBUG LWIP_DBG_ON #define API_MSG_DEBUG LWIP_DBG_OFF
#define TCPIP_DEBUG LWIP_DBG_ON #define TCPIP_DEBUG LWIP_DBG_OFF
#define NETIF_DEBUG LWIP_DBG_ON #define NETIF_DEBUG LWIP_DBG_OFF
#define SOCKETS_DEBUG LWIP_DBG_ON #define SOCKETS_DEBUG LWIP_DBG_OFF
#define DNS_DEBUG LWIP_DBG_ON #define DNS_DEBUG LWIP_DBG_OFF
#define AUTOIP_DEBUG LWIP_DBG_ON #define AUTOIP_DEBUG LWIP_DBG_OFF
#define DHCP_DEBUG LWIP_DBG_ON #define DHCP_DEBUG LWIP_DBG_ON
#define IP_DEBUG LWIP_DBG_ON #define IP_DEBUG LWIP_DBG_OFF
#define IP_REASS_DEBUG LWIP_DBG_ON #define IP_REASS_DEBUG LWIP_DBG_OFF
#define ICMP_DEBUG LWIP_DBG_ON #define ICMP_DEBUG LWIP_DBG_OFF
#define IGMP_DEBUG LWIP_DBG_ON #define IGMP_DEBUG LWIP_DBG_OFF
#define UDP_DEBUG LWIP_DBG_ON #define UDP_DEBUG LWIP_DBG_OFF
#define TCP_DEBUG LWIP_DBG_ON #define TCP_DEBUG LWIP_DBG_OFF
#define TCP_INPUT_DEBUG LWIP_DBG_ON #define TCP_INPUT_DEBUG LWIP_DBG_OFF
#define TCP_OUTPUT_DEBUG LWIP_DBG_ON #define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
#define TCP_RTO_DEBUG LWIP_DBG_ON #define TCP_RTO_DEBUG LWIP_DBG_OFF
#define TCP_CWND_DEBUG LWIP_DBG_ON #define TCP_CWND_DEBUG LWIP_DBG_OFF
#define TCP_WND_DEBUG LWIP_DBG_ON #define TCP_WND_DEBUG LWIP_DBG_OFF
#define TCP_FR_DEBUG LWIP_DBG_ON #define TCP_FR_DEBUG LWIP_DBG_OFF
#define TCP_QLEN_DEBUG LWIP_DBG_ON #define TCP_QLEN_DEBUG LWIP_DBG_OFF
#define TCP_RST_DEBUG LWIP_DBG_ON #define TCP_RST_DEBUG LWIP_DBG_OFF
#endif #endif
#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT) #define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT)
@ -306,4 +307,6 @@ a lot of data that needs to be copied, this should be set high. */
#endif /* PPP_SUPPORT */ #endif /* PPP_SUPPORT */
#define LWIP_NETIF_STATUS_CALLBACK 1
#endif /* __LWIPOPTS_H__ */ #endif /* __LWIPOPTS_H__ */

@ -124,7 +124,7 @@
* *
* When mainSELECTED_APPLICATION is set to 2 the lwIP example will be run. * When mainSELECTED_APPLICATION is set to 2 the lwIP example will be run.
*/ */
#define mainSELECTED_APPLICATION 2 #define mainSELECTED_APPLICATION 1
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/

Loading…
Cancel
Save