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.

[参考译文] 编译器/处理器 SDK-AM437X:当 NDK API 不能正常工作时、如何使用 API DemonFree 和 DemonNew?

Guru**** 2539500 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/953238/compiler-processor-sdk-am437x-how-to-use-the-api-daemonfree-and-then-daemonnew-when-ndk-api-does-not-working-properly

器件型号:PROCESSOR-SDK-AM437X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI C/C++编译器

我通过 TIRTOS 上的 NDK 实现了 UDP 通信。 但我发现 、在 API (例如 sendto ())返回错误(fdError()提供的"无缓冲区可用空间")后、当网络异常时、返回 NDK_ENOBUFS)、 其他 API 函 数调用不正常。
如何清除此错误、以便正常网络操作可以继续。

我以前问过一个关于 TCP 通信的问题。您说应该使用 DemonFree、然后使用 DemonNew。 但我不知道如何使用它?  

请告诉我。

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

    您好、 zhuangbin、

    [引用 user5371084"]您应该使用 DemonFree,然后使用 DemonNew。

    您能否共享指向此 e2e 线程的链接、以便我有一些上下文?

    您能否还提供您正在使用的 PRSDK 版本?

    此致、
    弗兰克

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

    您好!

    e2e.ti.com/.../867484

    Code Composer Studio 版本:9.1.0.00010

    pdk_AM437X_1_0_16 (processor_sdk_rtos_AM437X_6_01_00_08)

    BIOS_6_76_02_02、NDK_3_61_01_01

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

    您好、 zhuangbin、

    感谢您的反馈。 我将对此进行研究、下周早些时候我将与您再次进行探讨。

    此致、
    弗兰克

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

    您好、 zhuangbin、

    很抱歉耽误你的回答。

    请参阅 NDK_3_61_01_01/docs/NDK/NDK_API_Reference.html#tcpudp-server-daemon 支持。 本文档适用于 TCP 和 UDP 守护程序,并提供了 DemonNew()和 DemonFree() API 函数的详细信息。

    注意对于 UDP,DemonNew() API 函数类型参数应设置为 SOCK_DGRAM,MaxSpawn 参数应设置为1。

    另请参阅"5.4.2服务器守护程序示例"以了解 NDK 服务器守护程序示例。

    此致、
    弗兰克

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

    您好、Frank、

    我已经看到了有关守护程序 API 和示例的详细信息。

    但我仍然不知道在发生网络错误时如何使用此 API。

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

    您好、zhuangbin、

    您是否无法遵循此 e2e 帖子中提供的建议?  https://e2e.ti.com/support/processors/f/791/p/867484/3209872#3209872

    您当前是否在 TCP/UDP 中使用 DemonNew()/ DemonFree() API?

    出现网络错误时,是否已尝试使用 API 指南中概述的 DemonFree(),然后再次调用 DemonNew()?

    PDK 中有 NDK 示例、在 以下位置进行了介绍:https://software-dl.ti.com/processor-sdk-rtos/esd/docs/06_03_00_106/AM437X/rtos/index_Foundational_Components.html?highlight=ndk#ndk-example-description

    AM437x 上不支持任何 TCP/UDP 示例。 但是、AM57x 支持 TCP/UDP 示例、源代码可在 AM437x PRSDK 安装中使用。 请参阅 pdk_am437X_1_0_17\packages/ti\transport \ndk\Nimu\example。 我建议查看该代码以使用 DemonNew()/ DemonFree() API。

    此致、
    弗兰克

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

    您好、Frank、

    我现在正在使用 PDK_AM437X_1_0_16、它是否具有源代码? 它在哪里?  我找不到。

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

    zhuangbin、

    PRSDK 6.1和6.3的源代码位于同一位置:  \packages\ti\transport \NDK\Nimu\example

    我只检查了在示例代码中调用 DemonNew()和 DemonFree()。

    我尚未验证 AM57xx 示例的完整源代码是否可用。 如果您发现 AM437x PRSDK 安装中缺少源代码、我建议在 以下位置下载 AM57xx PRSDK 安装:https://software-dl.ti.com/processor-sdk-rtos/esd/AM57X/06_03_00_106/index_FDS.html

    我尚未验证在示例代码中出现网络错误时调用这些 API。

    我将在内部联系、看看我是否可以确认原始 e2e 帖子上的答案是正确的、即调用这些 API 函数是处理网络错误的正确方法。

    此致、
    弗兰克

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

    您好、Frank、

    我找到了该代码。 我将研究它。

    在函数 StackTest()中调用了函数 DemonNew()和 DemonFree(),这是一个条件。

    但我没有找到调用 StackTest()函数的位置。

    在哪里?

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

    您好、 zhuangbin、

    很抱歉耽误你的回答。 您是否在这个问题上取得了进展?

    它看起来 StackTest()是针对 Nimu 示例的主 SYSBIOS 任务(thread)。

    我看到 NDK 函数 NC_NetStart()从 StackTest 中调用。 下面的 NC_NetStart()回调函数参数是 DemonNew()和 DemonFree()被调用的位置:

    • Nimu_testNetworkOpen():启动网络堆栈时调用回调函数
    • NIMU_TestNetworkClose ():网络停止时调用回调函数

    我不知道如何调用 DeamonFree()和 DemonNew()来响应 NDK_ENOBUFS 错误。  您需要自己进行研究。

    我就此问题联系了一位内部专家、他认为这些 API 函数不应用于处理您观察到的错误。 他说、这些 API 将完全重置连接、因此使用它们将是一种变通办法、而不是适当的解决方案。 他建议(1)了解发生 NDK_ENOBUFS 错误的原因(未频繁处理数据包等)、以及(2)当错误发生时、检查调用 recv 以释放某些缓冲区是否有用。

    此致、
    弗兰克