Hi,
I am not sure with my reply as this area is not so documented.
What I can see in your lwipopts that you use tons of memory for the LwIP heap
but
other defines are way to small
For example:
#define MEMP_NUM_PBUF 16 <<< ?
#define MEMP_NUM_UDP_PCB 4
#define MEMP_NUM_TCP_PCB 32
#define MEMP_NUM_TCP_PCB_LISTEN 8
I am using a micro (STM32F4 and F2) with limited memory and never had to use
more than 20K RAM.
LwIP own opts.h file has macro’s in it and there is a reason for that. Some
values have relations with other values.
I have attached my own lwipopts.h for your reference. Use it and hopefully it
will help you.
Do understand that I have set up RAW API and Socket API as well. I use mostly
RAW API but as
I am using PolarSSL I need the Socket API as well.
Good luck,
Noam.
From: lwip-users [mailto:[email protected]] On
Behalf Of pekez
Sent: Monday, November 28, 2016 12:18 PM
To: Mailing list for lwIP users
Subject: [lwip-users] lwIP with FreeRTOS memory problem
Hello people,
I've been trying to figure out how lwIP uses memory and it's really important
to know exact (or maximum) amount of memory that lwIP uses. I am using lwIP
v1.4.1 with FreeRTOS v8.2.3 on ZYNQ custom board. Right now, I am working with
application examples provided by Xilinx
(XAPP1026<https://www.xilinx.com/support/documentation/application_notes/xapp1026.pdf>).
On ZYNQ board, I am running iperf<https://en.wikipedia.org/wiki/Iperf> server,
and on PC iperf client.
When both MEMP_MEM_MALLOC and MEM_LIBC_MALLOC are 0 then everything works
completely expected. However, when I set MEMP_MEM_MALLOC to 1 (according to RAM
usage article from lwIP wiki<http://lwip.wikia.com/wiki/Lwipopts.h>), so that
every piece of dynamically allocated memory comes from heap of MEM_SIZE size,
application always crashes, no matter how big or small MEM_SIZE is (I have a
lot of RAM, so I tried to put MEM_SIZE to even more then 20 MB!). Application
crashes because two of FreeRTOS asserts fail, I get these two prints: "Assert
failed in file queue.c, line 1224" and "Assert failed in file port.c, line
424". According to call trace (which I provided in attachments), it crashes
when XEmacPs_IntrHandler (I am using Xilinx layer 2 drivers) tries to allocate
memory for pbuf.
Is this problem even related to lwIP or maybe to FreeRTOS or Xilinx drivers,
what do you think? I am also providing the entire lwipopts.h, so that you can
see whether some other options need to be changed in order to make application
work with MEMP_MEM_MALLOC set to 1.
Thanks in advance.
/**
******************************************************************************
* @file lwipopts.h
* @author MCD Application Team
* @version V1.1.0
* @date 07-October-2011
* @brief lwIP Options Configuration.
* This file is based on Utilities\lwip_v1.3.2\src\include\lwip\opt.h
* and contains the lwIP configuration for the STM32F2x7
demonstration.
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
#include "stdlib.h"
#include "Main.h"
/**
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
* critical regions during buffer allocation, deallocation and memory
* allocation and deallocation.
*/
#define SYS_LIGHTWEIGHT_PROT 1
#define ETHARP_TRUST_IP_MAC 0
#define IP_REASSEMBLY 0
#define IP_FRAG 0
#define ARP_QUEUEING 0
#define TCP_LISTEN_BACKLOG 1
#define LWIP_DNS 1
#define LWIP_NETIF_STATUS_CALLBACK 1
#define IP_SOF_BROADCAST 1
#define IP_SOF_BROADCAST_RECV 1
#define LWIP_IGMP 1
#define SO_REUSE 1
#define LWIP_NETIF_HOSTNAME 1
/**
* NO_SYS==1: Provides VERY minimal functionality. Otherwise,
* use lwIP facilities.
*/
#define NO_SYS 0
/* ---------- 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 (14 * 1024)
/* MEMP_NUM_PBUF: the number of memp struct pbufs.
prevoiusly this was high as we understood that the pBuf buffers
are allocated from the LwIP heap (MEM_SIZE). But after reducing
PBUF_POOL_SIZE to 6 the TCP stack started to get slow and hanged.
We found out that the values were wrong and pBuf are allocated
from the PBUF_POOL and its size is PBUF_POOL_SIZE * PBUF_POOL_BUFSIZE
*/
#define MEMP_NUM_PBUF 25
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
per active UDP "connection". */
#define MEMP_NUM_UDP_PCB 10
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
connections. */
#define MEMP_NUM_TCP_PCB 20
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 15
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
timeouts. */
#define MEMP_NUM_SYS_TIMEOUT 15
/* ---------- TCP options ---------- */
#define LWIP_TCP 1
#define TCP_TTL 255
/* 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 0
/* TCP Maximum segment size. */
//#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU -
IP header size - TCP header size) */
#define TCP_MSS 536
/* TCP sender buffer space (bytes). */
//
// When TCP_SND_BUF was (4*TCP_MSS) we had problems with memory
// alocation. After reducing it to (3*TCP_MSS) we stopped getting
// memory allocation errors. After more testing with memory allocation
// I have reduced it to 2 * MSS and now it look OK with no memory alloocation
// problems !!!
//
#define TCP_SND_BUF (2 * TCP_MSS)
/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
#define TCP_SND_QUEUELEN (6 * (TCP_SND_BUF)/(TCP_MSS))
/* TCP receive window. */
#define TCP_WND (4 * TCP_MSS)
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
segments. */
//#define MEMP_NUM_TCP_SEG 20
#define MEMP_NUM_TCP_SEG TCP_SND_QUEUELEN // 20 // This was previosly
20 and cause a MEM_ERR it was changed
// to BE THE SAME SIZE AS
TCP_SND_QUEUELEN
/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE MEMP_NUM_PBUF
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS + 40 +
PBUF_LINK_HLEN)
/* ---------- Netbuf options ---------- */
/* MEMP_NUM_NETBUF: the number of struct netbufs.*/
#define MEMP_NUM_NETBUF 6
/* MEMP_NUM_NETCONN: the number of struct netconns.*/
#define MEMP_NUM_NETCONN 6
/* ---------- ICMP options ---------- */
#define LWIP_ICMP 1
/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
interfaces.
*/
#define LWIP_DHCP 1
#define LWIP_NETIF_LINK_CALLBACK 1
/* ---------- UDP options ---------- */
#define LWIP_UDP 1
#define UDP_TTL 255
/* ---------- Statistics options ---------- */
#define LWIP_STATS 0
#define LWIP_PROVIDE_ERRNO 1
/*
--------------------------------------
---------- Checksum options ----------
--------------------------------------
*/
/*
The STM32F2x7 allows computing and verifying the IP, UDP, TCP and ICMP
checksums by hardware:
- To use this feature let the following define uncommented.
- To disable it and process by CPU comment the the checksum.
!!! for some reason uncommenting this causes PING not to work ???
*/
//#define CHECKSUM_BY_HARDWARE
#ifdef CHECKSUM_BY_HARDWARE
/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP
packets.*/
#define CHECKSUM_GEN_IP 0
/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP
packets.*/
#define CHECKSUM_GEN_UDP 0
/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP
packets.*/
#define CHECKSUM_GEN_TCP 0
/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP
packets.*/
#define CHECKSUM_CHECK_IP 0
/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP
packets.*/
#define CHECKSUM_CHECK_UDP 0
/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP
packets.*/
#define CHECKSUM_CHECK_TCP 0
#else
/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP
packets.*/
#define CHECKSUM_GEN_IP 1
/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP
packets.*/
#define CHECKSUM_GEN_UDP 1
/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP
packets.*/
#define CHECKSUM_GEN_TCP 1
/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP
packets.*/
#define CHECKSUM_CHECK_IP 1
/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP
packets.*/
#define CHECKSUM_CHECK_UDP 1
/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP
packets.*/
#define CHECKSUM_CHECK_TCP 1
#endif
/*
----------------------------------------------
---------- Sequential layer options ----------
----------------------------------------------
*/
/**
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
*/
#define LWIP_NETCONN 1
/*
------------------------------------
---------- Socket options ----------
------------------------------------
*/
/**
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
*/
#define LWIP_SOCKET 1
/*
-----------------------------------
---------- DEBUG options ----------
-----------------------------------
*/
#define LWIP_DEBUG 0
/**
* TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments.
*/
#define TCP_SYNMAXRTX 4
/*
---------------------------------
---------- RAW options ----------
---------------------------------
*/
/**
* LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
*/
#define LWIP_RAW 1
/**
* NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1
* Mainly for compatibility to old versions.
*/
#define NO_SYS_NO_TIMERS 0
/*
---------------------------------
---------- OS options ----------
---------------------------------
!!!! for some reason when I triad moving the following
definitions to the head of the file TCP was not functioning ????
*/
// this is a must if we use IGMP
#if ((LWIP_IGMP == 1) || (LWIP_DHCP == 1))
#define LWIP_RAND() ((u32)rand())
#endif
#define TCPIP_THREAD_NAME "tcp/ip"
#define TCPIP_THREAD_STACKSIZE 2500
#define TCPIP_MBOX_SIZE 5
#define DEFAULT_UDP_RECVMBOX_SIZE 2000
#define DEFAULT_TCP_RECVMBOX_SIZE 2000
#define DEFAULT_ACCEPTMBOX_SIZE 2000
#define DEFAULT_THREAD_STACKSIZE 1000
#define TCPIP_THREAD_PRIO mainTCP_TASK_PRIORITY
#endif /* __LWIPOPTS_H__ */
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users