This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2535750 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/752844/tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT

尊敬的:

我们使用的是随版本转售一起移植的 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 --=索引;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shachar、您好!
    遗憾的是、没有计划将任何后续的 LwIP 版本移植到 Tiva 系列。 如果泄漏是由 LwIP 引起的、我建议您联系 LwIP 论坛支持以获得有关如何在 LwIP 1.4.1中处理这些泄漏的建议。 您是否尝试增加堆和堆栈大小、是否看到了任何差异?