请教lwip高手,如何解决lwiptomcat内存溢出问题题

用户名:nyc1991
文章数:36
评论数:12
访问量:58861
注册日期:
阅读量:1297
阅读量:3317
阅读量:445116
阅读量:1130839
51CTO推荐博文
& & 前段时间一直在调试lwip协议栈的问题,在stm32F107上实现一个C/S 架构的通信程序。项目初期的时候设计的是B/S架构的控制,然后在使用过程中发现了些限制,因为芯片自身的RAM有限,所以跑B/S的server端略显压力,为了处理类似动态网页内容,开辟一个5K的缓冲区,然后一次tcp_write就可以将内容发送给浏览器了,当然网页内容也是比较简单,考虑到后续可能会有更多的数据处理,故决定开发一个C/S架构的控制。
& & & & &上位机client倒是没什么太多可说的,自己封装下基本的winsock操作。考虑到用TCP协议传输简单地封装了下数据封包和拆包的协议,然后MFC作为图形界面。在stm32端主要采用lwip的RAW API,然后利用callback的方式处理接收上位机命令、数据后的处理,初始化服务器的代码如下:
& & & & &void Server_init(void)
& & & & & & & & & struct tcp_pcb *
& & & & & & & & & pcb = tcp_new(); // 动态创建一个pcb
& & & & & & & & & tcp_bind(pcb, IP_ADDR_ANY, 8082); &// 绑定端口8082
& & & & & & & & & pcb = tcp_listen(pcb); // 开始监听
& & & & & & & & & tcp_accept(pcb, Server_accept); // accept成功时的回调函数 & & & & & & & & & & & & & & & & & & &&
然后在Server_accept中也主要是初始化一些回调函数,
& & & & &static err_t Server_accept(void *arg, struct tcp_pcb *pcb, err_t err)
& & & & & & & & & tcp_err(pcb, Server_conn_err); // 错误时的回调函数
& & & & & & & & & tcp_recv(pcb, Server_recv); // 接收到数据后的回调函数
& & & & & & & & & tcp_sent(pcb, Server_sent); // tcp_write数据成功发送后的回调函数
& & & & & & & & & gRemoteIp = pcb-&remote_ // 获取远程客户端的地址
& & & & & & & & & return ERR_OK;
最重要的函数就是Server_recv()了,在这个函数中,根据客户端不同的命令,然后处理相应的数据发送给客户端,但这是问题就暴露出来了。截取一段发送数据的简化代码:
for(i = 0; i & WMFlag.WM_Record_N ++i) {
& & & & &SendCharBuff(pcb, WMTempData, strlen(WMTempData), PT_TEXT);
其中SendCharBuff主要是调用tcp_write函数,这个当WM_Record_Num这个数值很大时,客户端总是接收不全,后来经过反复地进行实验发现,然来是tcp_write这个函数在循环到12次的时候会返回ERR_MEM的内存错误,这个问题让我百思不得其解,然后通过网上的一些资料,很多人说是lwip协议栈有BUG,然后我姑且相信了这个结论,但是有BUG也得继续调呀。于是便想到了winsock里面有个WSAGetLastError()这个函数,但是lwip里面却没有,网上找了找说可以开启lwip的调试功能,于是乎就开始设置lwip的调试功能了。
关于开启LWIP的调试功能主要的设置如下:
1、 &在src/include/lwip目录中找到debug.h这个文件,然后在里面添加如下代码
// Add By 风格独特
// 增加串口调试功能
// 声明外部的USART2_Printf串口输出调试信息函数
extern void USART2_Printf(const char *format, ...);
// 定义格式化内容的宏
// PS 通过调试这个宏发现了以前不知道的一个小知识,那就是字符串可以这样表示
// &aaaa& &bbb& == &aaaabbb&
#define U8_F &c&
#define S8_F &c&
#define X8_F &x&
#define U16_F &u&
#define S16_F &d&
#define X16_F &x&
#define U32_F &u&
#define S32_F &d&
#define X32_F &x&
// 设置调试的宏,注释这个宏可以关闭调试功能
#define LWIP_DEBUG
#define LWIP_PLATFORM_DIAG(x) USART2_Printf x
// Add End
2、 &在src/include/lwip目录中找到opt.h这个文件,然后找到如下代码
#ifndef TCP_OUTPUT_DEBUG
#define TCP_OUTPUT_DEBUG & & & & & & & &LWIP_DBG_OFF
& & & & &其中将LWIP_DBG_OFF改为LWIP_DBG_ON,即开启了TCP_OUT_DEBUG的调试,当然如果想开启其他的调试输出,就可以将相应的地方改为LWIP_DBG_ON即可。
3、 &实现USART2_Printf这个函数,代码如下
void USART2_Printf(const char *format,...)
& & & & &int iOutL
& & & & &char buf[256];
& & & & &va_list arg_
& & & & &va_start(arg_ptr, format);
& & & & &iOutLen = vsprintf(buf, format, arg_ptr);
& & & & &va_end(arg_ptr);
& & & & &USART_SendStr(buf, iOutLen);
开启调试后得到如下的调试输出信息:
& & & & &tcp_enqueue: 12 (after enqueued)
tcp_write(pcb=20009c1c, data=08003a24, len=6, apiflags=1)
tcp_enqueue(pcb=20009c1c, arg=08003a24, len=6, flags=0, apiflags=1)
tcp_enqueue: queuelen: 12
tcp_enqueue: too long queue 12 (max 12)
tcp_output_segment:
State: ESTABLISHED
可以看出在tcp_enqueue第12次的时候输出了too long queue 12 (max 12),超出最大的列队次数,于是在工程中搜索too long queue这句话,在tcp_out.c文件中找到了如下代码:
if ((queuelen & TCP_SND_QUEUELEN) || (queuelen & TCP_SNDQUEUELEN_OVERFLOW)) {
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, (&tcp_enqueue: queue too long %&U16_F& (%&U16_F&)\n&, queuelen, TCP_SND_QUEUELEN));
然后发现TCP_SND_QUEUELEN的值为12,跟到TCP_SND_QUEUELEN的定义代码:
#define TCP_SND_BUF & & & & & & (2*TCP_MSS) &// 发送缓冲区,为两个MSS的大小
// 此参数限制了tcp_write的次数,系数默认为6, 改为3000
#define TCP_SND_QUEUELEN & & & &(3000 * TCP_SND_BUF)/TCP_MSS
于是将那个默认的系数由6改为3000,再次测试时发现可以连续tcp_write超过12次了,于是解决了tcp_write的连续多次调用后失败的问题。
最后补充一下tcp_write这个函数的最后一个参数的说明,该函数的声明如下
err_t tcp_write(struct tcp_pcb *pcb, void *dataptr, u16_t len, u8_t copy);
其中第四个参数是一个copy参数,当为0时为不拷贝数据,也就是在dataptr所指的缓冲区里面发送数据,因为调用tcp_write成功后数据并不会立即发送,所以要确保dataptr所指的缓冲区内容保持不变,如果调用tcp_write成功后,再改变dataptr缓冲区可能就会和预期发送的数据不相符,当时我也碰到过这个问题,后来将最后的参数改为1,为1时即拷贝缓冲区内容,当执行tcp_write时,会将dataptr所指向的缓冲区内容先拷贝到发送的缓冲区中,这样的话执行tcp_write之后再改变dataptr所指的内容是不影响数据的正确发送的。
了这篇文章
类别:┆阅读(0)┆评论(0)请教lwip高手,如何解决lwip内存溢出问题-百谷歌lwIP公用代码有内存泄露,该怎么处理 - Wireless当前位置:& &&&lwIP公用代码有内存泄露,该怎么处理lwIP公用代码有内存泄露,该怎么处理&&网友分享于:&&浏览:85次lwIP公用代码有内存泄露我用的是SICS的Adam那套代码(Adam Dunkels&&)。坑爹的内存泄露喂,发两次数据后程序就崩溃了。大家有没有这种悲剧的经历,有木有啊有木有。现在把错误地方记录下来:代码在(lwip\ports\stellaris\netif\stellarisif.c)中的函数stellarisif_interrupt。它使用stellarisif_receive获取一块存有数据的内存段,并由ethernet_input使用和销毁这段内存。在某些情况下,ethernet_input并未释放内存,从而造成内存泄露。结果就是,网络数据包无法处理。其他使用lwIP哥们要小心了。------解决方案--------------------
请问楼主是如何解决的,我也出现这用问题了,out of memory...
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有在这里先说一下这两个配置协议栈文件opt.h和lwipopts.h的关系:
& && && &opt.h是lwip“出厂”时原装的,它的作者是瑞士科学院的Adam等人,而lwipopts.h的作者是stellarisWare的工程师,它集合了opt.h中常常需要改动的部分和针对所特有的配置选项添加进来了。这两个文件里边都配置的选项,以后者为准,不是共有的选项以它们各自的配置为准。
& && && &在这里先说一下lwip的内存管理机制,我们以enet_lwip这个例程为例。
& && && &在使用lwip的时候,我们可以使用两种形式的内存,一种是heap,一种是pool。heap就像是一整块蛋糕,我们需要多少就切多少,但 是切了之后不能吃,只能看,因为看完之后,你还要放回去让别人看,因为当整块蛋糕很少的时候,有很多人等着都要切了看,这样很多次的切了之后又放回去,必 然要产生一些很小的蛋糕块,这就是内存的碎片,到最后都是切得很细的蛋糕块,假如这个时候你想切块大点的蛋糕来看看,不好意思,你找遍了整个拼凑起来的蛋 糕块,没有发现你想要的那么大的,结果你只好放弃了,所以最后内存申请回频频失败。
因为我们是,
我们的RAM再大也不能和PC机的天文数字相比,我们不能使用PC机所使用的蛋糕刀具来切蛋糕,必须使用更小型的道具,占用CODE更小,这一点Adam 等相对于标准C而实现了几个小的内存分配、重分配和释放函数,它们都以mem_为前缀,已和原来的标准库函数相区别。当然如果你偏要使用大的刀,只需要
#define MEM_LIBC_MALLOC 1 。
& && &&&这几个工具不管你是heap型模式切蛋糕还是pool模式切蛋糕,都可以用它们来完成,它们只是刀,至于怎么切蛋糕,这里不是它们该考虑的事情。
& && & 上面介绍了heap型的切蛋糕的方法,在简单说一下pool型切蛋糕的方法。
& && & 为了能让更多的人把蛋糕切回去看并且不至于还回来的蛋糕都是非常地小。Adam非常努力地在lwip切蛋糕上问题上采用一种Pool型的切法,找来一块蛋 糕,把它切成n等分,每一份都是相同的固定大小,一份不够的可以拿两份,一份用起来太多的人你也最少拿一份(虽然浪费了,但是你也必须这么做),这种切法 有两个好处,一是:现在你不能再随便的按自己的要求大小去切蛋糕了,大小是固定的,这样你申请了蛋糕之后不需要去切了,已经切好了,你可以很快地拿到一份 大小固定的蛋糕,这非常适合于在接受数据帧的底层使用,当大量的数据来的时候,我们一下子需要很多的内存,这种方式下,我们很快就可以拿到足量的内存,不
至于应接不暇;二是:在切成多少份,每份多大上需要我们根据最常接受到的数据帧的大小来费点脑筋,切得太小了,内存的利用率就下降了,切得太大了,我们就 会严重地浪费内存,如果总共可切的内存还不大的话,那肯定是要因为后面来的数据无蛋糕可切而要丢包的,这就像是现在的房地产,少数富人拥有好几套大房子空 着不住人,而另一方面,多数穷人却因为租不起房子而只好离开大城市,但是当前穷人对于城市所作的贡献并不见得比富人小。
& && &&&这两种切法都不是完美的,也不可能有完美的,但是有它们最适合的地方。我上面的比喻是为了更形象地理解,当然在细节上可能会有不同,不过,大体上就是这么个意思,细节我们可以去深入地。
Pool型一般用于从链路层就收一个帧,目的是快速、少碎片、浪费一点没关系、只要我能满足大多数人迅速地有房可住即可。
heap型一般用于缓存应用层生成的数据,大小自己定,相切多少切多少,随心所欲,尽管以后可能没得切,但我只在乎现在,也许以后就有新的方法解决呢,就像煤炭和石油,该用还得用,说不定以后会有新能源取代它们,杞人忧天干嘛。
& && &实际上,在enet_lwip这个例程里它就是这么实现的。
& && &如何配置heap的大小呢,
#define MEM_SIZE& && && && && && && && &(12 * 1024)
所以说当你有大量的数据要发送的时候,你最好把这个值设置得大一些。否则你会因为切不到heap中的内存而无法发送或只能延迟发送。
最好是把上面这个数设置成4字节对齐的。
& && &如何配置pool的大小呢,
#define PBUF_POOL_SIZE& && && && && && &16
#define PBUF_POOL_BUFSIZE& && && && && &256
第一个是我们要切的分数,第二个是每一份的大小。
那么实际上我们切到的每一份内存的大小要比我们定义的大16个字节。我们可以根据应用去调整这几个值,这两部分的大小就占到了lwip协议栈所占内存的大部分,也就是说他们会影响到ZI段的大小。
如果要使发送的应用也
采用pool的方式而不是heap,则要: #define MEM_USE_POOLS 1 define MEM_USE_CUSTOM_POOLS 1 并且还要在工程所在目录下创建文件 lwippools.h,里包括: LWIP_MALLOC_MEMPOOL_START LWIP_MALLOC_MEMPOOL(20, 256) LWIP_MALLOC_MEMPOOL(10, 512) LWIP_MALLOC_MEMPOOL(5, 1512) LWIP_MALLOC_MEMPOOL_END 这样协议栈所涉及到的内存都用POOL方式来管理了,这种方法在StellarisWare例程中一般没有采用。如果使用POOL,以下关于内存的两个函
数是不会被调用的: mem_init();这个函数主要是对堆内存的初始化,并返回指针。 mem_realloc(mem, size);这个函数对已分配的对内存块进行收缩。
//*****************************************************************************
// lwipopts.h - Configuration file for lwIP
*************************************************************************
// NOTE:& This file has been derived from the lwIP/src/include/lwip/opt.h
// header file.
// 注:此文件起源于opt.h
// For additional details, refer to the original &opt.h& file, and lwIP
// documentation.
// 详情参考opt.h。
//*****************************************************************************
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
//*****************************************************************************
// ---------- Stellaris / lwIP Port Options ----------
//*****************************************************************************
#define HOST_TMR_INTERVAL&&&&&&&&&&&&&& 100&&&&&&&& // 主机定时器间隔,注意不是lwip协议栈本身的定时器间隔,可用来检查IP地址的获取情况或者周期性地调用一些函数。
//#define DHCP_EXPIRE_TIMER_MSECS&&&&&&&& (10 * 1000) //DHCP 获取超时的毫秒数。这个实际在例程中没看到有用到。DHCP获取IP超时,一般就会采用AUTOIP的方式自给IP。
//#define INCLUDE_HTTPD_SSI&&&&&&&&&&&&&&&&&&&&&&&&&& //在HTTPD中如果有含有SSI标签的网页存在,则开启它,否则如果是普通的html网页,不需要开启。
//#define INCLUDE_HTTPD_CGI&&&&&&&&&&&&&&&&&&&&&&&&&&& //如果需要CGI的处理,则需要开启。
//#define DYNAMIC_HTTP_HEADERS&&&&&&&&&&&&&&&&&&&&&&&& //如果要动态的添加HTTP首部则开启,在使用makefsfile 带参数-h时,就去掉了http首部,如果不能正常浏览到网页可尝试开启。一般不需要开启,样可以节省Flash的空间,因为如果不是使用SD卡,而是使用内部文件系统的时候,所有的网页数据都放在了RO段。
//*****************************************************************************
// ---------- Platform specific locking ----------
//*****************************************************************************
#define SYS_LIGHTWEIGHT_PROT&&&&&&&&&&& 1&&&&&&&&&& // default is 0&& && 针对Stellaris必须1,主要是因为在分配内存的时候,要确保总中断关闭。防止内存分配失败。
#define NO_SYS&&&&&&&&&&&&&&&&&&&&&&&&& 1&&&&&&&&&& // default is 0&& 如果为使用RTOS,就置1.
//#define MEMCPY(dst,src,len)&&&&&&&&&&&& memcpy(dst,src,len)&& /* 该宏用来定义我们是否需要C语言标准库函数memcpy(),如果有更有效的函数,该宏可以忽略.不适用C标准库
//#define SMEMCPY(dst,src,len)&&&&&&&&&&& memcpy(dst,src,len)&& //同上
//*****************************************************************************
// ---------- Memory options ----------
//*****************************************************************************
//#define MEM_LIBC_MALLOC&&&&&&&&&&&&&&&& 0&&&&&&&&& //如果为1,就表示我们使用c库的 malloc/free/realloc,否则使用lwip自带的函数,注意加了前缀的。
#define MEM_ALIGNMENT&&&&&&&&&&&&&&&&&&& 4&&&&&&&&&& //Stellaris该值必须为4,设置CPU的对齐方式
#define MEM_SIZE&&&&&&&&&&&&&&&&&&&&&&& (12 * 1024)& // default is 1600&& & 该值在ZI中占了很大的份额。这就是堆内存的大小,如果应用程序有大量数据在发送是要被复制,那么该值就应该尽量大一点。由此可见,发送缓冲区从这里边分配。
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &
//#define MEMP_OVERFLOW_CHECK&&&&&&&&&&&& 0&&&&&&&& //是否开启内存POOL溢出检查,即是否使能堆内存溢出检查.
//#define MEMP_SANITY_CHECK&&&&&&&&&&&&&& 0&&&&&&&& //设置为1表示在每次调用函数memp_free()后,进行一次正常的检查,以确保链表队列没有循环&
//#define MEM_USE_POOLS&&&&&&&&&&&&&&&&&& 0&&&&&&&& //是否使用POOL型内存来作为发送缓冲,而不是heap型,如果开启的话,可能还要创建头文件lwippool.h
//#define MEMP_USE_CUSTOM_POOLS&&&&&&&&&& 0&&&&&&&& //内存Pool是否使用固定大小的POOL,开启这个前提是要开启上面的。
//*****************************************************************************
// ---------- Internal Memory Pool Sizes ----------
//*****************************************************************************
#define MEMP_NUM_PBUF&&&&&&&&&&&&&&&&&&&& 20& //来自memp的PBUF_ROM和PBUF_REF类型的数目,如果应用程有大量的数据来自ROM或者静态mem的数据要发送,此值要设大一些。
//#define MEMP_NUM_RAW_PCB&&&&&&&&&&&&&&& 4&& //原始连接(就是应用程不经过传输层直接到IP层获取数据)PCB的数目,该项依赖lwip_raw项的开启。
//#define MEMP_NUM_UDP_PCB&&&&&&&&&&&&&&& 4&& //UDP的PCB数目,每一活动的UDP “连接” 需要一个PCB。
#define MEMP_NUM_TCP_PCB&&&&&&&&&&&&&&&&& 3&& // 同时建立激活的TCP连接的数目(要求参数LWIP_TCP使能).默认为5 我改成1之后和原来的8没有什么区别。但是这里建立tcp连接发送数据之后就立刻关闭了tcp连接.
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &//如果这里设置为1,就要注意了,我们在点亮led的时候实际上是几乎同时发送了两个GET请求,要求建立两个激活的tcp连接,如果设置为1,就会等到一个tcp激活的tcp连接关闭之后
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &//再建立一个新的tcp连接,所以才会出现延迟返回状态的现象。经过我的实验,发现等于3的时候比较特殊,会使code少4个字节。
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &//而且ZI的大小也只比2的时候多160,(奇数多160,偶数时多168)。
#define MEMP_NUM_TCP_PCB_LISTEN&&&&&&&&&& 1&& & /* 能够监听的TCP连接数目(要求参数LWIP_TCP使能).默认为8我改成了1之后对本例程也是无影响的。这个非常规律,多一个ZI就多32个字节。*/
#define MEMP_NUM_TCP_SEG&&&&&&&&&&&&&&&&& 20& //最多同时在队列的TCP_SEG的数目.这个数为20,MEMP_NUM_TCP_PCB为3时,code会比其它情况要小4个字节,其它所有值时code大小不变,当从偶数增加到奇数时,ZI增加24,从奇数增加到偶数时ZI增加16。
//#define MEMP_NUM_REASSDATA&&&&&&&&&&&&& 5& // 最多同时在队列等待重装的IP包数目,是整个IP包,不是IP分片。
//#define MEMP_NUM_ARP_QUEUE&&&&&&&&&&&&& 30 //&
//#define MEMP_NUM_IGMP_GROUP&&&&&&&&&&&& 8& //
//#define MEMP_NUM_SYS_TIMEOUT&&&&&&&&&&& 3& // 能够同时激活的timeout的个数(要求NO_SYS==0)。默认为3
//#define MEMP_NUM_NETBUF&&&&&&&&&&&&&&&& 2& // netbufs结构的数目,仅当使用sequential API的时候需要。默认为2&
//#define MEMP_NUM_NETCONN&&&&&&&&&&&&&&& 4& // netconns结构的数目,仅当使用sequential API的时候需要。默认为4
//#define MEMP_NUM_TCPIP_MSG_API&&&&&&&&& 8& // tcpip_msg结构的数目,它用于callback/timeout API的通信(仅当使用tcpip.c的时候需要 )。默认为8
//#define MEMP_NUM_TCPIP_MSG_INPKT&&&&&&& 8& // 接收包时tcpip_msg结构体的数目。
//*****************************************************************************
// ---------- ARP options ----------
//*****************************************************************************
//#define LWIP_ARP&&&&&&&&&&&&&&&&&&&&&&& 1&& //开启ARP
//#define ARP_TABLE_SIZE&&&&&&&&&&&&&&&&& 10& //ARP表项的大小。激活的MAC-IP地址对存储区的数目
//#define ARP_QUEUEING&&&&&&&&&&&&&&&&&&& 1&& //设置为1表示在硬件地址解析期间,将发送数据包放入到队列中
//#define ETHARP_TRUST_IP_MAC&&&&&&&&&&&& 1& &
//*****************************************************************************
// ---------- IP options ----------
//*****************************************************************************
//#define IP_FORWARD&&&&&&&&&&&&&&&&&&&&& 0
//#define IP_OPTIONS_ALLOWED&&&&&&&&&&&&& 1
#define IP_REASSEMBLY&&&&&&&&&&&&&&&&&& 0&&&&&&&&&& // default is 1 注意进来的IP分段包就不会被重装,所以大于1500的IP包可能会有些意想不到的问题
#define IP_FRAG&&&&&&&&&&&&&&&&&&&&&&&& 0&&&&&&&&&& // default is 1&& &这样从这里发送出去的包不会被分片。这个不会出现问题,因为我们的TCP_MSS才512
//#define IP_REASS_MAXAGE&&&&&&&&&&&&&&&& 3
//#define IP_REASS_MAX_PBUFS&&&&&&&&&&&&& 10
//#define IP_FRAG_USES_STATIC_BUF&&&&&&&& 1
//#define IP_FRAG_MAX_MTU&&&&&&&&&&&&&&&& 1500
//#define IP_DEFAULT_TTL&&&&&&&&&&&&&&&&& 255
//*****************************************************************************
// ---------- ICMP options ----------
//*****************************************************************************
//#define LWIP_ICMP&&&&&&&&&&&&&&&&&&&&&& 1
//#define ICMP_TTL&&&&&&&&&&&&&&&&&&&&&& (IP_DEFAULT_TTL)
//*****************************************************************************
// ---------- RAW options ----------
//*****************************************************************************
//#define LWIP_RAW&&&&&&&&&&&&&&&&&&&&&&& 1
//#define RAW_TTL&&&&&&&&&&&&&&&&&&&&&&& (IP_DEFAULT_TTL)
//*****************************************************************************
// ---------- DHCP options ----------
//*****************************************************************************
#define LWIP_DHCP&&&&&&&&&&&&&&&&&&&&&& 1&&&&&&&&&& // default is 0
//#define DHCP_DOES_ARP_CHECK&&&&&&&&&&&& ((LWIP_DHCP) && (LWIP_ARP))
//*****************************************************************************
// ---------- UPNP options ----------
//*****************************************************************************
//#define LWIP_UPNP&&&&&&&&&&&&&&&&&&&&&& 0
//*****************************************************************************
// ---------- PTPD options ----------
//*****************************************************************************
//#define LWIP_PTPD&&&&&&&&&&&&&&&&&&&&&& 0
//*****************************************************************************
// ---------- AUTOIP options ----------
//*****************************************************************************
#define LWIP_AUTOIP&&&&&&&&&&&&&&&&&&&& 1&&&&&&&&&& // default is 0
#define LWIP_DHCP_AUTOIP_COOP&&&&&&&&&& ((LWIP_DHCP) && (LWIP_AUTOIP))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // default is 0
#define LWIP_DHCP_AUTOIP_COOP_TRIES&&&& 5&&&&&&&&&& // default is 9
//*****************************************************************************
// ---------- SNMP options ----------
//*****************************************************************************
//#define LWIP_SNMP&&&&&&&&&&&&&&&&&&&&&& 0
//#define SNMP_CONCURRENT_REQUESTS&&&&&&& 1
//#define SNMP_TRAP_DESTINATIONS&&&&&&&&& 1
//#define SNMP_PRIVATE_MIB&&&&&&&&&&&&&&& 0
//#define SNMP_SAFE_REQUESTS&&&&&&&&&&&&& 1
//*****************************************************************************
// ---------- IGMP options ----------
//*****************************************************************************
//#define LWIP_IGMP&&&&&&&&&&&&&&&&&&&&&& 0
//*****************************************************************************
// ---------- DNS options -----------
//*****************************************************************************
//#define LWIP_DNS&&&&&&&&&&&&&&&&&&&&&&& 0
//#define DNS_TABLE_SIZE&&&&&&&&&&&&&&&&& 4
//#define DNS_MAX_NAME_LENGTH&&&&&&&&&&&& 256
//#define DNS_MAX_SERVERS&&&&&&&&&&&&&&&& 2
//#define DNS_DOES_NAME_CHECK&&&&&&&&&&&& 1
//#define DNS_USES_STATIC_BUF&&&&&&&&&&&& 1
//#define DNS_MSG_SIZE&&&&&&&&&&&&&&&&&&& 512
//*****************************************************************************
// ---------- UDP options ----------
//*****************************************************************************
//#define LWIP_UDP&&&&&&&&&&&&&&&&&&&&&&& 1
//#define LWIP_UDPLITE&&&&&&&&&&&&&&&&&&& 0
//#define UDP_TTL&&&&&&&&&&&&&&&&&&&&&&&& (IP_DEFAULT_TTL)
//*****************************************************************************
// ---------- TCP options ----------
//*****************************************************************************
//#define LWIP_TCP&&&&&&&&&&&&&&&&&&&&&&& 1
//#define TCP_TTL&&&&&&&&&&&&&&&&&&&&&&&& (IP_DEFAULT_TTL)
#define TCP_WND&&&&&&&&&&&&&&&&&&&&&&&& 2048&&& // default is 2048, was 4096& 改变该值并不影响code和ZI的大小。
//#define TCP_MAXRTX&&&&&&&&&&&&&&&&&&&&& 12
//#define TCP_SYNMAXRTX&&&&&&&&&&&&&&&&&& 6
//#define TCP_QUEUE_OOSEQ&&&&&&&&&&&&&&&& 1
#define TCP_MSS&&&&&&&&&&&&&&&&&&&&&&&& 512&&&& // default is 128, was 1500&& &&& 改变该值并不影响code和ZI的大小。。该值规定了TCP数据包数据部分的最大值,不包括tcp首部
//#define TCP_CALCULATE_EFF_SEND_MSS&&&&& 1
#define TCP_SND_BUF&&&&&&&&&&&&&&&&&&&& (6 * TCP_MSS)&& &//改变该值并不影响ZI的大小,但稍稍影响code大小,几个字节。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // default is 256
//#define TCP_SND_QUEUELEN&&&&&&&&&&&&&&& (4 * (TCP_SND_BUF/TCP_MSS))
//#define TCP_SNDLOWAT&&&&&&&&&&&&&&&&&&& (TCP_SND_BUF/2)
//#define TCP_LISTEN_BACKLOG&&&&&&&&&&&&& 0
//#define TCP_DEFAULT_LISTEN_BACKLOG&&&&& 0xff
//*****************************************************************************
// ---------- API options ----------
//*****************************************************************************
//#define LWIP_EVENT_API&&&&&&&&&&&&&&&&& 0
//#define LWIP_CALLBACK_API&&&&&&&&&&&&&& 1
//*****************************************************************************
// ---------- Pbuf options ----------
//*****************************************************************************
#define PBUF_LINK_HLEN&&&&&&&&&&&&&&&&& 16&&&&&&&&& // default is 14& 改成16是因为在Stellaris系列中,FIFO中的帧是开始有两个字节的帧长度,针对Stellaris必须16
#define PBUF_POOL_SIZE&&&&&&&&&&&&&&&&& 16&& &&& &&& &// 奇数时code比偶数时多4个字节,每+1,RAM多消耗272个字节。这也就是说每个pbuf需要272个字节,而每一个pbuf
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &//由两部分组成,一部分是缓冲区256个字节,一部分是pbuf首部(16个字节。)(不是以太网链路层的帧首部,尽管它从FIFO中是16个字节)。这个pbuf就是直接装入从RX FIFO中传
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &//过来的数据。每一个pbuf可以存一个帧,可以存256个字节的一个帧。这部分内存主要用来接收的。
#define PBUF_POOL_BUFSIZE&&&&&&&&&&&&&& 256&& &&& &&& &//这个pbuf包括前边的16个字节的pbuf头,叫首部有点不合适,这个pbuf头里保存这个pbuf的所有信息。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)
#define ETH_PAD_SIZE&&&&&&&&&&&&&&&&&&& 2&&&&&&&&&& // default is 0&& && 针对Stellaris必须为2
//*****************************************************************************
// ---------- Network Interfaces options ----------
//*****************************************************************************
//#define LWIP_NETIF_HOSTNAME&&&&&&&&&&&& 0
//#define LWIP_NETIF_API&&&&&&&&&&&&&&&&& 0
//#define LWIP_NETIF_STATUS_CALLBACK&&&&& 0
//#define LWIP_NETIF_LINK_CALLBACK&&&&&&& 0
//#define LWIP_NETIF_HWADDRHINT&&&&&&&&&& 0
//*****************************************************************************
// ---------- LOOPIF options ----------
//*****************************************************************************
//#define LWIP_HAVE_LOOPIF&&&&&&&&&&&&&&& 0
//#define LWIP_LOOPIF_MULTITHREADING&&&&& 1
//*****************************************************************************
// ---------- Thread options ----------
//*****************************************************************************
//#define TCPIP_THREAD_NAME&&&&&&&&&&&&& &tcpip_thread&
//#define TCPIP_THREAD_STACKSIZE&&&&&&&&& 0
//#define TCPIP_THREAD_PRIO&&&&&&&&&&&&&& 1
//#define TCPIP_MBOX_SIZE&&&&&&&&&&&&&&&& 0
//#define SLIPIF_THREAD_NAME&&&&&&&&&&&& &slipif_loop&
//#define SLIPIF_THREAD_STACKSIZE&&&&&&&& 0
//#define SLIPIF_THREAD_PRIO&&&&&&&&&&&&& 1
//#define PPP_THREAD_NAME&&&&&&&&&&&&&&& &pppMain&
//#define PPP_THREAD_STACKSIZE&&&&&&&&&&& 0
//#define PPP_THREAD_PRIO&&&&&&&&&&&&&&&& 1
//#define DEFAULT_THREAD_NAME&&&&&&&&&&& &lwIP&
//#define DEFAULT_THREAD_STACKSIZE&&&&&&& 0
//#define DEFAULT_THREAD_PRIO&&&&&&&&&&&& 1
//#define DEFAULT_RAW_RECVMBOX_SIZE&&&&&& 0
//#define DEFAULT_UDP_RECVMBOX_SIZE&&&&&& 0
//#define DEFAULT_TCP_RECVMBOX_SIZE&&&&&& 0
//#define DEFAULT_ACCEPTMBOX_SIZE&&&&&&&& 0
//*****************************************************************************
// ---------- Sequential layer options ----------
//*****************************************************************************
//#define LWIP_TCPIP_CORE_LOCKING&&&&&&&& 0
#define LWIP_NETCONN&&&&&&&&&&&&&&&&&&& 0&&&&&&&&&& // default is 1
//*****************************************************************************
// ---------- Socket Options ----------
//*****************************************************************************
#define LWIP_SOCKET&&&&&&&&&&&&&&&&&&&& 0&&&&&&&&&& // default is 1
//#define LWIP_COMPAT_SOCKETS&&&&&&&&&&&& 1
//#define LWIP_POSIX_SOCKETS_IO_NAMES&&&& 1
//#define LWIP_TCP_KEEPALIVE&&&&&&&&&&&&& 0
//#define LWIP_SO_RCVTIMEO&&&&&&&&&&&&&&& 0
//#define LWIP_SO_RCVBUF&&&&&&&&&&&&&&&&& 0
//#define SO_REUSE&&&&&&&&&&&&&&&&&&&&&&& 0
//*****************************************************************************
// ---------- Statistics options ----------
//*****************************************************************************
//#define LWIP_STATS&&&&&&&&&&&&&&&&&&&&& 1
//#define LWIP_STATS_DISPLAY&&&&&&&&&&&&& 0
//#define LINK_STATS&&&&&&&&&&&&&&&&&&&&& 1
//#define ETHARP_STATS&&&&&&&&&&&&&&&&&&& (LWIP_ARP)
//#define IP_STATS&&&&&&&&&&&&&&&&&&&&&&& 1
//#define IPFRAG_STATS&&&&&&&&&&&&&&&&&&& (IP_REASSEMBLY || IP_FRAG)
//#define ICMP_STATS&&&&&&&&&&&&&&&&&&&&& 1
//#define IGMP_STATS&&&&&&&&&&&&&&&&&&&&& (LWIP_IGMP)
//#define UDP_STATS&&&&&&&&&&&&&&&&&&&&&& (LWIP_UDP)
//#define TCP_STATS&&&&&&&&&&&&&&&&&&&&&& (LWIP_TCP)
//#define MEM_STATS&&&&&&&&&&&&&&&&&&&&&& 1
//#define MEMP_STATS&&&&&&&&&&&&&&&&&&&&& 1
//#define SYS_STATS&&&&&&&&&&&&&&&&&&&&&& 1
//*****************************************************************************
// ---------- PPP options ----------
//*****************************************************************************
//#define PPP_SUPPORT&&&&&&&&&&&&&&&&&&&& 0
//#define PPPOE_SUPPORT&&&&&&&&&&&&&&&&&& 0
//#define PPPOS_SUPPORT&&&&&&&&&&&&&&&&&& PPP_SUPPORT
#if PPP_SUPPORT
//#define NUM_PPP&&&&&&&&&&&&&&&&&&&&&&&& 1
//#define PAP_SUPPORT&&&&&&&&&&&&&&&&&&&& 0
//#define CHAP_SUPPORT&&&&&&&&&&&&&&&&&&& 0
//#define MSCHAP_SUPPORT&&&&&&&&&&&&&&&&& 0
//#define CBCP_SUPPORT&&&&&&&&&&&&&&&&&&& 0
//#define CCP_SUPPORT&&&&&&&&&&&&&&&&&&&& 0
//#define VJ_SUPPORT&&&&&&&&&&&&&&&&&&&&& 0
//#define MD5_SUPPORT&&&&&&&&&&&&&&&&&&&& 0
//#define FSM_DEFTIMEOUT&&&&&&&&&&&&&&&&& 6
//#define FSM_DEFMAXTERMREQS&&&&&&&&&&&&& 2
//#define FSM_DEFMAXCONFREQS&&&&&&&&&&&&& 10
//#define FSM_DEFMAXNAKLOOPS&&&&&&&&&&&&& 5
//#define UPAP_DEFTIMEOUT&&&&&&&&&&&&&&&& 6
//#define UPAP_DEFREQTIME&&&&&&&&&&&&&&&& 30
//#define CHAP_DEFTIMEOUT&&&&&&&&&&&&&&&& 6
//#define CHAP_DEFTRANSMITS&&&&&&&&&&&&&& 10
//#define LCP_ECHOINTERVAL&&&&&&&&&&&&&&& 0
//#define LCP_MAXECHOFAILS&&&&&&&&&&&&&&& 3
//#define PPP_MAXIDLEFLAG&&&&&&&&&&&&&&&& 100
//#define PPP_MAXMTU&&&&&&&&&&&&&&&&&&&&& 1500
//#define PPP_DEFMRU&&&&&&&&&&&&&&&&&&&&& 296
//*****************************************************************************
// ---------- checksum options ----------
//*****************************************************************************
//#define CHECKSUM_GEN_IP&&&&&&&&&&&&&&&& 1
//#define CHECKSUM_GEN_UDP&&&&&&&&&&&&&&& 1
//#define CHECKSUM_GEN_TCP&&&&&&&&&&&&&&& 1
//#define CHECKSUM_CHECK_IP&&&&&&&&&&&&&& 1
//#define CHECKSUM_CHECK_UDP&&&&&&&&&&&&& 1
//#define CHECKSUM_CHECK_TCP&&&&&&&&&&&&& 1
//*****************************************************************************
// ---------- Debugging options ----------
//*****************************************************************************
#define U8_F &c&
#define S8_F &c&
#define X8_F &x&
#define U16_F &u&
#define S16_F &d&
#define X16_F &x&
#define U32_F &u&
#define S32_F &d&
#define X32_F &x&
extern void UARTprintf(const char *pcString, ...);
#define LWIP_PLATFORM_DIAG(x) {UART}
#define LWIP_DEBUG
//#define&& LWIP_DBG_MIN_LEVEL&&&&&&&&&&&&& LWIP_DBG_LEVEL_OFF
#define LWIP_DBG_MIN_LEVEL&&&&&&&&&&&&& LWIP_DBG_LEVEL_WARNING
//#define LWIP_DBG_MIN_LEVEL&&&&&&&&&&&&& LWIP_DBG_LEVEL_SERIOUS
//#define LWIP_DBG_MIN_LEVEL&&&&&&&&&&&&& LWIP_DBG_LEVEL_SEVERE
//#define LWIP_DBG_TYPES_ON&&&&&&&&&&&&&& LWIP_DBG_ON
#define LWIP_DBG_TYPES_ON&&&&&&&&&&&&&& (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)
//#define ETHARP_DEBUG&&&&&&&&&&&&&&&&&&& LWIP_DBG_ON&&&& // default is OFF
//#define NETIF_DEBUG&&&&&&&&&&&&&&&&&&&& LWIP_DBG_ON&&&& // default is OFF
//#define PBUF_DEBUG&&&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_ON
//#define API_LIB_DEBUG&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define API_MSG_DEBUG&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define SOCKETS_DEBUG&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define ICMP_DEBUG&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define IGMP_DEBUG&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define INET_DEBUG&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define IP_DEBUG&&&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_ON&&&& // default is 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
//#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_ON&&&& // default is OFF
//#define TCPIP_DEBUG&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define PPP_DEBUG&&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define SLIP_DEBUG&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define DHCP_DEBUG&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_ON&&&& // default is OFF
//#define AUTOIP_DEBUG&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define SNMP_MSG_DEBUG&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define SNMP_MIB_DEBUG&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
//#define DNS_DEBUG&&&&&&&&&&&&&&&&&&&&&& LWIP_DBG_OFF
#define HTTPD_DEBUG &&& &&& &&& &&& &&& && LWIP_DBG_ON
#endif /* __LWIPOPTS_H__ */
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:121438次
积分:2875
积分:2875
排名:第12233名
原创:139篇
转载:236篇
文章:13篇
阅读:4401
(1)(12)(16)(9)(7)(28)(19)(16)(37)(17)(21)(11)(6)(40)(18)(40)(31)(28)(2)(9)(7)

我要回帖

更多关于 tomcat 内存溢出解决 的文章

 

随机推荐