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/66AK2H12:使用 BSD 套接字并获取任务句柄

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/677450/rtos-66ak2h12-using-bsd-sockets-and-getting-task-handle

器件型号:66AK2H12

工具/软件:TI-RTOS

XDCtools 3.32、SYS/BIOS 6.46、CCS 7.4、PDK 4.0.7、NDK 2.25

我正在尝试编写一个 BSD 套接字应用、以便在 ARM0上运行。 我在 BSD 部分的 NDK API (spru524j)中读出、我应该仅在中包含文件  /packages/ti/ndk/inc/bsd、并确保不包含文件  /packages/ti/ndk/inc/.  

"包含 BSD 样式代码的文件可以包括 ti/NDK/inc/bsd 目录树中的头文件(对于
示例、sys/socket.h)、并且不需要包含 ti/ndk/inc 中找到的任何 NDK 头文件及其
不是 BSD 子目录的子目录。"

要使用套接字接口,我需要使用 fdOpenSession()打开文件系统,以便对当前任务执行句柄。 中未定义句柄  /packages/ti/ndk/inc/bsd. 此外,这些示例显示调用 TaskSelf()以获取句柄,但 TaskSelf()位于中  /packages/ti\ndk\inc\os\osif.h、我不想包含这些文件。

那么、如何获取运行 BSD 套接字代码的任务的句柄、以及在哪里可以找到定义的句柄?

谢谢、

Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

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

    您能否检查*。cfg 文件中是否有以下设置。
    global.enableCodeGeneration=true;

    还是等于 false?

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

    您好 Mike、

    我们检查了您的另一个 NDK 论坛主题、注意到您具有 Global. enableCodeGeneration=false;。 如果为 true,则会自动调用 fdOpenSession(),但由于将其设置为 false,我们必须解决此问题。

    您能否尝试以下操作:

    //newfile.c
    #include 
    
    void openFdSession()
    {
    fdOpenSession(TaskSele();
    }
    
    void closeFdSession()
    {
    fdCloseSession(TaskSele());
    } 

    //yoursocket.c
    #include 
    extern void openFdSession();
    extern void closeFdSession();
    
    void yourSocketFunction()
    {openFdSession()
    ;
    
    //您的套接字代码
    
    closeFdSession();
    } 

    这样您就可以打开文件描述符会话,而不会出现任何编译错误或冲突。  

    此致、

    达尔顿

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

    我还需要使用轮询(),它看起来是在 NDK 下,而不是在 BSD 下,并进行处理。 以上内容是否适用于 此类应用?

    更一般而言、除了关于 BSD?

    以及套接字的定义。 能否使用从 DemonNew 回调传递给任务的套接字描述符?

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

    在需要使用句柄的任何位置使用 void *。 我需要向我的同事询问 DemonNew 函数、然后再向您介绍一下。

    此致、
    达尔顿
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否使用 fdCloseI()或 Close()关闭传递的套接字?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我现在已经开始了#include 噩梦、但在我尝试取消它之前、我想更有信心它将会起作用、因为:

    • 该套接字通过 DeamonNew 回调传递给我、且在以太网中为 void *和 int
    • 我需要使用 POLL()

    作为快速测试、我返回 PDK NIMU_emacExample_EVMK2H_armBiosExampleProject 中提供的示例、并尝试将其转换为使用 BSD 套接字接口。 (FWiw:我很失望看到为这个 NDK API 文档明确指出的旧版代码提供的示例将在未来被删除)。

    我按照 NDK API 中的指示更新了文件 udpHello .c 并将 BSD 包含路径添加到编译器的搜索路径中。 我正在粘贴下面的整段 udpHello .c。 接下来是我遇到的编译器错误。 请注意,我甚至还没有尝试使用 POLL()函数。 您能帮我让这个 HelloWorld 示例正常工作吗? 这会给我一些信心。 否则、我的方法可能是使用 "传统"非 BSD 接口。

    此致、
    Mike

    //#include 
    #include 
    #include 
    
    //
    // dtask_udp_hello()- UDP Echo Server Daemon 函数
    //(sock_DGRAM,端口7)
    //
    //如果套接字"S"仍处于打开状态,则返回"1",如果已关闭,则返回"0"
    //
    int dtask_udp_hello (int s,uint32_t 未使用)
    {
    struct sockaddr_in sin1;
    结构时间值 至;
    内部 i、tmp;
    特性 pBuf[5000];
    //句柄 hBuffer;
    struct sockaddr 发件人;
    socklen_t fromlen;
    (无效)未使用;
    
    //将套接字超时配置为3秒
    TO.tv_sec = 3;
    TO.tV_usec = 0;
    setsockopt( s, SOL_socket , SO_SNDTIME,&TO, sizeof( to ));
    setsockopt( s、SOL_socket、SO_RCVTIMEO、&to、sizeof( to ));
    
    for (;;)
    {
    tmp = sizeof (sin1);
    I =(int) recvffrom (s、pBuf、5000、MSG_WAITALL、&from、 Fromlen);
    // i =(int)recvncf( s,(void **)&pBuf,0,(PSA)&sin1,&tmp, hBuffer (&H);
    
    //将任何数据移回
    if (i >=0)
    {
    SendTo( s、pBuf、5000、0、&f, Fromlen );
    // recvncfree( hBuffer );}
    
    其他
    中断;
    }
    
    //由于套接字仍处于打开状态,返回“1”
    //(我们需要保持 UDP 套接字处于打开状态)
    返回(1);
    }
    

    编译错误:

    说明资源路径位置类型
    '_Types_FD_Set'没有名为'count'Nimu_emacExample_EVMK2H_armBiosExampleProject第121行的成员,外部位置:C:\ti\ndk_2_25_01_11\packages \ti\ndk\inc\socketndk.hc+ problem_inc '_ce_nimbosExample_bes\f1\ine_bse_bs\cles\con_ine_ng01_ines\f1\embd_em_bd_bs\cles\con_ine_n_ore_bs\con_bs\cles\f1\em_embse_n_ore_bd_bse_ces\cles\con_ines\con_ore_n_bs\con_ines\f1\emines\f1\emines\f1\embs\con_ines\f1\embs\cles\con_ines\f1\em_ines\f1\embd_ines\f1\embs
    
    socketndk.h socketndk.h
    ***[udpHello.o]错误1NIMU_emacExample_EVMK2H_armBiosExampleProjectC/C++问题
    gmake:目标'all'不会由于错误而重做。NIMU_emacExample_EVMK2H_armBiosExampleProjectC/C++问题
    配方、用于目标'udpHello .o'失败的subdir_rules.mk/NIMU_emacExample_EVMK2H_armBiosExampleProject/Debug行121C/C++问题
    

    和大量警告(在原始示例中存在许多警告是公平的。 其中大多数是格式()警告和 pragma 警告。 对于开箱即用的示例会有如此多的警告、再次有点令人失望)。 有几个 fdXXXX()参数警告值得关注。  

    编译警告:

    说明资源路径位置类型
    格式'%d'需要类型为'int'的参数,但参数2具有类型'int32_t'[-Wformat=]Nimu_cpi_qmss_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProject行271C/C++ Problem
    格式'%d'需要'int 类型的参数 但参数2的类型为'int32_t'[-Wformat=]Nimu_cpi_qmss_iface.c/Nimu_emacExample_EVMK2H_armBiospleProject行482C/C++ Problem
    format '%d'需要类型为'int'的参数、但参数2的类型为'int32_t' armBiospleProject 行482 C/C++ Problem 格式'%d'、'%nimintrace'_examine_c'_c'_t'
    、'_examine_c'_cines'类型为'_'_'_'nime'_'_cines' 但参数2的类型为'int32_t'[-Wformat=]Nimu_cpi_qmss_iface.c/Nimu_emacExample_EVMK2H_armBiospleProject行555C/C++ Problem
    format '%d'需要'int'类型的参数、但参数2的类型为'int32_t'armBiospleProject line 555 '%/nimule'_examinu+'_c'
    类型为'nime'_c'类型'_intres'_c'_'_'_'_'_'_'_'_ines'、且参数为'nime'nime'_c'_ines'_'_'_'_'_ 但参数2的类型为'int32_t'[-Wformat=]Nimu_pa_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProject第272行C/C++问题
    格式'%d'需要类型为'int'的参数、但参数2的类型为'int32_t'[-WPA_armBiosExampleProject 第272行'%nimu_c+
    、'_iniples'类型为'_inime'_c'、'_inimini_ini_ines'类型为'_ini_ini20_ini_c' 但参数2的类型为'int32_t'[-Wformat=]Nimu_pa_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProject第287行C/C++问题
    格式'%d'需要类型为'int'的参数、但参数2的类型为'int32_t'[-WPA_armBiosExampleProject 第287行'%nimu_c+、'%_iniples'类型为'_inimini_ini_ini_c'、'_ini_ini_ines'类型为'_ini_ini_c'、'_ini_ini_ini_ines'
    但参数2的类型为'int32_t'[-Wformat=]Nimu_pa_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProject第302 C/C++行问题
    格式'%d'需要类型为'int'的参数、但参数2的类型为'int32_t'[-WPA_armBiosExampleProject 第302 C/C++问题格式'%nime+'_c'、'_iniemace'_c'
    类型为'nime'_ines' 但参数2的类型为'int32_t'[-Wformat=]Nimu_pa_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProjectline 331C/C++ Problem
    format '%d'期望值类型为'int'的参数、但参数2的类型为'Qmss_QueueH'
    、'nim_qeExamples'类型为'-inu_c+_intrue'_inu+'_ines'、'nime'_inu+_ines'类型为'nime'_inu+_inu_ines' 但参数2的类型为'uint32_t'[-Wformat=]Nimu_cpi_qmss_iface.c/Nimu_emacExample_EVMK2H_armBiospleProjectline 340C/C++ Problem
    format '%d'需要类型为'int'的参数、但参数3的类型为'Int32_armBiospleProject line 340 C/C++ Problem 格式'%d'、'%d'/intrabout_c'_c202'_ines'
    但参数3的类型为'uint32_t'[-Wformat=]Nimu_cpi_qmss_iface.c/Nimu_emacExample_EVMK2H_armBiospleProjectline 340C/C++ Problem
    format '%x'需要类型为'nimu_emacExample_EVMK2H_armBiospleProject line '/unsigned '/intrace'_c'_ines'的参数
    但参数3具有类型为'long unsigned int'[-Wformat=]Nimu_pa_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProject第287行C/C++问题
    格式'%x'需要类型为'unsigned int'的参数、 但参数3具有类型'long unsigned int'[-Wformat=]Nimu_pa_iface.c/Nimu_emacExample_EVMK2H_armBiosExampleProjectline 302C/C++ Problem
    ignoring #pragma DATA_ALIGN [-WUNKNOKNOWN - UNKMMAN.c/IMU_EMOPEN_ANSION_ING_WRAMEpragma ENAMBEE_INPEE_SECTION #pragma
    ENCH_INEE_INEE_INEE_W278_ENCH_EM_NOT_WEM_NOWN EP_ENCH_ENCH_INES_IN_IN_IN_INEE_INEE_NOT_WEM_INPEE_IN_ENCH_INPEE_INPEE_SECTION #pragma ENCH_INEE_INEE_NOT_WEM_INPEE_INES_IN_IN_IN_IN_NOT_WQ_INPEE_INPEE_INPEE_INPEE_INP_EN_IN_IN_INPEE_INPEE_EN
    
    /emu_emacExample_EVMK2H_armBiosExampleProject行79C/C++ problem
    ignoring #pragma DATA_SECTION [-WUNKNOT-pragmas]Nimu_cpi_qmss_iface.c/Nimu_emacExample_EVMK2H_armExampleProjectline 80C/C++ unknown NIMu_cintrab_c_ce_pragma
    #pragma _ce_cine_cine_cine_cine_cy_em_pragma _ce_ce_ce_nimbios_pragma _prage_ce_ce_ce_pragma #nim_prage_ce_ce_ine_ce_ce_ce_ce_nim_pragine_ine_intrabout_ce_nimul_ce_nim_ce_nim_ce_nim_ce_ine_nim_ce_ine_nim_prages_ce_ine_ine_ine_ine_ce_ine_ine_ine_ine_ine_ine_ine_ine_ine_ce_ce_
    
    
    /Nimu_emacExample_EVMK2H_armBiosExampleProject第1行C/C++问题
    函数'System_flush'的隐式声明[-Wimine-function-declaration]HelloWorld.c/Nimu_emacExample_EVMK2H_armBiosExamRemoveProject第188行C/C++问题
    传递参数1个不socketndk.h
    兼容的参数:\nimu_enam_enam_enam_enam_enam_en_enam_enam_en_enam_enam_enam_en_enam_enam_en_enam_in_en_enam_enam_en_enam_enam_out1C:\ti\ndk_2_25_01_11\packages/ti\ndk\inc\bsd\socketndk.hC/C++ problem
    ping arger 2 of 'fdSelect' from incompatible pointer typeNimu_emacExample_EVMK2H_armBiosExampleProjectline 317 in兼容、external location:c:\ti\ndk_2_nimacExample_bine_incompatible socket.h
    pointer2 nimum_emine_ine_inline 从 nimum_emine_cines\cles\cl_incompatible nimbs\cl_ine_ines\cles\cles\cles\cles\cles\cles\cles\cles\cles\cles\cles\coes\coes\coes\coes\coes\coes\coes\coes\coes\coeines\coes\coes\coes\coes\coes\coes\coe
    C:\ti\ndk_2_25_01_11\packages/ti\ndk\inc\bsd\sys\socket.hC/C++ problem
    ping arger 3 of 'Pa_getBufferReq' from incompatible pointer typeNimu_pa_iface.c/Nimu_emacExamample_EVMK2H_armBiosExampleProjectline incompatible outline 从不
    兼容的 nimu_armExample.c /in_c+ out_c+ pointer 类型 NIMu_eminline 选择不兼容的 nimu_emacExample_ine_ine_ine_inlineC:\ti\ndk_2_25_01_11\packages/ti\ndk\inc\bsd\sys\socket.hC/C++ problem
     unused variable 'i'[-Wunused_variable]HelloWorld.c/Nimu_emacExample_EVMK2H_armExampleProjectline 134C/C++ problem unused [-wunused_armace.c+
    unused /nimum_c_armacout_c_ctract_y_c_em_c_cybot_ce-winc'nimum_c'nipq_c'nipqe' unused_c' unused_c'nipq_c' unus_c'nipqe'bot_c' unuse'bandemines+c' unus_c'nipqe'nipqe'_c
    
    

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

    您好 Mike、

    您可以在守护程序函数中使用 BSD 套接字 API–只需使用作为参数传入的套接字调用 BSD API、然后将其转换为 int。 此外,将函数签名更改为使用“void *”而不是“socket”。

    例如:

    #include 
    
    void myDemonFxn (void *skt、uint32_t 未使用)
    {
    
    send((int)skt、someDataBuffer、amtToSend、0);
    
    …
    } 

    这将起作用,因为 NDK BSD socket() API 仅调用下面的旧 socket() API,并将 socket 转换为 int 并返回它(文件描述符实际上是 socket…的地址)。

    此致、

    达尔顿

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

    这是否得到了解决?

    谢谢、
    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Todd 我已不再尝试使用 BSD。 我的设计需要使用 Poll()和 NDK API 中描述的其他函数。 我不知道还有什么东西会咬我。 IMO BSD 尚未准备好在这里度过黄金时间。 所有这些变通办法;铸造、为 fdOpenSession 创建桩线、fdEtc、以使其进行编译、不会给我一种温暖的模糊感觉。 如果 BSD 在未来仍将保留、则需要对 NDK 手册进行一些认真的修订。 很抱歉听起来有些负面、但试图诚实。
    感谢你的帮助。
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mike:

    我们在较新的 NDK 版本中对 BSD 支持进行了改进,但这意味着要迁移到较新的 SYS/BIOS 等。组件也...如果您有工作正常,可能不是时候解决这个问题了。

    我们感谢您的反馈。 我要将此主题转发给负责 NDK 的开发经理。 如有必要、我们能否离线跟进您的问题?

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

    你(们)好。

    欢迎您跟进。 我假设您可以访问我的电子邮件信息。

    Mike