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.

[参考译文] AM2634:与 NORTOS 的客户端集成

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1390101/am2634-client-integration-with-nortos

器件型号:AM2634

工具与软件:

尊敬的团队:

我想在 AM2634评估板上实现客户端服务器集成、

目前、我使用 mcu_plus_sdk_am263x_09_02_00_56和 enet_cpsw_rawhttpserver 作为客户端实施的基本源代码、

/-------------------------------------------------------- 基本源代码------------------------------------------------------- /

while (false == App_isNetworkUp (netif_default))

//DebugP_log ("正在等待网络启动...\r\n");
sys_check_timeouts();

const uint32_t recvdEventsMask = App_receiveEvents (&H);

if (recvdEventsMask!= AppEventId_none)

APP_handleEvent (recvdEventsMask);
}
}

DebugP_LOG ("网络已启动...\r\n");
ClockP_SLEEP (1);

// AppTcp_startserver ();
// tcpecho_raw_init ();
// httpd_init ();                 //由于其客户端集成、因此未使用 base http app
 app_altcp();                  //我的客户端基本函数此函数是在最后定义的  

while (1)

sys_check_timeouts();
ClockP_usleep (1000);

const uint32_t recvdEventsMask = App_receiveEvents (&H);

if (recvdEventsMask!= AppEventId_none)

APP_handleEvent (recvdEventsMask);
}

}

app_shutdownNetworkStack();
EnetApp_driverDeInit ();
EventP_破坏性(&H 事件);
返回0;
}

/--------------- 其他源代码与现有示例中的代码相同--- /

void app_altcp()

uint8_t 状态;

ip_addr_t myIPaddr;
IP_Addr4 (&myIPaddr、192,168、1200);

ip_addr_t DestIPaddr;
IP_Addr4 (&DestIPaddr、192,168、1、2);

pcb_altcp = altcp_new (altcpblock);

altcp_bind (pcb_altcp、&myIPaddr、2024);//与 IP 和端口绑定
status = altcp_connect (pcb_altcp、&DestIPaddr、app_port、已连接);
if (status == 0)

DebugP_LOG ("connect =%d \r\n"、status);

}
设计

altcp_close (pcb_altcp);
}
}

void connected (void * arg、struct altcp_pcb * conn、err_t err)

uint8_t dataptr[14]="Hello Ethernet";
uint8_t 偏差;
DebugP_LOG ("连接的数据...\r\n");
altcp_write (pcb_altcp、datptr、14、tcp_WRITE_FLAG_COPY);
altcp_recv (pcb_altcp、录制);
}

void recved (void * arg、struct altcp_pcb * conn、struct pbuf * p、err_t err)

静态 int k;
if ((err != ERR_OK)||(p!= NULL ))

/*错误或被另一侧关闭? */
if (p!= NULL)

K++;

/*通知 TCP 我们已获取数据。 */
altcp_recved (conn、p->tot_len);
strncpy (buffer、(char*) p->payload、p->len);
DebugP_LOG ("Buffer =%s %d\r\n"、buffer、k);
pbuf_free (p);
}
设计

pbuf_free (p);
}
}

}

在上面的代码中,我能够与服务器连接,并将数据发送到服务器,但问题是在接收

在接收数据中、在其进入此函数多次之后、pbuf_free 尝试释放分配的内存、但使代码崩溃、然后从 p->有效载荷复制到缓冲区。   

请检查一下其中有什么问题、我在中提出了一些问题  

const uint32_t recvdEventsMask = App_receiveEvents (&H);

if (recvdEventsMask!= AppEventId_none)

APP_handleEvent (recvdEventsMask);

请指导我如何解决此问题

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

    尊敬的 Vikas:

    我曾尝试挑选上述代码片段、但自从 Im 出现构建问题以来、似乎也进行了更多更改。

    同时、我有一些问题、您能否帮我解答(并分享我在构建与您相似的示例时所需的其他更改):

    1.您使用 alt 层 API 而不 使用常规 TCP API (如 tcp_recv 未使用)的任何具体原因。

    2.可以在调用 pbuf_free 前添加基本检查来检查 pbuf 是否已填充或释放。 另外、请尝试确保 pbuf_free 只发生一次(不会在应用程序以及 lwip-stack 中重复)。 在过去、我们也看到过这种情况会导致崩溃。

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    1.我试过通用 UDP API,但也有一些其他问题"发送工作,但无法在 UDP 接收"  

    2.我也尝试过,但结果是相同的,指针持续进入接收功能,但服务器不发送数据

    不应出现编译错误、因为 我将这些函数添加到 App_main.c 中  

    /--------------- UDP 客户端代码------------------------------------------------------- /

    void app_udp()

    err_t err;

    /* 1. 创建新的 UDP 控制块*/
    upcb = udp_new();

    /*将块绑定到模块的 IP 和端口*/
    ip_addr_t myIPaddr;
    IP_Addr4 (&myIPaddr、192,168、1200);
    udp_bind (upcb、&myIPaddr、2024);

    /*配置目标 IP 地址和端口*/
    ip_addr_t DestIPaddr;
    IP_Addr4 (&DestIPaddr、192,168、1、2);
    err = udp_connect (upcb、&DestIPaddr、2024);

    if (err == ERR_OK){
    /* 2. 发送消息至服务器*/
    udpClient_send();

    /* 3. 设置 upcb 的接收回调*/
    udp_recv (upcb、udp_receive_callback、NULL);
    其他{
    udp_remove (upcb);
    }
    }


    静态 void udpClient_send (void){
    struct pbuf *txBuf;
    字符数据[100];
    uint8_t STATUS=0;
    int len = sprintf (data、"Vikas sending upd message %d\n"、counter);

    /*从池中分配 pbuf */
    txBuf = pbuf_alloc (PBUF_transport、len、PBUF_RAM);

    if (txBuf != NULL){
    /*将数据复制到 pbuf */
    pbuf_take (txBuf、data、len);

    /*发送 UDP 数据*/
    status = udp_send (upcb、txBuf);
    DebugP_LOG ("发送 PKT Vikas 状态=%d\r\n"、状态);
    /*免费 pbuf */
    pbuf_free (txBuf);
    }
    }

    void udp_receive_callback (void * arg、struct udp_pcb * upcb、struct pbuf * p、const ip_addr_t * addr、u16_t port)

    struct test_udp_rxdata * CTR =(struct test_udp_rxdata *) arg;
    /*从 pbuf 复制数据*/
    strncpy (buffer、(char*) p->payload、p->len);
    debugP_log ("received PKT viaks\r\n");
    /*递增消息计数*/
    计数器++;

    // CTR->rx_cnt++;
    // CTR->rx_bytes += p->tot_len;
    /*免费接收 pbuf */
    如果(p!= NULL){
    pbuf_free (p);
    }
    }

    /----------------------------------------------------------------------------------------------------------- /

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

    尊敬的 Vikas:

    1.您能分享更多关于"崩溃"的信息吗? 程序到底在哪里崩溃、您能否分享 CCS 函数调用栈屏幕截图以帮助我了解失败的原因。

    2.在 CCS 表达式窗口中、请搜索"lwip_stats"并检查是否可以在"mem"或其它子部分中发现任何错误。 如果出现与存储器相关的错误或崩溃、则会使相应的错误计数器递增。

    3.如果我使用上面粘贴的代码片段,可以在构建问题中分享您的完整应用程序。

    此致、
    Shaunak

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

    pbuf_free: p->ref > 0ASSERT: 29.778086s:/nightlybuilds/mcupsdk_internal/jenkins/mcu_plus_sdk_am263x_09_02_00_56/source/networking/lwip/lwip-stack src pbuf_free.c:pbuf_free:755: 0 failed!!!

    如何共享代码?

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

    尊敬的 Vikas:

    Lwip-stack 会尝试释放从未引用的 pbuf、因此该断言。 我们的上述疑问是正确的。 我们错误地释放了从未被引用的 pbuf。 您能否查看您的 lwip-stats 以了解您是否有任何与内存相关的问题? pbuf_free 函数期望在 pbuf 数据包链中至少引用一次 pbuf、在本例中不会发生这种情况。

    还可以尝试的一种方法是、在 example.syscfg 中增加 lwip 数据包池的数量、并将其与 DMA 数据包池匹配(否则会产生 syscfg 错误)。 接下来在 lwip-config/am263x/lwippools.h 中、增加数据包池的数量。  

    然后使用 MCU_PLUS_SDK 文件夹中的以下命令重新编译 lwip-stack:

    ## Add PROFILE=debug incase you want a debug lib
    
    gmake -sj -f makefile.am263x lwip-contrib-freertos_r5f.ti-arm-clang
    gmake -sj -f makefile.am263x lwip-freertos_r5f.ti-arm-clang
    gmake -sj -f makefile.am263x lwipif-cpsw-freertos_r5f.ti-arm-clang

    在这2处更改之后、您可以重新编译应用程序。 这将解决我们缺少来自 lwip 所需数量数据包的情况。

    另外、还有一个问题:向 AM263x 发送 UDP 数据包的速率是多少?

    根据我的理解、这肯定看起来像是一个内存损坏问题。

    此致、
    Shaunak