尊敬的:
我们使用的是随版本转售一起移植的 lwip 1.4.1 TivaWare_C_Series-2.1.4.178、它采用了免费 RTOS
我们使用大小为32KB 的 RAM_RAW TCP 服务器。
应用程序每10ms 发送一个14KB 的缓冲区。
一段时间后、我们遇到 PBUF 内存不足(无法分配 tcp_write 返回 MEM_ERR)
我们看到没有 PBUF 存在问题、对 Tiva-tm4c129.c 进行了更正并进行了合并。
至少在2017年下半年、PBUF 泄漏问题似乎可以解决。
问:
1.您能否发布最新 的源文件 Tiva-tm4c129.c 并对其应用所有上述修复程序?
2.您计划何时将 Tiva-tm4c129.c 移植到新的 lwip 版本?
3.如何克服 pbuf 泄漏的任何想法?
添加了 lwipopts.h
#define PBUF_POOL_SIZE 42//16/1024
#define tcp_MSS 1460//1476
#define tcp_WND (3*tcp_mss)//(2*tcp_mss)
#define tcp_snd_BUF (32*1024)//65535
#define tcp_oversize tcp_mss
#define tcp_snd_QUEUELEN 256 //128 //(2 * tcp_snd_BUF/tcp_MSS)
#define MEMP_NUM_tcp_SEG tcp_snd_QUEUELEN //200 // 512
发件人任务代码部分为:
if (tcp_sndbuf (pState->pConnectPCB)
&&(pState->pConnectPC--> snd_queuelen < tcp_snd_QUEUELEN)
{
//MEM_STATS_DISPLAY();
//tcp_stats_display();
//这里有数据,还有空间。 设置总金额
//我们将处理的数据中,可用的数据中的较小者或
//可用空间。
pState->pConnectPC-->标志|=(TF_NODELAY |TF_ACK_NOnow );
计数= len;
if (tcp_sndbuf (pState->pConnectPCB)<计数)
{
计数= tcp_sndbuf (pState->pConnectPCB);
断言(0);
}
//尽管我们还有数据需要处理,但继续执行此操作
//循环。
while ((计数)
&&(pState->pConnectPC--> snd_queuelen < tcp_snd_QUEUELEN)
{
//LEDOn (0);//D1
if (计数< tcp_mss)
{
//将本地缓冲区写入 TCP 缓冲区。
tcpErr = tcp_write(
pState->pConnectPCB、数据+索引、计数、
tcp_write_flag_copy /*| tcp_write_flag_more */);// 1 copy 2 more tcp_write_flag_more
if (tcpErr!= ERR_OK){
断言(0);
Stam =索引+计数;
}
index +=计数;
计数= 0;
}
其他
{
//将本地缓冲区写入 TCP 缓冲区。
tcpErr = tcp_write(
pState->pConnectPCB、数据+索引、
tcp_mss、
tcp_write_flag_copy | tcp_write_flag_more);// 1 copy 2 more
if (tcpErr!= ERR_OK){
断言(0);
Stam =索引+计数;
}
index += tcp_mss;
计数-= tcp_mss;
}
//清除已写入 TCP 输出的数据
tcpErr = TCPIP_callback (tcp_output、pState->pConnectPCB);
pState->ui32LastTCPSendTime = 0;//g_SysTimeStamp;
if (tcpErr!= ERR_OK){
//assert (0);
Stam =索引+len;
}
}
//LEDOff (0);//D1
Len --=索引;