Hello,I am using lwip 2.0.2 RAW API + freertos 8.2.3.I have to send a lot of
data received by CAN toEthernet.I receive CAN data in a CAN Interrupt and
enque them here.In a 3ms task I periodically check the queue for new dataand
send them via tcp_write() and tcp_output().It seems to work fine but after a
few seconds I stuck into"tcp_write: pbufs on queue => at least one queue
non-empty". if (pcb->snd_queuelen != 0)   {    LWIP_ASSERT("tcp_write: pbufs
on queue => at least one queue non-empty",      pcb->unacked != NULL ||
pcb->unsent != NULL);  } else {    LWIP_ASSERT("tcp_write: no pbufs on queue
=> both queues empty",      pcb->unacked == NULL && pcb->unsent == NULL); 
}I googled a lot and I read that this could be a thread problem.I don't know
what I am doing wrong. I have been researching for month now,but cannot find
the solution.In main() I am calling:void vStartEthernetTaskLauncher(
unsigned portBASE_TYPE uxPriority ){    /* Spawn the Sentinel task. */
if(xTaskCreate(vStartEthernetTask, "ETHLAUNCH", configMINIMAL_STACK_SIZE,
NULL, uxPriority, (xTaskHandle *)NULL) != pdPASS){              printf("Failed 
to create
Monitor task\r\n");     }}which starts a init
task:portTASK_FUNCTION(vStartEthernetTask, pvParameters){       /* Setup lwIP. 
*/
prvlwIPInit();#if (HTTP_USED == 1)      /* Create the WEB server task.  This 
uses
the lwIP RTOS abstraction layer. */     /*sys_thread_new("WEB", vBasicWEBServer,
(void *)NULL,                   lwipBASIC_WEB_SERVER_STACK_SIZE,                
lwipBASIC_WEB_SERVER_PRIORITY);*/               /* Initialize HTTP Server*/
//httpd_init(); //RAW-API#endif init_SET_TCP_server();#if (TFTP_USED == 1) 
/* Create the TFTP server task.  This uses the lwIP RTOS abstraction layer.
*/      sys_thread_new("TFTP", vBasicTFTPServer, (void *)NULL,          
lwipBASIC_TFTP_SERVER_STACK_SIZE,               
lwipBASIC_TFTP_SERVER_PRIORITY);#endif#if (SMTP_USED == 1)  /* Create the
SMTP Client task.  This uses the lwIP RTOS abstraction layer. */
sys_thread_new("SMTP", vBasicSMTPClient, (void *)NULL,          
lwipBASIC_SMTP_CLIENT_STACK_SIZE,                       
lwipBASIC_SMTP_CLIENT_PRIORITY);#endif
/* Kill this task. */   vTaskDelete(NULL);}My task which checks for new queue
entries and sends them is seen here:void CAN_TO_ETH_TASK(void
*pvParameters){ ( void ) pvParameters;  CANMSGOBJ can_tx_msgobj;        uint32_t
supersize = 0;          uint32_t pdu_bytes = 0; char ucrecBuff[1460] = {0};     
uint8_t
number_of_pdus = 0;     uint8_t returnvalue;    uint8_t can_msg_size = 32;      
uint8_t
headersize = 12;        uint8_t queuecounter = 0;       uint8_t fillup = 0;     
SET_PDU_t
*pdu;           portTickType xLastWakeTime;     const portTickType xFrequency =
CAN_TO_ETH_CYCLE_TIME_MS;       xLastWakeTime = xTaskGetTickCount();    //      
struct
pbuf* p_buf;            err_t err, write_error, output_error;
//------------------TASK-----------------------         for(;;) {               
for(queuecounter
= 0; queuecounter < NUM_ACTIVE_CAN_CHANNELS; queuecounter++)            {       
        
output_error = ERR_OK;                  write_error = ERR_OK;                   
number_of_pdus = 0;                                     
if(xQueueReceive(can_to_ether_q[queuecounter], &can_tx_msgobj, 0) ==
pdTRUE)// && tcp_active_pcbs != NULL)                   {                       
        if(tcp_active_pcbs != NULL)                     
{                                       returnvalue = pdTRUE;                   
                                                        //As long there is sth. 
in the queue...                         
while(returnvalue == pdTRUE && number_of_pdus < 46)                             
        {                                               //create
sending pdu                                             pdu = 
&ucrecBuff[headersize+number_of_pdus*can_msg_size];                             
          
pdu->direction = can_tx_msgobj.Channel;                                         
pdu->errorCode = 0x00;                                  
pdu->sequenceCounter = 0x00;                                            
pdu->flags.all = 0x00;                                          pdu->paramID =
0x26;                                           pdu->data.can_payload.timestamp 
= xTaskGetTickCount();                                  
pdu->data.can_payload.identifier = can_tx_msgobj.CANMSG.id;                     
                                                                
if(can_tx_msgobj.CANMSG.extended)                                               
pdu->data.can_payload.identifier |=
0x20000000;                                                                     
                        pdu->data.can_payload.typ1 = 0x00;                      
                
pdu->data.can_payload.infoA = 0x00;                                             
pdu->data.can_payload.infoB = 0x00;                                     
pdu->data.can_payload.dlc = can_tx_msgobj.CANMSG.dlc;                           
                                                        
memcpy(pdu->data.can_payload.char_data, can_tx_msgobj.CANMSG.data,
can_tx_msgobj.CANMSG.dlc);                                                      
                                        //fill up with 0.                       
                
if(can_tx_msgobj.CANMSG.dlc < 8)                                                
{                                                       for(fillup =
can_tx_msgobj.CANMSG.dlc; fillup < 8; fillup++)                                 
                {                                                       
pdu->data.can_payload.char_data[fillup] = 0x00;                                 
                }                                               }               
                                                                        
if(number_of_pdus <46-1)                                                        
returnvalue =
xQueueReceive(can_to_ether_q[queuecounter], &can_tx_msgobj, 0);                 
                
number_of_pdus++;                                       }                       
                //---------------------Writing
part-----------------------------------                                 
pdu_bytes =
number_of_pdus*can_msg_size;                                    
memcpy(&ucrecBuff[8], &pdu_bytes,
sizeof(pdu_bytes));                                     supersize = 
headersize+number_of_pdus*can_msg_size;                                         
                            
struct tcp_pcb *pcb = tcp_active_pcbs;                                  bool 
foundflag = false;                                                              
   
while(pcb != NULL)                                      {   //Only certain 
combinations of ports and CAN
channels are valid                                              
if((pcb->local_port == PortCAN1 &&
can_tx_msgobj.Channel == CAN0)|| //5459 and CAN0                                
                (pcb->local_port ==
PortCAN2 && can_tx_msgobj.Channel == CAN1)|| //5460 and CAN1                    
                
(pcb->local_port == PortCAN3 && can_tx_msgobj.Channel == CAN2))  //5461 and
CAN2                                            {                               
                        foundflag = true;                                       
                //Check for sufficant sending
buffer                                                  if(tcp_sndbuf(pcb) >= 
(supersize))                                                      {             
                                                  pcb->flags |=
(TF_NODELAY);                                                           
write_error = tcp_write(pcb, ucrecBuff, supersize,
TCP_WRITE_FLAG_COPY);                                                           
System.led.cBlinkData += 1;                                                     
        output_error
= tcp_output(pcb);                                                      }       
                                                else if(tcp_sndbuf(pcb) < 
(supersize))                                          
{                                                               
set_SystemStatus(SYSTEM_WARNING, 17);                                           
                System.led.cBlinkError
+= 2;                                                   }                       
                        }                                               
//Pointer to next protocol control block                                        
        pcb
= pcb->next;                                    }                               
                                                if(foundflag == false || 
write_error != ERR_OK
|| output_error != ERR_OK)                                      {               
                                set_SystemStatus(SYSTEM_ERROR, 7);              
                        
System.led.cBlinkError += 2;                                    }               
                
//----------------------------------------------------------------------        
                
} //end if                              //No tcp connection found               
                else if (tcp_active_pcbs == NULL)                       
{                                       set_SystemStatus(SYSTEM_WARNING, 24);   
                                System.led.cBlinkError += 2;
//Element im Queue jedoch keine aktive Verbindung                               
}                       } //end if              } //end
user for                vTaskDelayUntil(&xLastWakeTime, xFrequency); //Pause    
//----------------------------------------------------------------------------------------------------------------------
} //end for}My lwipopts are the following:/* * lwipopts.h * * Created:
30.03.2017 11:11:16 *  Author: motz.werner */ #ifndef LWIPOPTS_H_#define
LWIPOPTS_H_//#include "conf_lwip_threads.h"#include "lwip/debug.h"#include
"conf_tasks.h"/** * NO_SYS==1: Provides VERY minimal functionality.
Otherwise, * use lwIP facilities. * Uses Raw API only. */#define NO_SYS         
        
0#define LWIP_RAW                                       0   /* These are not 
available when using "NO_SYS"
*/#define LWIP_NETCONN                  0#define LWIP_SOCKET                    
0/*
Define default values for unconfigured parameters. */#define LWIP_NOASSERT 0
/* To suppress some errors for now (no debug output) */#define LWIP_DEBUG
0/* These two control is reclaimer functions should be compiled * in. Should
always be turned on (1). */#define MEM_RECLAIM             1#define
MEMP_RECLAIM            1/* Platform specific locking *//* * enable
SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection * for
certain critical regions during buffer allocation, deallocation and memory *
allocation and deallocation. */#define SYS_LIGHTWEIGHT_PROT            1/*
---------- Memory options ---------- *//* MEM_ALIGNMENT: should be set to
the alignment of the CPU for which * lwIP is compiled. 4 byte alignment ->
define MEM_ALIGNMENT to 4, 2 * byte alignment -> define MEM_ALIGNMENT to 2.
*/#define MEM_ALIGNMENT           4/* MEM_SIZE: the size of the heap memory.
If the application will send * a lot of data that needs to be copied, this
should be set high. */#define MEM_SIZE                8 * 1024/*
MEMP_NUM_PBUF: the number of memp struct pbufs. If the application * sends a
lot of data out of ROM (or other static memory), this * should be set high.
*/#define MEMP_NUM_PBUF            6/* Number of raw connection PCBs
*/#define MEMP_NUM_RAW_PCB                5//1   <----- Hier geändert/*
---------- UDP options ---------- */  #define LWIP_UDP                1 
#define UDP_TTL                 255/* MEMP_NUM_UDP_PCB: the number of UDP
protocol control blocks. One * per active UDP "connection". *//* required by
DHCP (because DNS is used) */  #define MEMP_NUM_UDP_PCB        1#if
(TFTP_USED == 1)/* one PCB for DHCP (DNS used), one for TFTP */  #undef
MEMP_NUM_UDP_PCB  #define MEMP_NUM_UDP_PCB        2#endif/*
MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections.
*/#define MEMP_NUM_TCP_PCB        8//2/* MEMP_NUM_TCP_PCB_LISTEN: the number
of listening TCP connections. */#define MEMP_NUM_TCP_PCB_LISTEN 8//1/*
MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.
*/#define MEMP_NUM_TCP_SEG        48 //8                                        
                                                                                
                
//--------------------/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously
active timeouts. */#define MEMP_NUM_SYS_TIMEOUT    6/* 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//3/* MEMP_NUM_NETCONN:
the number of struct netconns. */#define MEMP_NUM_NETCONN        8//4/*
---------- Pbuf options ---------- *//* PBUF_POOL_SIZE: the number of
buffers in the pbuf pool. */#define PBUF_POOL_SIZE          8/*
PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */#define
PBUF_POOL_BUFSIZE       2048//3000//500                                         
                                                        
//!!!!!!!!!!!!!!!!!!!!!!!!/** ETH_PAD_SIZE: number of bytes added before the
ethernet header to ensure * alignment of payload after that header. Since
the header is 14 bytes long, * without this padding e.g. addresses in the IP
header will not be aligned * on a 32-bit boundary, so setting this to 2 can
speed up 32-bit-platforms. */#define ETH_PAD_SIZE                    0   /*
PBUF_LINK_HLEN: the number of bytes that should be allocated for a * link
level header. */#define PBUF_LINK_HLEN          (16 + ETH_PAD_SIZE)/*
---------- TCP options ---------- */#define LWIP_TCP                1#define
TCP_TTL                 255/* TCP receive window. */#define TCP_WND             
   
4 * TCP_MSS//3000     <------ Hier geändert/* Controls if TCP should queue
segments that arrive out of * order. Define to 0 if your device is low on
memory. */#define TCP_QUEUE_OOSEQ         1/* TCP Maximum segment size.
*/#define TCP_MSS                 1460/* TCP sender buffer space (bytes).
*/#define TCP_SND_BUF             16*TCP_MSS   /* TCP sender buffer space
(pbufs). This must be at least = 2 *   TCP_SND_BUF/TCP_MSS for things to
work. */#define TCP_SND_QUEUELEN       48//(TCP_SND_BUF/TCP_MSS)*2// ((6 *
(TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))   <-----Hier geändert war 16/*
Maximum number of retransmissions of data segments. */#define TCP_MAXRTX        
     
12/* Maximum number of retransmissions of SYN segments. */#define
TCP_SYNMAXRTX           4/** * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size
for the incoming packets on a * NETCONN_RAW. The queue size value itself is
platform-dependent, but is passed * to sys_mbox_new() when the recvmbox is
created. */#define DEFAULT_RAW_RECVMBOX_SIZE       6/** *
DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a *
NETCONN_UDP. The queue size value itself is platform-dependent, but is
passed * to sys_mbox_new() when the recvmbox is created. */#define
DEFAULT_UDP_RECVMBOX_SIZE       6/** * DEFAULT_TCP_RECVMBOX_SIZE: The
mailbox size for the incoming packets on a * NETCONN_TCP. The queue size
value itself is platform-dependent, but is passed * to sys_mbox_new() when
the recvmbox is created. */#define DEFAULT_TCP_RECVMBOX_SIZE       6/** *
DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. *
The queue size value itself is platform-dependent, but is passed to *
sys_mbox_new() when the acceptmbox is created. */#define
DEFAULT_ACCEPTMBOX_SIZE         6/* ---------- ARP options ----------
*/#define ARP_TABLE_SIZE 10#define ARP_QUEUEING 0/* ---------- IP options
---------- *//* Define IP_FORWARD to 1 if you wish to have the ability to
forward * IP packets across network interfaces. If you are going to run lwIP
* on a device with only one network interface, define this to 0. */#define
IP_FORWARD              0/* If defined to 1, IP options are allowed (but not
parsed). If * defined to 0, all packets with IP options are dropped.
*/#define IP_OPTIONS              1/* ---------- ICMP options ----------
*/#define ICMP_TTL                255/* ---------- DHCP options ----------
*//* Define LWIP_DHCP to 1 if you want DHCP configuration of * interfaces.
DHCP is not implemented in lwIP 0.5.1, however, so * turning this on does
currently not work. */#define LWIP_DHCP               1#ifdef
LWIP_DHCP//#define DHCP_USED#endif/* 1 if you want to do an ARP check on the
offered address * (recommended). *//* #define DHCP_DOES_ARP_CHECK     1 *//*
* ------------------------------------ * ---------- Thread options
---------- * ------------------------------------ *//** * TCPIP_THREAD_NAME:
The name assigned to the main tcpip thread. */#define TCPIP_THREAD_NAME         
    
"TCP/IP"/** * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip
thread. * The stack size value itself is platform-dependent, but is passed
to * sys_thread_new() when the thread is created. */#define
TCPIP_THREAD_STACKSIZE          lwipINTERFACE_STACK_SIZE/** *
TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. * The
priority value itself is platform-dependent, but is passed to *
sys_thread_new() when the thread is created. */#define TCPIP_THREAD_PRIO        
      
lwipINTERFACE_TASK_PRIORITY/** * TCPIP_MBOX_SIZE: The mailbox size for the
tcpip thread messages * The queue size value itself is platform-dependent,
but is passed to * sys_mbox_new() when tcpip_init is called. */#define
TCPIP_MBOX_SIZE                 6/** * SLIPIF_THREAD_NAME: The name assigned
to the slipif_loop thread. */#define SLIPIF_THREAD_NAME            
"slipif"/** * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop
thread. * The stack size value itself is platform-dependent, but is passed
to * sys_thread_new() when the thread is created. */#define
SLIPIF_THREAD_STACKSIZE         configMINIMAL_STACK_SIZE/** *
SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. * The
priority value itself is platform-dependent, but is passed to *
sys_thread_new() when the thread is created. */#define SLIPIF_THREAD_PRIO       
      
1/** * PPP_THREAD_NAME: The name assigned to the pppMain thread. */#define
PPP_THREAD_NAME                "pppInputThread"/** * PPP_THREAD_STACKSIZE:
The stack size used by the pppMain thread. * The stack size value itself is
platform-dependent, but is passed to * sys_thread_new() when the thread is
created. */#define PPP_THREAD_STACKSIZE           
configMINIMAL_STACK_SIZE/** * PPP_THREAD_PRIO: The priority assigned to the
pppMain thread. * The priority value itself is platform-dependent, but is
passed to * sys_thread_new() when the thread is created. */#define
PPP_THREAD_PRIO                 1/** * DEFAULT_THREAD_NAME: The name
assigned to any other lwIP thread. */#define DEFAULT_THREAD_NAME           
"lwIP"/** * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP
thread. * The stack size value itself is platform-dependent, but is passed
to * sys_thread_new() when the thread is created. */#define
DEFAULT_THREAD_STACKSIZE        configMINIMAL_STACK_SIZE/** *
DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. * The
priority value itself is platform-dependent, but is passed to *
sys_thread_new() when the thread is created. */#define DEFAULT_THREAD_PRIO      
      
1#define LWIP_NETIF_STATUS_CALLBACK      1/* ---------- Statistics options
---------- */#define LWIP_STATS 1#define LWIP_STATS_DISPLAY 1#if
LWIP_STATS#define LINK_STATS 1#define IP_STATS   1#define ICMP_STATS
1#define UDP_STATS  1#define TCP_STATS  1#define MEM_STATS  1#define
MEMP_STATS 1#define PBUF_STATS 1#define SYS_STATS  1#endif /* STATS *//*
---------- Lwip Debug options ---------- *///LWIP_DBG_ON#define DBG_TYPES_ON    
               
0xff#define ETHARP_DEBUG                    LWIP_DBG_OFF#define NETIF_DEBUG     
               
LWIP_DBG_OFF//LWIP_DBG_ON#define PBUF_DEBUG                     
LWIP_DBG_OFF//LWIP_DBG_ON#define API_LIB_DEBUG                  
LWIP_DBG_OFF#define API_MSG_DEBUG                  
LWIP_DBG_OFF//LWIP_DBG_ON#define SOCKETS_DEBUG                  
LWIP_DBG_OFF#define ICMP_DEBUG                      LWIP_DBG_OFF#define
INET_DEBUG                      LWIP_DBG_OFF#define IP_DEBUG                    
   
LWIP_DBG_OFF#define IP_REASS_DEBUG                  LWIP_DBG_OFF#define
RAW_DEBUG                       LWIP_DBG_OFF#define MEM_DEBUG                   
   
LWIP_DBG_OFF#define MEMP_DEBUG                      LWIP_DBG_OFF#define
SYS_DEBUG                       LWIP_DBG_OFF#define TCP_DEBUG                   
   
LWIP_DBG_OFF//LWIP_DBG_ON#define TCP_INPUT_DEBUG                
LWIP_DBG_OFF#define TCP_FR_DEBUG                    LWIP_DBG_OFF#define
TCP_RTO_DEBUG                   LWIP_DBG_OFF#define TCP_CWND_DEBUG              
   
LWIP_DBG_OFF#define TCP_WND_DEBUG                   LWIP_DBG_OFF#define
TCP_OUTPUT_DEBUG                LWIP_DBG_OFF#define TCP_RST_DEBUG               
   
LWIP_DBG_OFF#define TCP_QLEN_DEBUG                  LWIP_DBG_OFF#define
UDP_DEBUG                       LWIP_DBG_OFF#define TCPIP_DEBUG                 
   
LWIP_DBG_OFF#define DBG_MIN_LEVEL                   LWIP_DBG_LEVEL_SEVERE/*
\note For a list of all possible lwIP configurations, check *
http://lwip.wikia.com/wiki/Lwipopts.h
*///*****************************************************************************////
---------- httpd options
----------////*****************************************************************************#define
INCLUDE_HTTPD_SSI#define INCLUDE_HTTPD_CGI#define
LWIP_HTTPD_DYNAMIC_HEADERS#endif /* LWIPOPTS_H_ */I hope somebody can help
me.



--
View this message in context: 
http://lwip.100.n7.nabble.com/lwip-2-0-2-freertos-8-2-3-ARM7-tp29598.html
Sent from the lwip-users mailing list archive at Nabble.com.
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to