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.

[参考译文] RTOS/TM4C1294NCPDT:在多个以太网断开/重新连接后、链路状态回调停止调用- NC_setLinkHook()

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/611584/rtos-tm4c1294ncpdt-link-state-callback-stops-getting-called-after-multiple-ethernet-disconnects-reconnects---nc_setlinkhook

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

相关详细信息:
TIRTOS 版本:2.16.00.08
NS 1.11.00.10

这是在器件无法从以太网移除中恢复之前打印的内容:
06378.800 LLIGenArpPacket:非法 ARP 尝试-检查配置
已删除网络:if-1:192.168.1.52

但是,EMAC_isLinkUp()仍能正常工作... 它将继续检测链路状态变化。

如何找出中断链路状态回调的原因?
我看到的另一篇文章提到非法 ARP 尝试消息谈到了内存问题...

非常感谢您的帮助!
--Subhash

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

    我正在与一位 NDK 工程师进行检查、以查看这是否响铃(以及您的另一个线程上的 SNTP 问题)。

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

    如果没有 IP 地址绑定(除其他外)、则会出现该 print 语句:


       /*检查是否存在误配置*/
       if (!HIF ||!IPDst || IPDst=0xFFFFFFFF ||!IPSrc)
       {
           DbgPrintf (DBG_ERROR、"LLIGenArpPacket:非法 ARP 尝试-检查配置");
           返回;
       }

    [引用用户="S D"]网络已删除:if-1:192.168.1.52[/quot]

    这可能是原因。 是否要从系统中删除 IP 地址?

    Steve

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

    您好、Steve、

    感谢您的回复。

    是的、只要我丢失了链路状态、就会删除 IP 地址。 这样、如果设备更改了网络、则在必要时可以获取新的 IP 地址。

    在更改网络时、在尝试允许器件切换 IP 地址时、我是否需要注意任何事项?

    --Subhash

    编辑:

    可能值得解释一下我要实现的目标...
    我正在尝试编写支持客户配置静态 IP 或使用 DHCP 的固件。 可以通过检查 EEPROM 在引导时决定使用哪个选项。
    该器件需要能够在网络之间切换、因此必须能够处理网络断开/重新连接事件并从这些事件中恢复。

    一段时间前、另一位 TI 人员向我提供了一些示例代码、其中展示了如何使用 CfgAddEntry 和 CfgRemoveEntry 添加/删除静态 IP 地址并重置 DHCP、以便它可以处理不同网络之间的切换以及获取新 IP 地址。

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

    尊敬的 SD:

    在删除 IP 地址之前,您可能需要清除/删除 ARP 缓存? DHCP 是否不能将新 IP 重新分配给交换机上的同一 MAC? 可能没有必要删除链路状态更改中的 IP、因为 DHCP 服务器 IP 租用管理器将忽略缓存的 MAC 并在客户端新的 VLAN/网络上分配新 IP。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW:
    请注意后者、因为只要链路状态发生变化、以太网就必须在交换机端口的器件层形成新的 MAC 帧、即使使用 TCP 也是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BP101:

    遗憾的是、多次测试后、一旦设备上的 DHCP 客户端服务获取 IP 地址、即使在更改为具有不同 DHCP 服务器和不同子网的不同网络后、它似乎也不会让它转到或更改为新的 IP 地址。

    如果这样工作、我不会尝试"手动"重置它。 也许应该这样工作、但我的配置有问题吗? 如果是这种情况,我希望得到证实。

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

    在 PC 上通过命令提示符键入 ARP -d LWIP 1.4.1不确定 ARP 表在内存中的位置。 然而,鉴于瑞典技术研究所的任务庞大,它在 LWIP 中如何不能做到这一点。

    7-23 请参阅这一愚蠢的评论、因为 SYSBIOS NDK shell 正在处理应用程序中的器件函数调用。  最近 使用 SYSBIOS 对 LWIP1.4.1进行了测试、它实际上可以与 IOT 应用程序调用无缝配合使用、但无法说明 IP 子网更改的有效性。 为 SysBIOS 分配 了 一个启动 LWIP 以太网客户端 on 命令的任务、以实现其价值。

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

    我认为我错误的做法是在 nc_setLinkHook()的回调中使用 CfgRemoveEntry()删除 IP 地址。 因此、在链路状态丢失时、我删除了 IP 地址。

    我猜这是不好的,如果我在 MyNetOpenHook()回调期间(在 NDK 的启动和重新启动时)只删除 cfg 项,我应该更好地关闭?

    如果您可以确认这些问题、我可以将其标记为已解决。

    感谢您的帮助、
    子哈希
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然偶尔会看到"LLIGenArpPacket:非法 ARP 尝试-检查配置"。 这一次、当我尝试在两个不同的 DHCP 网络之间切换时发生。 我使用以下示例代码删除了 DHCP 服务和地址 :e2e.ti.com/.../439972

    我从未收到新的 IP 地址、而是在收到非法 ARP 尝试错误后看到 NDK stackThread 再次终止。 在重新启动 DHCP 之后、故障超时之前的3分钟内。

    如何安全地重置 DHCP 服务以在不同网络之间切换而不会出现此非法 ARP 问题?

    在重新启动整个 NDK 后、是否应该仅在网络打开/关闭事件期间删除 CFG 条目?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Steven、

    如果您能腾出时间、我仍然需要帮助。

    我发现的另一件事是、如果我删除并重新添加 DHCP、有时在芯片完全重新启动之前、它永远不会再次获取新的 IP 地址。 重新启动 NDK 没有帮助。 重新启动 DHCP 服务也不会。 这是在具有正常工作的 DHCP 服务器的有线网络上。 我认为所有这些问题都与我尝试正确支持在网络之间切换有关。 如果您能就此提供任何指导、我将不胜感激。 我花了几周时间阅读 NDK 文档、论坛、尝试不同的东西...


    谢谢、
    子哈希

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

    您好,Subhash,

    我对答复迟交表示歉意。 让我们看看我们可以在这里弄清楚什么。

    [引用 user="S D">我仍然偶尔会看到"LLIGenArpPacket:非法 ARP 尝试-检查配置"。 这一次,当我尝试在两个不同的 DHCP 网络之间切换时发生。

    这种情况的声明如下:

    DbgPrintf (DBG_ERROR、"LLIGenArpPacket:非法 ARP 尝试-检查配置"); 

    请注意开头存在"DBG_ERROR"。 这实际上是一个阈值、如下所示:

    1. 来过滤布线
      1. 例如、您可以将堆栈配置为仅过滤标记为"DBG_ERROR"的 DbgPrintf 跟踪消息。 任何其他阈值电平(例如 DBG_INFO)都将被忽略。
    2. 关闭堆栈
      1. DbgPrintf()函数可用作通过错误消息中止的方法。
      2. 这与上述类似,因为您为要导致关闭堆栈的消息类型设置了阈值。
      3. 默认行为是在收到"DBG_ERROR"消息时关闭堆栈。
      4. 这可通过'Global.debugAbortLevel'在您的*。cfg 文件中进行配置

    因此、这里发生的情况是、您遇到此 ARP 错误情况、并且它有一条错误消息、其阈值设置为 DBG_ERROR、这意味着"关闭堆栈"/"abort"。 提交人认为这是一个致命错误。

    但是、看他的行为规范、我不相信它实际上是(致命的)。 因此、我认为您应该尝试更改中止级别、以便 DGB_ERROR 消息不会导致堆栈关闭。 您可以通过将以下*。cfg 代码添加到您的文件来执行此操作(在文件末尾添加可以):

    Global.debugAbortLevel = Global. DBG_NONE; 

    (请注意,这将防止任何其他 DBG_ERROR 级别打印到*不*关闭堆栈。 不过、我认为现在这应该是可以的。 根据接下来的情况、我们可以决定是否需要以不同的方式处理该问题。 但是、请留意其他错误消息)。

    [quote user="S D">我使用以下示例代码删除了 DHCP 服务和地址: e2e.ti.com/.../439972

    [...]

    在重新启动整个 NDK 后、是否应该仅在网络打开/关闭事件期间删除 CFG 条目?[/QUERP]

    可以在堆栈启动并运行时调用 CfgAdd/RemoveEntry()函数。 因此、您无需将其限制为堆栈的启动/关闭。

    您在链接线程中找到的代码应该是正确的。

    您在什么环境中执行该操作?

    回顾这个主题、我看到您尝试了很多不同的东西。 我认为、您最初的设计是删除 IP 地址、然后在链路断开时删除并重新添加 DHCP 客户端服务、这是正确的方法。

    我认为您应该按照上述方法更改配置、然后重试您的测试。

    Steve