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.

[参考译文] TMS320C6678:在 POSIX Pthread 中调用 socket 函数时、BSD 套接字创建始终失败

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/834640/tms320c6678-bsd-socket-create-always-fail-when-the-socket-function-is-called-in-posix-pthread

器件型号:TMS320C6678
Thread 中讨论的其他器件:SYSBIOSTMDSEVM6678

操作系统:Linux CentOS  

SDK 版本:PSDK 6.00.00.07,包括所有相关软件包、NDK、PDK、BIOS 和 IPC 等  

CCS:8.3.

我正在尝试迁移我们的软件以使用 MCSDK2.1中的最新处理器 SDK。 我已使用 PSDK 中的所有软件包成功编译我们的软件。  我在这一过程中遇到了一些问题、但我已解决了所有编译错误。 我有一个抱怨是、我在 CSL 中看到了许多毫无意义的 API 更改、基本上只是在 API 中添加或删除"undie"。   

现在真正的问题是、当我在 POSIX Pthread 中使用 BSD 套接字调用时、我会看到套接字创建错误。 我们软件中的大多数线程是使用 POSIX API 创建的 POSIX Pthread、而不是 TI 任务或 NDK 任务。 在我们的软件中、我们在 main 函数中创建一个任务、该任务会创建运行所有生产软件的所有 pthread。 在其中的一些线程中、我通过调用 BSD 套接字 API 来创建套接字。 这适用于旧的工具链,也称为 MCSDK2.x 我们的软件相当复杂、因此我修改了 NIMU_emacExample_EVMC6678C66BiosExampleProject、又称为 NDK hellworld 示例、以跟踪导致套接字调用错误的原因。  

在代码的 main 函数中、我创建了一个任务来创建一个运行函数的 pthread、该函数使用网络服务 BSD 头文件中的 BSD 套接字 API 创建套接字。 我遇到相同的错误、套接字调用始终在以下代码中返回-1。   

extern "C" int dtask_udp_hello2 (void)
{

while (!networkStackStarted)
{
Task_sleep(1000);
}
fdOpenSession (((void *) pthread_self ());

int skt;
skt =(int) socket (AF_iNet、SOCK_DGRAM、0);
if (skt=1)
{

printf ("套接字创建失败。\n");
}
fdCloseSession (pthread_self);

返回0;
}

我还尝试在 SYSBIOS 配置文件中将 autoOpenCloseFd 设置为 true、并删除了 fdOpenSession 和 fdCloseSession 函数调用。 这也不起作用。 此时我需要一些帮助。

我要附加示例项目。 要构建项目、请将变量"ns_install_path"更改为指向网络服务模块(ns_2_60_00_07)的安装位置。 此变量在"Project"->"Properties"->"CCS Build"->"Variables"选项卡中定义。

 

e2e.ti.com/.../psdkHelloWorld.zip

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

    这是定制板、还是 TMDSEVM6678?

    谢谢、
    Yordan

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

    我尝试了定制板和 c6678 EVM、两者都有相同的错误。 我所附的示例适用于 EVM。  

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

    您好!

    感谢您提供 CCS 项目、我能够复制该项目  skt = (int) socket(AF_INET,SOCK_DGRAM,0); return -1. I will check why is that and update.

    此致、Eric

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

    Wei Chen、

    我已经创建了您所附的示例(感谢您提供此示例)。 我会看到一些构建警告、我必须进行调查。

    我正在尝试理解您正在采取的步骤。 听起来就像您从 MCSDK 2.1开始并迁移到处理器 SDK C667x 6.00.00.07一样。

    我无法识别 MCSDK 2.1。 您是否提供下载链接或产品链接、以便我可以进行学习。

    谢谢、
    ~Ramsey

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

    Ramsey、

     很抱歉造成混淆。 我指的是用于 KeyStone I 器件  的 MCSDK2.0。

    但是、由于某种原因、到下行链接软件包的链接似乎已断开。  

    重要的是、我尝试将基于 MCSDK2.0的软件迁移到处理器 SDK。 但是、当我调用"socket"函数时、我总是会遇到错误、因此我的软件基本上会因为这些套接字错误而崩溃。 我故意使软件崩溃、因为此错误非常严重。 我们的软件很复杂、 因此我创建了一个更简单的示例、调用"socket"函数、这也给了我相同的错误结果。  

    步骤简单:

    1.创建一个任务并将其称为"任务 A"。 静态地在 main 中、

    2.在"任务 A"中创建一个 pthread。 pthread 由一个只创建套接字的线程函数创建。  

    上述过程模仿了我在我们的软件中拥有的内容。 我将上面提供的示例基于   Processor SDK 中 PDK 软件包中的 NIMU_emacExample_EVMC6678C66BiosExampleProject 示例。

    所有源代码更改都位于 HelloWorld.c 和 testSocket.cpp 文件中。 我在 SYSBIOS 配置文件中添加了以下行以添加 POSIX 支持、  

    VAR 设置= xdc.useModule('ti.posix.tirtos.Settings');


    此外,上面的示例还可能使用 DHCP 而不是静态 IP 地址。 也可以根据 MCSDK2.0中的 HelloWorld NDK 示例创建类似的项目。 如果有用、我可以在星期二回到办公室时尝试使用 mcsdk2.0创建相同的示例。  

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

    Wei Chen、

    感谢您澄清 MCSDK 2.1参考。

    我认为您在创建文件描述符表时调用了错误的函数。

    尝试在 fdOpenSession()调用中将 pthread_self()替换为 Task_self()

    fdOpenSession (((void *) Task_self ()));

    另外、请查看用户指南第2.3.1节。

    /NDK_3_60_00_13/docs/NDK/NDK_Users_Guide.html

    您将需要更新所有 会话 API 调用。

    ~Ramsey

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

    您好、Ramsey、

    我已经了解了 NDK 用户指南。 我 尝试了 pthread_self()和 Task_self(),结果是相同的。  它们应该相同。 正如我在上面提到的、我的代码中运行的所有线程都是 pthreads。 因此、fdOpenSession 实际上是在本示例中的 pthread 而不是任务的上下文中调用的。 因此,pthread_self()应该可以正常工作。   

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

    Wei Chen、

    对 fdOpenSession()的调用需要一个指向 SYS/BIOS 任务对象的指针,这就是 Task_self()将返回的内容。 对 pthread_self()的调用将返回指向 pthread_t 对象的指针。

    我在修正了这么多之后、我认为这个示例由于其他原因而失败。 例如、我看不到示例在何处等待网络启动。 我觉得对 socket()的调用太快了。

    从我看到的情况来看、您使用的是一个 Nimu 示例。 遗憾的是、此类示例未正确设置、无法进行 BSD 网络调用。 对于完整的网络示例、您必须具有 NDK 配置、挂钩和适当的启动调用。

    我建议您在应用程序中修复对 fdOpenSession()的调用,并查看发生了什么。 如果您的应用程序仍然失败、则我们需要找到合适的网络示例进行测试。

    ~Ramsey

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

    l 已尝试使用 Task_self()运行它,并且刚刚重试,它失败了。  pthread_self 实际上返回 Task_self()返回的值。 有一层软件抽象将 pthread_self 映射到 Task_self ()。

    关于等待网络堆栈启动:

    示例中有一些内容需要等待网络堆栈启动、 在文件 socketTest.cpp 中、 请参阅以下代码中的 while 循环

    extern "C" int dtask_udp_hello2 (void)
    {
    
    while (!networkStackStarted)
    {
    Task_sleep(1000);
    }
    fdOpenSession (((void *) pthread_self ());
    
    int skt;
    skt =(int) socket (AF_iNet、SOCK_DGRAM、0);
    if (skt=1)
    {
    
    printf ("套接字创建失败。\n");
    }
    fdCloseSession (pthread_self);
    
    返回0;
    }。 

    NetworkStackStarted 在 HelloWorld.c 的"NetworkOpen"函数中设置


    以上序列适用于 mcsdk2.0。 这是我三年来一直在做的事情。 不确定您在本示例中所说的内容是否未针对 BSD 正确设置。 NDK 仅设置传输。 传输设置完成后、根据用户指南、BSD 应独立于 NDK 工作。 我是 keepngiall 的源文件、使用 BSD API 与 NDK API 完全分离。 这是用户指南的建议。  如果有用、我可以使用 mcsdk2.0的 NDK HelloWorld 示例设置等效示例、以显示其工作正常。  
    最后、我认为、如果您在您的侧有相同的设置来重现问题、那么对话会更加有效。

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

    Wei Chen、

    好的。 感谢您测试应用。 看起来您正在正确地执行所有操作。 我必须进一步调查。

    无需设置 MCSDK 2.0示例。 我相信你以前也是这样做的。 我正在尝试弄清楚新 NDK 版本需要更改的内容。 我会随时向您发布。

    ~Ramsey

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

    Wei Chen、

    我正在与 Processor SDK 团队进行协调。 我预计明天会为您提供最新信息。 很抱歉耽误你的时间。

    ~Ramsey

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

    没问题。 谢谢 Ramsey

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

    您好、Wei、

    有几个方面...

    请在 fdOpenSession 中使用 TaskSelf()而不是 Task_self 或 pthread_self。  

    2.您未初始化 SlNetSock 接口。 我正在附加一个文件、我们将在另一个产品上使用该文件(请忽略显示呼叫)。  获取 IP 时调用 netIPAddrHook。 然后、您可以调用 SlNetSock_init 等  

    e2e.ti.com/.../tcpEchoHooks.c

    您能否尝试这两项更改、看看这是否有帮助? 有关 SlNetSock 层的更多详细信息、请参阅用户指南(ns_users_Guide.html)。

    Todd

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

    谢谢。 Todd、我会尝试一下。  

    文件中的某些内容似乎是特定于平台的。 c6678是否有任何示例? 如果不是、我建议 TI 提供一些 NS 模块的示例。 因为目前没有。 谢谢。

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

    我无法构建它。 我收到以下错误, 

    我在 PSDK 安装目录中执行了 grep 操作。 这些函数不存在。  

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

    Wei、

    您可以附加整个构建日志吗? 请附上、而不是复制/粘贴。

    Todd

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

    您好、Todd、

    我重建了 NDK、它工作正常。 似乎处理器 SDK 随附的 NDK 与 mbedtls 库具有相关性。  

    我进行了一些初始测试、套接字调用现在起作用、但是以下代码返回错误、  

    状态= SlNetIf 添加(SLNETIF_ID_1、"CC78 ETH"、
    (const SlNetIf _Config_t *)&SlNetIfConfigNDK、4);
    if (status!= 0){
    printf ("SlNetIf 添加失败(%d)\n"、
    状态);
    } 

    但 BSD 套接字似乎可以在不添加接口的情况下工作。 我会做进一步的测试、并发布我的最终结果、以便对其他人有用。  

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

    Wei、

    很高兴听到您通过了该问题。  

    您能否进入 SlNetIf 添加并查看失败的内容?  

    Todd

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

    Todd、

    更新:

    我不断遇到套接字的绑定故障。 不确定它是否与 SlNetif_add 失败有关、

    当我尝试调用 SlNetIf 添加时、我会得到"SlNetIf 添加失败(-2006)"。

    您是否知道 c6678的第一个、第二个和第四个参数使用的正确参数是什么?

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

    您好、Wei、

    2006年的网址为 slneterr.h

    /*参数无效*/
    #define SLNETERR_RET_CODE_INVALID_INPUT (-2006L) 

    查看 SlNetIf 代码、可能有两个原因。 您能否进入查看它是哪一个? 您可能已经使用 相同的 ID 调用了两次 SlNetIf_add。 这将导致故障。

    Todd

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

    您好 Todd、

    我尝试进入代码,但它没有正确执行,我相信它是因为我链接的库是使用不同的源代码构建的,而不是使用打包盒附带的代码。 我正在尝试弄清楚如何重建库"slnetsock_release.a"。

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

    以下行在 sertifndk.c 行2324中失败。  

    DEV = NIMUFindByName ((char*) ifName); 

    我传递到 SlNetIf_add 函数的接口名称错误。 但我应该使用什么接口名称? 我认为没有任何示例可以说明如何调用 c6678的函数。 我尝试传递 NULL、但它也失败了。   

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

    Wei、

    这是 Nimu 驱动程序指定的名称。 您使用的是哪个 Nimu 驱动程序? 您可以查看 NIMUDeviceTable 结构、找到通常设置名称的 init 函数。 您还可以通过 NIMUFindByIndex()获取 NETIF_DEVICE 指针。 此结构具有它的名称。

    Todd

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

    好的、我尝试了以下代码来添加接口、它工作正常、

    状态= SlNetIf (SLNETIF_ID_1、"eth0"、(const SlNetIf Config_t*)和 SlNetIfConfigNdk、4);
    
    

    但当我尝试使用 recvfrom 接收数据包时、我会收到另一个错误。 在 sleertifndk.c 中第1564行断言的代码   

    问题是,从->sa_family 为0。 我再次随附了该示例、并进行了一些更新。  e2e.ti.com/.../psdkHelloWorld2.zip

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

    Wei、

     从->sa_family 中有什么价值? 为了进行验证、我要查看的断言是

    assert (fs->sa_family =AF_iNet);
    

    为什么要在任务中打开和关闭 fdSession? 注意:遗憾的是、我现在无法访问电路板(我正在旅行)、因此无法运行示例。 您有多项任务。 您能告诉我哪一个发生了恢复失败吗?

    Todd

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

    值为0、  

    我认为打开和关闭导致了错误。 但我在一开始只尝试了一次 openFdSesssion、最后才结束 结果相同。

    仅供参考、"recv"函数起作用、但不起作用。 我能够使用 recv 函数获取 UDP 消息。  

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

    事实上、它与非阻塞标志(MSG_DONTWAIT)或(SO_NONBLOCKING)有关。 似乎不喜欢我尝试进行非阻塞呼叫。  

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

    因此、我认为断言是不必要的触发、

    "Recvfrom (恢复)"在 NDK_3_60_00_13/packages/ti/NDK/sock/sock.c 中调用 SockRecv (通过 NDK_recvfrom)。 当 MSG_DONTWAIT 置位且网络队列中没有消息等待时、函数"SockRecv"不会写入结构 sockaddr。 请参阅 SOCS.C 中的第1515行 只要 MSG_DONTWAIT 置位、并且网络队列中没有任何内容可供选择、就会触发断言。 请参阅下面的对 SockRecv 的调用路径。

    那么、从 recvfrom 的调用跟踪是  

    Recvfrom 调用 NDK_recvfrom (NDK_3_60_00_13/packages/ti/NDK/stack/FDT/socket.c)、

    NDK_recv 调用 SockRecv、

    因此、我认为我们可能能够通过在 slnertifndk.c 中的断言中添加一个检查来解决这个问题、

    if (!(flags&MSG_DONTWAIT)
    ){
    assert (fer->sa_family==AF_iNet);
    
    } 

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

    Wei、

    我研究了这一点、这确实是 NDK 中的一个错误。 我提交了一个错误(NDK-469:如果 MSG_DONTWAIT 在标志中传递、SlNetIfNDK_Recvfrom 将触发错误的断言)以解决此问题。  

    要暂时解除阻止、我建议修改您的代码以进行调用  

    remaddr->sa_family = AF_iNet;
    int rxLength = recvfrom (skt、rxBuf、rxBufSize、MSG_DONTWAIT、(struct sockaddr *)&remaddr、(socklen_t*)&addrLen); 

     Recvfrom 不会清除您的 sockaddr 结构、因此这个额外的代码位将允许您越过断言。  

    此致、

    达尔顿

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

    好的、谢谢。  

    此外、随 PSDK 附带的 NDK 模块"slnertifndk.ae66"默认构建为链接到"mbedtls"库。 TI 不提供 mbedtls lib。 如果用户尝试将 slnertifndk.ae66用于6678、则会导致生成失败。 解决此问题的方法是在没有"mbedtls"的情况下重建 NDK。  

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

    Wei、

    谢谢。 我们将与 PDK 团队合作、在将来将 BSD 示例包含在 SDK 中、从而使这一过程更加简单。 感谢您耐心观看此主题。  

    Todd