maufil wrote on Wednesday, May 21, 2008:
Hi all,
I’m doing a demo on udp lwip working for Str91x with Rowley. My demo is not getting send packages udp, in my opinion there is a problem when the FreeRTOS launches task. Below is my code, to understand how to launch the task I have taken inspiration from demo WebServer included in the package FreeRTOS 5.
someone can help me? it’s my code ok?
===========================================MAIN.C=========
…
#ifdef STACK_LWIP
/* Create the lwIP task. This uses the lwIP RTOS abstraction layer.*/
vlwIPInit();
sys_set_state( ( signed portCHAR * ) "httpd", lwipBASIC_SERVER_STACK_SIZE );
sys_thread_new( vBasicWEBServer, ( void * ) NULL, ( tskIDLE_PRIORITY + 2 )basicwebWEBSERVER_PRIORITY );
sys_set_default_state();
#endif
…
=========================================UDP_SENDER.H========
…
#ifndef UDP_SENDER_H
#define UDP_SENDER_H
#include <91x_type.h>
/*------------------------------------------------------------------------------*/
/* MACROS */
/*------------------------------------------------------------------------------*/
#define basicudp_SENDER_PRIORITY ( tskIDLE_PRIORITY + 2 )
/* The port on which we listen. */
#define webUDP_PORT ( 1234 )
/* Delay on close error. */
#define webSHORT_DELAY ( 10 / portTICK_RATE_MS )
/* The IP address being used. */
#define emacIPADDR0 10
#define emacIPADDR1 200
#define emacIPADDR2 200
#define emacIPADDR3 2
/* The gateway address being used. */
#define emacGATEWAY_ADDR0 10
#define emacGATEWAY_ADDR1 200
#define emacGATEWAY_ADDR2 200
#define emacGATEWAY_ADDR3 1
/* The network mask being used. */
#define emacNET_MASK0 255
#define emacNET_MASK1 255
#define emacNET_MASK2 255
#define emacNET_MASK3 252
#define STATIC_IP 1
#define DHCP_IP 2
#define lwipBASIC_SERVER_STACK_SIZE 250
/*------------------------------------------------------------------------------*/
/* PROTOTYPES */
/*------------------------------------------------------------------------------*/
/* The function that implements the WEB server task. */
void vBasicUDPSender( void *pvParameters );
/* Initialisation required by lwIP. */
void vlwIPInit( void );
#endif
=========================================UDP_SENDER.C==========================
#define basicwebWEBSERVER_PRIORITY ( tskIDLE_PRIORITY + 2 )
#define lwipTCP_STACK_SIZE 600
/* Standard includes. */
#include <stdio.h>
#include <string.h>
#include <91x_type.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
/* Demo includes. */
#include "lwIPWebServer/BasicWEB.h"
#include "udpecho-sender.h"
/* lwIP includes. */
#include "lwip/api.h"
#include "lwip/tcpip.h"
#include "lwip/memp.h"
#include "lwip/stats.h"
#include "Dnetif/loopif.h"
//#include "lcd.h"
#include "httpd.h"
//#define lwipTCP_STACK_SIZE 600
//XXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include "lwip/udp.h"
#include "lwip/mem.h"
#include "lwip/debug.h"
/*------------------------------------------------------------------------------*/
/* GLOBALS */
/*------------------------------------------------------------------------------*/
static struct netif EMAC_if;
/*------------------------------------------------------------------------------*/
/* FUNCTIONS */
/*------------------------------------------------------------------------------*/
void vlwIPInit( void )
{
/* Initialize lwIP and its interface layer. */
sys_init();
mem_init();
memp_init();
pbuf_init();
netif_init();
ip_init();
sys_set_state(( signed portCHAR * ) "lwIP", lwipTCP_STACK_SIZE);
udp_init();
sys_set_default_state();
}
void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
if (p != NULL)
{
/* send received packet back to sender */
udp_sendto(pcb, p, addr, port);
/* free the pbuf */
pbuf_free(p);
}
}
void udp_echo_init(void)
{
struct udp_pcb * pcb;
/* get new pcb */
pcb = udp_new();
if (pcb == NULL) {
LWIP_DEBUGF(UDP_DEBUG, ("udp_new failed!\n"));
return;
}
/* bind to any IP address on port 7 */
if (udp_bind(pcb, IP_ADDR_ANY, UDP_PORT) != ERR_OK) {
LWIP_DEBUGF(UDP_DEBUG, ("udp_bind failed!\n"));
return;
}
/* set udp_echo_recv() as callback function
for received packets */
udp_recv(pcb, udp_echo_recv, NULL);
}
void vBasicWEBServer( void *pvParameters )
{
struct ip_addr xIpAddr, xNetMast, xGateway;
extern err_t ethernetif_init( struct netif *netif );
/* Parameters are not used - suppress compiler error. */
( void ) pvParameters;
/* Create and configure the EMAC interface. */
IP4_ADDR( &xIpAddr, emacIPADDR0, emacIPADDR1, emacIPADDR2, emacIPADDR3 );
IP4_ADDR( &xNetMast, emacNET_MASK0, emacNET_MASK1, emacNET_MASK2, emacNET_MASK3 );
IP4_ADDR( &xGateway, emacGATEWAY_ADDR0, emacGATEWAY_ADDR1, emacGATEWAY_ADDR2, emacGATEWAY_ADDR3 );
netif_add( &EMAC_if, &xIpAddr, &xNetMast, &xGateway, NULL, ethernetif_init, tcpip_input );
/* make it the default interface */
netif_set_default( &EMAC_if );
/* bring it up */
netif_set_up(&EMAC_if);
/* Initialize HTTP */
udp_echo_init();//httpd_init();
/* Nothing else to do. No point hanging around. */
vTaskDelete( NULL );
}
…