lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-users] Problems with sending UDP packets in FreeRTOS


From: Mike Fleetwood
Subject: [lwip-users] Problems with sending UDP packets in FreeRTOS
Date: Wed, 27 Jul 2016 16:07:22 +0100

Hi,

I’m hoping someone can help me with a problem that has been causing me grief for a few days now!

 

I am writing an RTP audio system, that needs to send a packet of audio data every 4mS.  This is in a multi-thread RTOS environment, running on STM32F427, with initial code generated using ST’s “Cube” (wish I hadn’t!).  I have threads to handle NetBIOS and HTTP, but they are all disabled at the moment.

 

The problem I’m having is that after a variable length of time – sometimes immediately on start-up, sometimes after half an hour – the code stops working.  The central “netconn_send” returns with “ERR_USE”.  I have tried many variations with this code, all showing the same problem.  None of the other error warnings get activated, only the GPIO pins set to indicate the error.

 

Question 1: Why should send return with ERR_USE?  At present there is only one connection and it is only bound/connected once – outside the loop.  I get the same error with connection within the loop, or if I use sendto instead.

 

Question 2: Why does this supposedly non-fatal error cause all lower level LWIP functions to stop?  If I have the HTTP thread running (to show status/fault information) it also stops.

 

Question 3: Why does not SOF_REUSEADDR mask the error (SO_REUSE is enabled in lwipopts)?

 

Many thanks,

Mike.

 

void udp_test(void *arg)

{

  struct netconn *conn;

  struct netbuf *buf;

  char *data;

  err_t err;

  uint16_t index;

  size_t bufsize = 100;

 

  conn = netconn_new(NETCONN_UDP);

  if (conn == NULL) debugmessage("Could not create new netconn for UDP test<br>");

  if (conn != NULL)

  {

    ip_set_option(conn->pcb.udp, SOF_REUSEADDR);

 

    err = netconn_bind(conn, IP_ADDR_ANY, 5004);

    if (err != ERR_OK) debugmessage("Could not bind to port 5004 for RTP data<br>");

 

//    err = netconn_connect(conn, IP_ADDR_BROADCAST, 5004);

//    if (err != ERR_OK) debugmessage("Could not connect port 5004 to BROADCAST for RTP data<br>");

   

//    while(1)

    {

      buf = netbuf_new();

      if (buf == NULL) debugmessage("Could not create netbuf for UDP test<br>");

      if (buf != NULL)

      {

        data = "" bufsize);

        if (data == NULL) debugmessage("Could not allocate pointer to UDP test data in netbuf<br>");

        if (data != NULL)

        {

          while(1)

          {

            HAL_GPIO_WritePin(CONT6_GPIO_Port, CONT6_Pin, GPIO_PIN_SET);

            for (index = 0; index <bufsize; index++)

            {

              data[index] = index;

            }

//            err = netconn_send(conn, buf);

            err = netconn_sendto(conn, buf, IP_ADDR_BROADCAST, 5004);

            if (err == ERR_USE) HAL_GPIO_WritePin(CONT3_GPIO_Port, CONT3_Pin, GPIO_PIN_SET);

            if (err == ERR_MEM) HAL_GPIO_WritePin(CONT4_GPIO_Port, CONT4_Pin, GPIO_PIN_SET);

            if (err != ERR_OK) HAL_GPIO_WritePin(CONT5_GPIO_Port, CONT5_Pin, GPIO_PIN_SET);

            HAL_GPIO_WritePin(CONT6_GPIO_Port, CONT6_Pin, GPIO_PIN_RESET);

            osDelay(4);

          }

          netbuf_delete(buf);

        }

      }

//      osDelay(4);

    }

  }

}

Sent from Mail for Windows 10

 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]