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.

[参考译文] RM57L843:LwIP 1.4.1停止工作

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1076007/rm57l843-lwip-1-4-1-stop-working

部件号:RM57L843
“线程:测试”中讨论的其它部件

您好,

我的客户报告使用 LwIP 1.4.1时出现问题。
两块 RM57L 主板与以太网连接,并重复发送/接收256字节的数据。
几分钟后,它将停止工作,并且不会调用发送回叫。

以下是客户代码:
a) recv_callback()接收回调,并接收256字节数据。
b) sended_callback()是发送回调。 tcpSend256()发送256字节后,将设置 sndWl_complete 标志('1')。
c) tcpSend256()是传输子例程。用8msec 间隔检查 sndWl_complete=1并调用它。

struct tcp_pcb* conn_pcb=NULL;
err_t recv_callback(void *arg, struct tcp_pcb *tpcb,
                               struct pbuf *p, err_t err) {
	struct pbuf *pre_p = p;
	LWIP_UNUSED_ARG(err);

    /* do not read the packet if we are not in ESTABLISHED state */
    if (!p) {
        conn_pcb = NULL;
        tcp_recv(tpcb, NULL);
        tcp_sent(tpcb, NULL);
        tcp_err(tpcb, NULL);
        tcp_close(tpcb);
        return ERR_OK;
    }

    /* indicate that the packet has been received */
	do{
        // check if received data is under analysis
        if(rcvAnaFlg == 0){

          // receive buffer
            memcpy(&crxWlDtwk[cwlrxw.RxCnt], p->payload, p->len);

            // update received data count
            cwlrxw.RxCnt = (cwlrxw.RxCnt + p->len) % WL_BUF_SZ;
        }
        else{
            // skip if received data is under analysis
            testFlg++;
        }
        if(p->next==NULL) break;
		p=p->next;
	}while(p->len != 0);
 
    tcp_recved(tpcb, pre_p->tot_len); // all data received
    
    /* free the received pbuf */
	pbuf_free(pre_p);

    return ERR_OK;
}

u8_t sndWl_complete=1; //tcpSend256 completion flag
err_t sent_callback(void *arg, struct tcp_pcb *tpcb, u16_t len) {
	if(len>=256)
	{
		sndWl_complete = 1;
	}
    else{
// check if len<256
		sndWl_complete = 0;	// never comes here. len must be 256 or bigger.
    }

    return (ERR_OK);
}

err_t tcpSend256(const void *buf)
{
	err_t t_err;
	u16_t send_bufs;

	if(conn_pcb == NULL) return ERR_CONN;

	while(1){
		send_bufs = tcp_sndbuf(conn_pcb);
		if(send_bufs < 256){
			continue;  // wait until tcp transmit buffer gets 256byte
		}

		t_err = tcp_write(conn_pcb, buf, 256, TCP_WRITE_FLAG_COPY);
		if (t_err != ERR_OK) return t_err;
		t_err = tcp_output(conn_pcb);
		if (t_err != ERR_OK) return t_err;

		sndWl_complete = 0;

		break;
	}
}
 

Q1) LwIP 1.4.1中是否存在相关的已知问题?
问题2)您对客户的测试代码有任何疑问吗?

如果您需要客户提供更多信息,请告诉我。

谢谢,此致,
柯一朗·塔希罗

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

    您好,Koichiro San,

    我不知道 LWIP1.4.1中有任何已知问题。  

    我对 TCP/IP 协议不是很了解,目前对测试代码也没有评论。

    1.内存是否包含可缓存空间中的缓冲区描述符?  

    2.一旦处于故障状态,请阅读 MACSTATUS 寄存器并告知我们该值

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

    QJ 您好,

    [引用 userid="45190" url="~ë/support/icls/arm-based 微处理器-组/基于 ARM 的微处理器/f/arm-based 微处理器- forum/1076007/rm57l843-lwip-1-4-1-停止工作/3983836#3983836"]1. 内存是否包含可缓存空间中的缓冲区描述符?  [/引用]

    缓冲区位于 RAM 区域。 请问如何检查该区域是否可缓存?

    [引用 userid="45190" url="~ë/support/icls/arm-based 微处理器-组/基于 ARM 的微处理器/f/arm-based 微处理器- forum/1076007/rm57l843-lwip-1-4-1-停止工作/3983836#3983836"]2. 一旦处于故障状态,请阅读 MACSTATUS 寄存器并告知我们值

    MACSTATUS 值为0x8000:0000。

    谢谢,此致,
    柯一朗·塔希罗

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

    QJ 您好,

    客户进行了一些互联网调查,发现此问题可能与下面的窗口探测器问题有关。
    https://lists.gnu.org/archive/html/lwip-devel/2017-05/msg00040.html

    为了解决这种情况,似乎应该从发送方调用 tcp_zero_window_prob()。
    tcp_zero_window_probe ()位于文件行#840下的 tcp_sltrm()函数内。
    \Hercules_Examples-master\Application\LwIP\v00.04.00\lwip-1.4.1\src\core\tcp.c
    但程序没有达到该代码。TCP_slictrm()被定期调用(RTI 的间隔为500毫秒)。

    顺便说一句,客户体验激活的 keepalive 作为 keepalive 功能与“窗口探测器”非常相似。
    然后问题没有发生。
    客户不想使用 keepalive,因为它需要额外的操作才能恢复。
    因此,他想使用“窗口探测器”。

    谢谢,此致,
    柯一朗·塔希罗