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-Q1:AM2634-Q1 以太网双 Mac - UDP 客户端 — nortos

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1606341/am2634-q1-am2634-ethernet-dual-mac---udp-client---nortos

器件型号: AM2634-Q1

您好、

我的要求是使用双 Mac 在两个以太网端口上运行 UDP 客户端。 每个以太网端口都连接到自己的网络。 这意味着设备将获得两个独立的 IP 地址:子网和网关。

我阅读了一些与双 Mac 有关的其他查询。 我正在尝试使用 MCU-SDK-V11.00.00.19 中的示例 cpsw_rawhttpserver。 我修改了 App_setupNetif () 代码,如下所示以满足我的要求。

----------------------------------------

static void App_setupNetif ()
  // ip4_addr_t ipaddr、网络掩码、gw;

  // ip4_addr_set_zero (&GW);
  // ip4_addr_set_zero (&ipaddr);
  // ip4_addr_set_zero (&netmask);
  ip4_addr_t ipaddr[2]、网络掩码[2]、GW[2];

  IP4_addr_set_zero (&GW[0]);
  IP4_addr_set_zero (&ipaddr[0]);
  ip4_addr_set_zero (&netmask[0]);

  IP4_addr_set_zero (&GW[1]);
  IP4_addr_set_zero (&ipaddr[1]);
  ip4_addr_set_zero (&netmask[1]);

  DebugP_log(“启动 lwIP、本地接口 IP 已启用 DHCP \r\n“);
  // hlwipIfApp = lwipifEnetApp_getHandle ();   
  对于 (uint32_t i = 0U;i < ENET_SYSCFG_NETIF_COUNT;I++)
  {
    hlwipIfApp[i]= lwipifEnetApp_getHandle ();
    /*打开该主题并填充*/
    // g_pNetif[i]= LwipifEnetApp_netifOpen (hlwipIfApp、NETIF_INST_ID0 + i、&ipaddr、&netmask、&GW);
    g_pNetif[i]= LwipifEnetApp_netifOpen (hlwipIfApp[i]、NETIF_INST_ID0 + i、&ipaddr[i]、&netmask[i]、&gw[i]);
    nettif_set_status_callback (g_pNetif[i]、App_netifStatusChangeCb);
    nettif_set_link_callback (g_pNetif[i]、App_netifLinkChangeCb);
    netif_set_up (g_pNetif[NETIF_INST_ID0 + i]);
#if LWIP_NETIF_HOSTNAME
    g_pNetif[i]->主机名=“HBL-BBU";“;
#endif     
  }
  // LwipifEnetApp_startSchedule (hlwipIfApp、g_pNetif[ENET_SYSCFG_DEFAULT_NETIF_IDX]、&hEvent);
  LwipifEnetApp_startSchedule (hlwipIfApp[0]、g_pNetif[NETIF_INST_ID0]、&hEvent);
  LwipifEnetApp_startSchedule (hlwipIfApp[0]、g_pNetif[NETIF_INST_ID1]、&hEvent);
}
----------------------------------------
结果是只有一个端口显示 IP 地址。 无论我调用 LwipifEnetApp_startSchedule() 两次还是一次、这都是相同的。
 
我的印象是我没有遵循正确的顺序。  
需要这方面的指导。
 
谢谢、此致
Varma
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    感谢您的提问、请允许我们在下周初之前重新开始讨论

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

    尊敬的 Varma:

    1.是否在 example.syscfg 文件中启用了两个 MAC 端口、请告诉我。 您还可以检查是否有 2 个 PHY 的 PHY 活动日志(假设您确实有 2 根以太网电缆连接到器件)。 您能否分享您在控制台中看到的确切日志

    2.如果您需要静态 IP 分配,请确保遵循本指南:. 默认情况下、该示例将分配基于 DHCP 的 IP 地址。(https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/NETWORKING_LWIP_STATIC_IP.html)

    3.由于您的最终用例涉及 UDP 客户端、因此您可以直接从 enet_cpsw_udpclient 示例开始。 (https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/EXAMPLES_ENET_LWIP_CPSW_UDPCLIENT.html)

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    感谢您的答复。

    我确实在 syscfg 中配置这些设置以在 MAC 模式下启用两个端口。 为此、我遵循了示例 ENET_LWIP_CPSW。 我了解了如何启用这两个端口。

    我在这里的问题是 FreeRTOS 方面的示例、因为我只需要裸机 NORTOS 型号。 在此示例中、唯一的示例是 ENET_LWIP_RAWHTTPSERVER。 我导入了这个示例、它支持一个 Mac 端口。 当我修改 syscfg 以启用两个端口时、它仍然会使只有一个端口正常工作。 该端口也是 NETIF_INST_ID1 的第二个端口、而不是索引为 NETIF_INST_ID0 的第一个端口。  

    我看了 UDP 客户端示例、这也是 FreeRTOS 的示例。 我的要求是强制使用裸机。 我们不使用 FreeRTOS、因为不符合安全要求。 否则、我也会使用同样的方法。 我也尝试了 UDP 客户端示例和 TCP 服务器示例。 借助 TCP 服务器示例、我能够使两个端口都在 MAC 模式下工作、并为这两个端口都获得了 ping 响应。

    我花了一周的时间尝试在没有 RTOS 的情况下启用双端口。 我不确定是否支持带 nortos SDK 的双 Mac。  

    我不在 Sankranthi 节办公室。 因此我没有准备好共享日志。 但如果您仍然需要、我可以将其发送给您。

    请告诉我是否支持在 nortos 中工作的双 Mac、还请确认 FreeRTOS 是否符合安全要求。

    此致

    Varma

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

    尊敬的 Varma:

    请告诉我是否支持在 nortos
    中运行的双 Mac

    让我在本地进行设置。

    还要确认 FreeRTOS 是否符合安全要求、

    FreeRTOS 在以下 SDK 中按原样编译、不遵守任何安全标准(默认情况下,FreeRTOS 未通过安全认证)。

    如果您正在查看 FreeRTOS 的安全认证版本、则 SDK 不提供此功能、因为它不是免费的。 SAFERTOS 是基于 FreeRTOS 的预认证安全 RTOS。 您必须联系可能提供 SAFERTOS 端口的一些供应商。

    您可以在此处找到有关 SAFERTOS IEC 合规性级别的更多详细信息:

    www.freertos.org/.../Safety

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    感谢您清理 FreeRTOS 的安全认证。  我们决定采用裸机无 RTOS 方法。  

    请告诉我何时可以在不使用 RTOS 的情况下提供双 Mac 支持的输入。

    谢谢

    Varma

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

    尊敬的 Varma:

    我尝试重现错误并最终得以重现。 我在内部提交了一个 bug 供团队查看。 获得新发现后、我会分享一份更新

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    谢谢你。

    如果可以提供解决方案的任何时间线估计、请感谢您的参与。 必须向客户传达时间表。

    此致

    Varma

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

    当然,会让你知道计划。

    此致、
    Shaunak

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

    尊敬的 Varma:

    您可以尝试下面的补丁并查看它是否有帮助吗:

    只需修改 app_main.c 文件并为两个 NetIF 调用 periodic_Polling API、而不仅仅是一个。 第二个 MAC 端口处于活动状态并处于活动状态、但 LwIP API 没有定期轮询更改、因此即使 DHCP 服务器尝试为其分配 IP 地址、它也没有检测到。

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    非常感谢。 我使两个端口都正常工作。  

    下面是工作图像。

    我有一个后续问题。 Present http server 在两个实例上的工作方式类似。 如何从不同的 Mac 端口发送不同的消息。 例如、从端口 1、我必须将“Hello 1“发送到外部 UDP 服务器 1、并必须将“Hello 2“发送到另一个 UDP 服务器 2。  

    谢谢、此致

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

    忽略后续问题。 我找到了答案

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

    尊敬的 Shaunak:

    跟进上一个。 我使 UDP 回显服务器在两个端口上接收如下所示。 问题在于、同样只有第二个端口接收并回传数据。 第一个端口接收数据、但回传数据会丢失。

    我认为这再次是 App_handleEvent 问题、并添加了如下所示的新行。

    行为是一样的。 对此有何想法?

    此致

    Varma

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

    尊敬的 Varma:

    如果出现以下情况、您可以尝试并告诉我:

    1. ping 同时在两个 IP 上工作?

    2.您测试的流量类型(单播,广播等)

    3.你能告诉我数据丢失的确切位置(因为你提到数据被接收,它是否被其他端口的数据覆盖?,它是否在应用程序级别被损坏? 您在哪个阶段检查缓冲区并确认接收到正确的数据,但随后丢失)

    4.能否尝试为第二个端口创建新的 LWIP 线程。 通常我看到的是、如果您在运行两个不带 RTOS 的独立客户端、如果您获得正确的数据、但在使用 udp_sendto 回显时丢失、则应该有两个不同的 lwip 线程、您必须使用 diff API 来确保 lwip 路由正确进行。

    5.端口 2 是您的默认名称(能够正确回显数据的名称)

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    我使它在两个端口上都能正常工作。 但是、请参阅您的疑问的答案。

    1. ping 在两个 IP 上均有效

    2.它是在不同端口上运行的基本 UDP 服务器  

    3.通过使用 PacketSender 应用程序从 Windows 计算机发送 UDP 消息进行测试。 它会定期向服务器发送 UDP 数据。

    4.使用裸机 C 我创建了两个 UDP 回显服务器应用程序,每个应用程序都有单独的接收回调函数。

    5.这不是默认端口。 它应该对两者都起作用。

    我做了一个回显服务器如下,这是有效的。 我使用了单独的 netf 实例。 关键是使用两个不同的网络和独立的网络掩码。

    void udp_dual_server(void){
    
        err_t err;
        udpServer[NETIF_INST_ID0] = udp_new_ip_type(IPADDR_TYPE_V4);
        udpServer[NETIF_INST_ID1] = udp_new_ip_type(IPADDR_TYPE_V4);
    
        err = udp_bind(udpServer[NETIF_INST_ID0], &g_pNetif[NETIF_INST_ID0]->ip_addr, 9929);
        if(err == ERR_OK){
    
            udp_recv(udpServer[NETIF_INST_ID0], udpecho_raw_recv_id1, NULL);        
        }
        err = udp_bind(udpServer[NETIF_INST_ID1], &g_pNetif[NETIF_INST_ID1]->ip_addr, 9927);
        if(err == ERR_OK){
    
            udp_recv(udpServer[NETIF_INST_ID1], udpecho_raw_recv_id2, NULL);        
        }
    }

    我的目标应用是在两个端口上同时使用 UDP 服务器和客户端、然后从外部单元发送/接收数据。  

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

    尊敬的 Varma:

    感谢您分享信息、很高兴知道它行之有效。

    如果问题得到解决、我可以将此 E2E 主题标记为已关闭?

    此致、
    Shaunak

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

    好的、请。 我有另一个与多播相关的查询、我将为其打开另一个查询

    谢谢  

    Varma