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.

[参考译文] AM4376:tcpecho 示例和 SNTP

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/951156/am4376-tcpecho-example-and-sntp

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

您好!

TI_RTOS。

1) 1)我想使用 tcpecho 示例。 如何为相同的项目生成项目?

2) 2)之间的差异是什么

2.1) C:\ti\pdk_am437X_1_0_17\packages\ti\transport \NDK\Nimu
和2.2) C:\ti\pdk_am437X_1_0_17\packages/ti\transport \ndk\Nimu_ICSS?
3) 3)如果我想运行 tcpecho 和其他应用程序以及 EIP 适配器功能、是否可行?

或者我是否必须创建两个不同的 projcet (二进制文件)?

4) 4)如何将 SNTP 示例添加到 EIP 适配器项目?

此致、

Vrund

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

    Vrund、

    1) 1)您可以从 processor_sdk_rtos_AM437X_6_03_00_106\demos\rtos_template_app 项目开始、然后将 NDK API 用户指南第5.4.2节"服务器守护程序示例"中描述的 tcpecho 服务器示例添加到项目中。

    2) 2)\NDK\NIMU 基于 CPSW、而 NIMU_ICSS 基于 ICSS_EMAC。

    3) 3)您可以将 tcpecho 集成到 EIP 中。

    4) 4)基本上可以使用以下方法之一

    1. 要使用默认 NTP 服务器(SNTP_getTime(),服务器列表为 NULL )
    2. 您有一个或多个 NTP 服务器的字符串名称(SNTP_getTime(),带有服务器列表)
    3. 您有 NTP 服务器的 saddr (SNTP_getTimeByAddr()和 sockaddr)

    如 文件///C:/ti/ns_2_40_01_02/docs/ns/html/group__ti__net__sntp__SNTP.html 中所述,EIP 项目的详细信息。

    此致、

    Garrett

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

    您好!

    1) 1)您可以从 processor_sdk_rtos_AM437X_6_03_00_106\demos\rtos_template_app 项目开始、然后将 NDK API 用户指南第5.4.2节"服务器守护程序示例"中描述的 tcpecho 服务器示例添加到项目中。

    --我已经创建了项目并添加了 daemon。c 示例提供了"C:\ti\ndk_3_40_01_01\packages/ti\ndk\nettools\daemon ",但它没有生成。 下面是构建日志。

    ****项目 RTOS_TEMPLE_APP_AM335x_A8的配置调试构建****

    "C:\\ti\\ccsv7\\utils\\bin\\gmake"-k -j 8 all -O  

    gmake[1]:进入目录'C:/Users/vrund Rana/workspace_v7/rtos_template_app_AM335x_A8/Debug'

    '生成文件:./main.cfg '

    '调用:XDCtools '

    "C:/ti/xdctools_3_50_03_33_core/xs "--xdcpath="C:/ti/bios_6_73_00_12/packages;C:/ti/pdk_am335x_1_0_12/packages;C:/ti/ccsv7/ccs_base;" xdc.tools.configuro configPkg -t GNU.targets.arm.a8F -p ti.platforms.evmAM3359 -r release -c "C:/ti/gcc-arm-none-eabi-6-2017-q1-update "..main.cfg

    正在制作 package.mak (由于 package.bld)...

    正在为软件包 configPkg 生成接口(因为 package/package.xdc.inc 比 package.XDC 旧)...

    从 package/cfg/main_pa8fg.cfg 配置 main.xa8fg ...

    正在生成自定义 ti.sysbios 库 makefile ...  

    链接库 ti.drv.SPI:./lib/am335x/a8/release/ti.drv.spi.aa8fg

    链接库 ti.drv.UART:./lib/am335x/a8/release/ti.drv.uart.aa8fg

    链接库 ti.drv.i2c:./lib/am335x/a8/release/ti.drv.i2c.aa8fg

    链接库 ti.csl:./lib/am335x/a8/release/ti.csl.aa8fg

    链接库 ti.osal:/lib/tirtos/a8/release/ti.osal.aa8fg

    正在开始构建库源...

    使 C:/Users/VRUNDR~1/workspace_v7/rtos_template_app_am335x_A8/src/sysbios/sysbios.aa8fg...

    gmake[1]:进入目录`C:/Users/VRUNDR~1/workspace_v7/rtos_template_app_am335x_A8/src/sysBIOS'

    gmake[1]:没有为`all '执行任何操作。

    gmake[1]:离开目录`C:/Users/VRUNDR~1/workspace_v7/rtos_template_app_am335x_A8/src/sysBIOS'

    已完成库构建。

    cla8fg 封装/cfg/main_pa8fg.c……

    '完成的建筑:./main.cfg '

    '

    gmake[1]:离开目录'C:/Users/vrund Rana/workspace_v7/rtos_template_app_AM335x_A8/Debug'

    'building file:./daemon .c'(构建文件:./daemon .c')

    '调用:GNU 编译器'

    "c:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe "-c -mcpu=cortex-A8 -mtun=cortex-A8 -March =armv7-a -marm -mfloat-abi=hard -Dam3358 -DevmAM335x -DSOC_AM335x -i"C:/Users/vrund Rana/workspace_v7/rtos_template_app_app_strict-mf"-mf_mv/gmd /ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include daemon -mf -mf -config-mf -mv/gmd @守护程序-mf"-mf"-mf"-mf"-mf_mv/mf"-mf"-mf_mf_mf_mv3 -daemon -mf -mf -mf -mf -mf -md -m

    subdir_rules.mk:9:目标'dataemon.o'的配方失败

    ./daemon.c:42:21:致命错误:netmain.h:无此类文件或目录

     #include

               ^μ A

    编译已终止。

    gmake:***[daemon.o]错误1.

    '生成文件:./main.c'

    '调用:GNU 编译器'

    "c:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe "-c -mcpu=cortex-A8 -mtune =cortex-A8 -March =armv7-a -marm -mfloat-abi=hard -Dam3358 -DevmAM335x -DSOC_AM335x -i"C:/Users/vrund Rana/workspace_v7/rtos_template_app_app_strict-dmf"-mf"-mc-mf_main.c -mf"-mf"-mf"-mf"-mf"-mf_mf"-mf"/ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include -mf_mf_mf"-mf_mf_mf_mf"-mf_main.config-mf"-mf"-mf"-mf"-mf"-m @

    '完工建筑:./main.c'

    '

    '生成文件:./app.c'

    '调用:GNU 编译器'

    "c:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe "-c -mcpu=cortex-A8 -mtune =cortex-A8 -March =armv7-a -marm -mfloat-abi=hard -Dam3358 -DevmAM335x -DSOC_AM335x -i"C:/Users/vrund Rana/workspace_v7/rtos_template_app_strict_mce-mc"-mce-wap.md"-mf"/ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include -mf"-mf"-mf_mc-config-mf"-mf"-mf"-mf"-mf_mf_mf_mf_mc"-mf_mc"-mf_mf_mc"-mf_mf_mc"-mv-mf_b.@

    '完成的建筑:./app.c'

    '

    gmake:目标"全部"不会由于错误而重新生成。

    ****构建完成****

    请给出建议。

    此致、

    /* 版权所有(c) 2014-2017年,德州仪器公司 *保留所有权利。  * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: *  *源代码的重新分发必须保留上述版权 声明*  、此条件列表和以下免责声明。  * ** *二进制形式的再发行必须在      *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。  * *** 未经      事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。  * *本软件由版权所有者和贡献者"按原样"提供 *、  不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润;  *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。  **//* *=== daemon.c ====  * *此文件实现了一个简单的网络守护程序。  * **/
    #include #include
    #include #include <_stack.h>
    /********  秘书长的报告 本地定义  (二 /
    #define daemon_MAXRECORD 12.
    /********  秘书长的报告 本地架构  (二 /
    /**  *@brief  * 该结构描述了守护程序条目。  */ typedef 结构 {  /**   *@  套接字的简短类型。 对于 V4、可以是 SOCK_STREAM、    * SOCK_STREAMNC、SOCK_DGRAM、但对于 V6、这只能    是* SOCK_STREAM 和 SOCK_DGRAM。     */  uint32_t  类型;
      /**   *@将  套接字绑定到的简单本地 V4地址   * 在大多数情况下,此地址作为 INADDR_ANY 传递   */  uint32_t  LocalAddress;
    #ifdef _include_ipv6_code  /**   *@套  接字绑定到的本地 V6地址*    在大多数情况下,该地址作为 IPV6_unspecified_address 传递。    */  IP6N     LocalV6Address;#endif
      /**   *@将  守护程序绑定到的本地端口*   这不能为 NULL。    /uint32_t    LocalPort;
      /**   *@在     注册的守护程序上接收到*数据时调用的简短回叫函数。    */  int      (* PCB)(socket、uint32_t);     /**   *@  子任务的简短优先级。    */  uint32_t  priority;
      /**   *@  子任务的简要堆栈大小。    /uint32_t    STACKSIZE;
      /**   *@将  传递给回叫例程的简短参数。    */  uint32_t  参数;
      /**   *@可以  生成的用于处理   守护程序的任务的最大数量的简短说明*。    /uint32_t    MaxSpawn;
      /**   *@由  守护程序创建以供使用的内部套接字简短说明。    */  套接字   ;
      /**   *@  为处理守护程序而产生的任务的简短数量。    */     uint32_t  任务 Spawned;
      /**   *@指向  子项的简短指针。    */  struct _child *PC;}DREC;
    /**  *@brief  * 该结构描述了守护程序子任务的数据实例。  */ typedef struct _child {  //*   @指向  前一个子级或 NULL 的简短指针   */  struct _child * pPrev;
      /**   *@  指向下一个子项的简短指针或 NULL   */     struct _child *pNext;
      /**   *@  子任务的简短句柄   */  void   *hTask;
      /**   *@子  任务正在其上运行的简单套接字。    */  套接字   ;
      /**   *@确定  "子"套接字是否关闭的简短标志   *。    */  int      closeSock;}个孩子;
    /********  秘书长的报告 全球结构  (二 /
    静态 DREC 精确[daemon_MAXRECORD];静态 FDPOLLITEM 轮询项[daemon_MAXRECORD];
    static void *hDTask = 0;    //主守护程序任务线程的句柄*/static void *hDSem = 0;     /*处理我们的排除信标*/static uint32_t RequestedRecords;/*精确中已初始化的记录数*/
    static void daem();static void dchild ( dec *pd,child *PC );
    /********  秘书长的报告 守护程序函数*********  (二 /
    /**  * @b Description * @n   *   该函数创建 V4 Daemon。  *  *@param[in] 类型 *   这是通过守护程序打开的套接字类型。 如果    是*的 IPv4    、则支持所有套接字类型、例如 SOCK_STREAM、SOCK_STREAMNC 和* SOCK_DGRAM。  * @param[in] LocalAddress *   这是套接字将绑定到的本地地址。  *   在大多数情况下、这通常传递为 NULL。  * @param[in] LocalPort *   这是要服务的本地端口(不能为 NULL) * @param[in] PCB *   调用要调用的回调函数。  * @param[in] priority *   要为回调函数创建的新任务的优先级  * @param[in] STACKSIZE *   要为回调函数创建的新任务的堆栈大小 * @param[in] 参数 *   传递给回调函数的参数(除套接字外) * @param[in] MaxSpawn *   回调函数实例的最大数量 (对于 UDP、必须为1) *  *@retval *   Success -处理衍生的守护程序。  * @retval *   Error  - 0 */void * DemonNew (uint32_t Type、uint32_t LocalAddress、uint32_t LocalPort、          int (* PCB)(插座、uint32_t)、uint32_t priority、          uint32_t STACKSIZE、uintptr_t 参数、uint32_t MaxSpawn){  int i;  DREC * PDR = 0;
      /* sanity 检查参数*/  if (Type=SOCK_DGRAM)     MaxSpawn=1;  否则 if (Type!=SOCK_STREAM && Type!=SOCK_STREAMNC)     返回(0);
      if (!LocalPort ||!PCB || Priority<1|| Priority>15||!STACKSIZE ||!MaxSpawn)     返回(0);
      /*我们将借用栈的内核模式作为临时排除方法*/  llEnter();  if (!hDSem)  {     hDSem = SemCreate(1);     memset( srec、0、sizeof (drec)));     RequestedRecords=0;  }  llExit();
      /*此时我们必须有一个信号量*/  if (!hDSem)     返回(0);
      /*输入我们自己的锁*/  SemPend( hDSem,SEM_FOREVY );
      /*扫描列表中的空闲插槽*/  for (i=0;i;<DAEMON_MAXRECORD; i++ )     if (!dlrec[i].Type &&!dlrec[i].TasksSpawed)       中断;
      /*如果没有可用记录则中断*/  if (i=daemon_MAXRECORD)     转至错误;
      /*生成新记录*/  PDR =&drec[i];  PDR->类型      =类型;  PDR->LocalAddress = LocalAddress;  PDR->LocalPort  = LocalPort;  PDR->PCB      = PCB;  PDR->Priority   = Priority;  PDR->STACKSIZE  = STACKSIZE;  PDR->Argument   = Argument;  PDR->MaxSpawn   = MaxSpawn;   pdr->s       =无效的套接字;
      /*如果 Deamon 任务存在,则 ping 它,否则创建它*/  if (hDTask)     fdSelectAbort( hdTask );  否则  {     hDTask = TaskCreate (daemon、"daemon"、priority、STACKSIZE、0、 0、0);     if (hDTask)       fdOpenSession (hDTask);     其他     {       pdr->Type = 0;       PDR = 0;       转至错误输出;    }   }
      请求记录++;
    errorout:  /*退出我们的锁*/  SemPost (hDSem);  return (PDR);}
    /**  * @b Description * @n   *   该函数用于清理以前创建的 V4守护程序。  * * @param[in] hEntry *   这是先前使用     DemonNew *创建的守护程序的句柄  @sa *   DemonNew *  @retval *   不适用。  /void DemonFree (void *hEntry){  DREC *PDR =(DREC *) hEntry;  子* PC;
      /*此时我们必须有一个信号量*/  if (!hDSem)     返回;
      /*输入我们自己的锁*/  SemPend( hDSem,SEM_FOREVY );
      /*完整性检查*/  if (pdr->Type!=SOCK_STREAM && pdr->Type!=SOCK_STREAMNC && pdr->Type!=SOCK_DGRAM)     转至错误;
      /*清除记录*/  PDR->Type = 0;  RequeedRecords-;
      /*关闭所有儿童的套接字会话。 这将使*/  /*最终从代码中退出,并且*/  /*关闭它们的套接字*/  PC = PDR->PC;  while (PC)  {     if (PC->hTask)     {       fdCloseSession( PC->hTask );       PC->hTask = 0;    }     PC = PC->pNext;  }
      /*关闭套接字(这将唤醒使用它的任何人)*/  if (pdr->s != invalid_socket)  {     fdClose (pdr->s);     pdr->s = invalid_socket;  }
      /*如果没有更多记录,请关闭守护程序任务的*/*  文件描述符会话。 这将导致错误*/*  输出并将其自身删除*/  if (!RequestedRecords ){       fdCloseSession( hDTask );     hdTask = 0;  }
    errorout:  /*退出我们的锁*/  SemPost (hDSem);}
    静态 void daemon (){int           i、closeSock;  struct sockaddr_in sin1;  socket        tsock;  儿童        *PC;
      /*输入我们的锁*/  SemPend( hDSem,SEM_FOREVY );
      for (;;)  {     /*创建任何需要创建的套接字*/     for (i=0;i         /*如果套接字已创建,请将其绑定*/         if (dlec[i].s!= invalid_socket)         {           /*绑定到指定的服务器端口*/           memset(&sin1, 0, sizeof(struct sockaddr_in)));           Sin1.Sin_Family   = AF_iNet;           sin1.sin_addr.s_addr = dlec[i].LocalAddress;           Sin1.Sin_port     = NDK_htons (dlec[i].LocalPort);
              if (bind (dlec[i].s、(struct sockaddr *)&sin1、sizeof (sin1))<0)           {             fdClose (dlec[i].s);             dlec[i].s = invalid_socket;          }         }
            /*如果套接字绑定到 TCP,则开始侦听*/         if (dlec[i].s!= invalid_socket && dlec[i].Type!= sock_DGRAM)         {           if (listen (drec[i].s、drec[i].MaxSpawn)< 0)           {             fdClose (dlec[i].s);             dlec[i].s = invalid_socket;          }         }       
          /*更新 fdPoll 数组*/       pollitem[i].fd = dlec[i].s;       if (dlec[i].Type && dlec[i].TasksSpawned < dlec[i].MaxSpawn)         pollitem[i].eventsRequesteded = Pollin;       其他         pollitem[i].eventsRequestined = 0;    }
        /*离开我们的锁*/     Sempost( hDSem );
        /*轮询超时为10秒-尝试获取*/     /*同步错误*/     if (fdPoll( pollitem,daemon_MAXRECORD,10000)== socket_error)       中断;
        /*输入我们的锁*/     SemPend( hDSem,SEM_FOREVER );
        /*为任何活动套接字创建任务*/     for (i=0;i       /*如果套接字无效,请将其关闭*/       if (pollitem[i].eventsDetected & POLLNVAL)       {         fdClose (dlec[i].s);         dlec[i].s = invalid_socket;         继续;      }
          if (pollitem[i].eventsDetected & Pollin)       {         if (dlec[i].Type == sock_DGRAM)         {           tsock = dlec[i].s;           closeSock = 0;        }         其他         {           tsock =接受( dlec[i],0,0);           closeSock = 1;        }
            if (tsock!= invalid_socket)         {           /*创建记录以跟踪此任务*/           PC = mmAlloc (sizeof (child));           if (!PC)             转至 fugnComplete;
              /*创建任务*/           PC->hTask = TaskCreate( dchild、"dchild"、               drec[i].priority、drec[i].STACKSIZE、               (uintptr_t)&trec[i]、(uintptr_t) PC、0);
              if (!PC->hTask)           {             mmFree( PC );             转至 fugnComplete;          }
              /*为子任务打开套接字会话*/           fdOpenSession( PC->hTask );
              /*填写子记录的其余部分*/           PC->closeSock = closeSock;           PC->s = tsock;
              /*现在我们不会关闭这里的套接字*/           closeSock = 0;
              /*将此记录链接到 DREC */           dlec[i].TasksSpawned++;           PC->pPrev = 0;           PC->pNext = drec[i].pc;           dlec[i].pc = PC;           if (PC->pNext)             PC->pNext->pPrev = PC;
    furnComplete (生成完成):           /*如果出现错误,我们可能需要关闭套接字*/           if (closeSock)             fdClose (tsock);        }       }       }
      TaskExit();}
    static void dchild ( DREC *PDR, child *PC ){  int rc;
      /*获得与父级同步的锁*/  SemPend( hdsem,SEM_Forever );  SemPost( hDSem );
      /*如果套接字仍处于打开  状态,则此函数返回“1”,*/*并且“0”是套接字已关闭。 */  rc = pdr->pcb (PC->s、 pdr->Argument);
      /*如果我们需要*/*,请关闭插槽  我们在收到锁之前这样做,所以如果插槽*/*  使用 linger,我们不会让每个人都保持向上*/  if (RC && PC->closeSock)     fdClose (PC->s);
      /*获取我们的锁*/  SemPend( hDSem,SEM_FOREVY );
      /*关闭套接字会话(如果打开)*/  if (PC->hTask)     fdCloseSession( PC->hTask );
      /*从 DREC 中删除我们的记录*/  if ( PC->pNext )     PC->pNext->pPrev =PC->pPrev;  if (!PC->pPrev)     PDR->PC = PC->pNext;  否则     PC->pPrev->pNext =PC->pNext;  PDR->TasksSpawned-->
      /*释放我们的记录*/  mmFree( PC );
      /*触发父线程*/  if (hDTask)     fdSelectAbort( hdTask );
      /*释放锁*/  Sempost( hdsem );
      TaskExit();}
    #ifdef _include_ipv6_code
    静态 DREC    drec6[daemone_MAXRECORD];静态 FDPOLLITEM Recorditem6[daemone_MAXRECORD];静态空  *hDTask6=0;   //处理 V6主守护程序任务线程*/static void  *hDSem6=0;   //处理排除已 初始化的信标*/static uint32_rechn6;*重新生成的记录数6
    static void dchild6 (DREC *PDR,child *PC){  int rc;
      /*获得与父级同步的锁*/  SemPend( hDSem6, SEM_FOREVY );  SemPost( hDSem6 );
      /*如果套接字仍处于打开  状态,则此函数返回“1”,*/*并且“0”是套接字已关闭。 */  rc = pdr->pcb (PC->s、 pdr->Argument);
      /*如果我们需要*/*,请关闭插槽  我们在收到锁之前这样做,所以如果插槽*/*  使用 linger,我们不会让每个人都保持向上*/  if (RC && PC->closeSock)     fdClose (PC->s);
      /*获取我们的锁*/  SemPend (hDSem6,SEM_FOREVY);
      /*关闭套接字会话(如果打开)*/  if (PC->hTask)     fdCloseSession( PC->hTask );
      /*从 DREC 中删除我们的记录*/  if ( PC->pNext )     PC->pNext->pPrev =PC->pPrev;  if (!PC->pPrev)     PDR->PC = PC->pNext;  否则     PC->pPrev->pNext =PC->pNext;  PDR->TasksSpawned-->
      /*释放我们的记录*/  mmFree( PC );
      /*触发父线程*/  if (hDTask6)     fdSelectAbort( hDTask6 );
      /*释放锁*/  Sempost( hDSem6 );
      TaskExit();}
    static void demon6(){int             i、closeSock;  struct sockaddr_in6  sin1;  socket         tsock;  child *         PC;
      /*输入我们的锁*/  SemPend( hDSem6, SEM_FOREVY );
      for (;;)  {     /*创建任何需要创建的套接字*/     for (i=0;i         /*如果套接字已创建,请将其绑定*/         if (drec6[i].s!= invalid_socket)         {           /*绑定到指定的服务器端口*/           memset(&sin1, 0, sizeof(struct sockaddr_in)));           sin1.sin6_family   = AF_inet6;           memcpy ((void *)&sin1.sin6_addr、(void *)&drec6[i].LocalAddress、sizeof (struct in6_addr));           sin1.sin6_port    = NDK_htons (drec6[i].LocalPort);
              if (bind (drec6[i].s、(struct sockaddr *)&sin1、sizeof (sinc1))<0)           {             fdClose (drec6[i].s);             drec6[i].s = invalid_socket;          }         }
            /*如果套接字绑定到 TCP,则开始侦听*/         if (drec6[i].s!= invalid_socket && drec6[i].Type!= SOCK_DGRAM)         {           if (listen (drec6[i].s、drec6[i].MaxSpawn)<0)           {             fdClose (drec6[i].s);             drec6[i].s = invalid_socket;          }         }       
          /*更新 fdPoll 数组*/       pollitem6[i].fd = drec6[i].s;       if (drec6[i].Type && drec6[i].TasksSpawned < drec6[i].MaxSpawn)         pollitem6[i].eventsRequesteded = Pollin;       其他         pollitem6[i].eventsRequested=0;    }
        /*离开我们的锁*/     Sempost( hDSem6);
        /*轮询超时为10秒-尝试获取*/     /*同步错误*/     if (fdPoll( pollitem6, daemon_MAXRECORD,10000)== socket_error)       中断;
        /*输入我们的锁*/     SemPend( hDSem6, SEM_FOREVER );
        /*为任何活动套接字创建任务*/     for (i=0;i       /*如果套接字无效,请将其关闭*/       if (pollitem6[i].eventsDetected & POLLNVAL)       {         fdClose (drec6[i].s);         drec6[i].s = invalid_socket;         继续;      }
          if (pollitem6[i].eventsDetected & Pollin)       {         if (drec6[i].Type == SOCK_DGRAM)         {           tsock = drec6[i].s;           closeSock = 0;        }         其他         {           tsock =接受(drec6[i]、0、0);           closeSock = 1;        }
            if (tsock!= invalid_socket)         {           /*创建记录以跟踪此任务*/           PC = mmAlloc (sizeof (child));           if (!PC)             转至 fugnComplete;
              /*创建任务*/           PC->hTask = TaskCreate (dchild6、"dchild6"、               drec6[i].priority、drec6[i].STACKSIZE、               (uintptr_t)&drec6[i]、(uintptr_t) PC、0);
              if (!PC->hTask)           {             mmFree( PC );             转至 fugnComplete;          }
              /*为子任务打开套接字会话*/           fdOpenSession( PC->hTask );
              /*填写子记录的其余部分*/           PC->closeSock = closeSock;           PC->s = tsock;
              /*现在我们不会关闭这里的套接字*/           closeSock = 0;
              /*将此记录链接到 DREC */           drec6[i].TasksSpawned++;           PC->pPrev = 0;           PC->pNext = drec6[i].PC;           drec6[i].PC = PC;           if (PC->pNext)             PC->pNext->pPrev = PC;
    furnComplete (生成完成):           /*如果出现错误,我们可能需要关闭套接字*/           if (closeSock)             fdClose (tsock);        }       }       }
      TaskExit();}
    /**  * @b Description * @n   *   该函数创建 V6 Daemon。  *  *@param[in] 类型 *   这是通过守护程序打开的套接字类型。 在 *   IPv6的情况下、支持以下类型 *      - SOCK_STREAM *        将其用于 TCP 套接字。  *      - SOCK_DGRAM *        这用于 UDP 套接字。  * @param[in] LocalAddress *   这是套接字将绑定到的本地地址。  *   在大多数情况              下、这通常传递为 ipv6 unspecified _address *@param[in] LocalPort *这是要服务的本地端口(不能为 NULL)*@param[in] PCB *将调用的回调函数。  * @param[in] priority *   要为回调函数创建的新任务的优先级  * @param[in] STACKSIZE *   要为回调函数创建的新任务的堆栈大小 * @param[in] 参数 *   传递给回调函数的参数(除套接字外) * @param[in] MaxSpawn *   回调函数实例的最大数量 (对于 UDP、必须为1) *  *@retval *   Success -处理衍生的守护程序。  * @retval *   Error  - 0 */void * Demon6New (uint32_t Type、IP6N LocalAddress、uint32_t LocalPort、           int (* PCB)(插座、uint32_t)、uint32_t priority、           uint32_t STACKSIZE、uintptr_t 参数、uint32_t MaxSpawn){  int i;  DREC * PDR = 0;
      /* sanity 检查参数*/  if (Type=SOCK_DGRAM)     MaxSpawn=1;  否则 if (Type!=SOCK_STREAM)     返回(0);
      if (!LocalPort ||!PCB || Priority<1|| Priority>15||!STACKSIZE ||!MaxSpawn)     返回(0);
      /*我们将借用栈的内核模式作为临时排除方法*/  llEnter();  if (!hDSem6)  {     hDSem6 = SemCreate(1);     memset( drec6、0、sizeof (drec6));     RequestedRecords6=0;  }llExit()  ;
      /*此时我们必须有一个信号量*/  if (!hDSem6)     返回(0);
      /*输入我们自己的锁*/  SemPend( hDSem6, SEM_FOREVY );
      /*扫描列表中的空闲插槽*/  for (i=0;i;<DAEMON_MAXRECORD; i++ )     if (!drec6[i].Type &&!drec6[i].TasksSpawed)       中断;
      /*如果没有可用记录则中断*/  if (i=daemon_MAXRECORD)     转至错误;
      /*生成新记录*/  PDR =&drec6[i];  PDR->类型       =类型;  PDR->LocalV6Address = LocalAddress;  PDR->LocalPort   = LocalPort;  PDR->PCB       = PCB;  PDR->Priority    = Priority;  PDR->STACKSIZE   = STACKSIZE;  PDR->Argument    = Argument;  PDR->MaxSpawn    = MaxSpawn;   pdr->s        =无效的套接字;
      /*如果 Deamon 任务存在,则 ping 它,否则创建它*/  if (hDTask6)     fdSelectAbort( hDTask6 );  否则  {     hDTask6 = TaskCreate (demon6、"demon6"、OS_TASKPRINORM、OS_TASKSTKLOW、0、0、0);     if (hDTask6)       fdOpenSession (hDTask6);     其他     {       pdr->Type = 0;       PDR = 0;       转至错误输出;    }   }
      RequestedRecords6++;
    errorout:  /*退出我们的锁*/  SemPost (hDSem6);  return (PDR);}
    /**  * @b 说明 * @n   *   该函数用于清理以前创建的 V6守护程序。  * * @param[in] hEntry *   这是先前使用     Demon6New *创建的守护程序的句柄  @sa *   Demon6New *  *@retval *   不适用。  /void Demon6Free (void *hEntry){  DREC *PDR =(DREC *) hEntry;  子* PC;
      /*此时我们必须有一个信号量*/  if (!hDSem6)     返回;
      /*输入我们自己的锁*/  SemPend( hDSem6, SEM_FOREVY );
      /*完整性检查*/  if (pdr->Type!=SOCK_STREAM && pdr->Type!=SOCK_DGRAM)     转至错误;
      /*清除记录*/  PDR->Type = 0;  RequestedRecords6-;
      /*关闭所有儿童的套接字会话。 这将使*/  /*最终从代码中退出,并且*/  /*关闭它们的套接字*/  PC = PDR->PC;  while (PC)  {     if (PC->hTask)     {       fdCloseSession( PC->hTask );       PC->hTask = 0;    }     PC = PC->pNext;  }
      /*关闭套接字(这将唤醒使用它的任何人)*/  if (pdr->s != invalid_socket)  {     fdClose (pdr->s);     pdr->s = invalid_socket;  }
      /*如果没有更多记录,请关闭守护程序任务的*/*  文件描述符会话。 这将导致错误*/*  out 并将其自身删除*/  if (!RequestedRecords6)  {     fdCloseSession( hDTask6 );     hDTask6 = 0;  }
    errorout:  /*退出我们的锁*/  SemPost (hDSem6);}
    #endif /*_include_ipv6_code *

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

    >../daemon.c:42:21:致命错误:netmain.h:无此类文件或目录

    您是否包含 netmain.h 的目录(ti\ndk\inc)?

    此致、

    Garrett  

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

    是的。

    netmain.h 目录包含在 damon 文件中。(#include )

    我创建了项目 NIMU_ICSS_BasicExample_iceAMIC110_wSoCLib_armExampleproject

    我可以看到 nethook.c 文件已添加。

    它具有  

    空 netOpenHook()

    //创建我们的本地服务器
    hecho = DemonNew (sock_stREAMNC、0、7、dtask_tcp_echo、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hEchoUdp = DemonNew (SOCK_DGRAM、0、7、dtask_udp_echo、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、1);
    hData = DemonNew (sock_stream、0、1000、dtask_tcp_datasrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hNull = DemonNew (SOCK_STREAMNC、0、1001、dtask_tcp_nullsrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);
    hOob = DemonNew (SOCK_STREAMNC、0、999、dtask_tcp_oobsrv、
    OS_TASKPRINORM、OS_TASKSTKNORM、0、3);

    空 netCloseHook()

    DemonFree (hOob);
    DemonFree (hNull);
    DemonFree (hData);
    DemonFree (hEchoUdp);
    DemonFree (hecho);

    我可以从 NDK API 用户指南第5.4.2节"服务器守护程序示例"中向项目添加 tcpecho 代码、哪个文件?

    此致、

    Vrund

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

    您需要在项目构建"目录"中包含路径(ti\NDK\inc)。 目前您只有  -i"C:/Users/vrund rana/workspace_v7/rtos_template_app_am335x_a8"-i"C:/ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include

    此致、

    Garrett

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

    您好!

    我已在项目目录中添加了反复试验文件夹。

    "C:\ti\ndk_3_40_01_01\packages/ti\ndk\inc"

    但构建不成功。


    ****项目 RTOS_TEMPLE_APP_AM335x_A8的配置调试构建****

    "C:\\ti\\ccsv7\\utils\\bin\\gmake"-k -j 4 all -O
    gmake[1]:输入目录'C:/Users/20033229/ccs_workspace/rtos_template_app_am335x_a8/Debug
    '生成文件:./main.cfg '
    '调用:XDCtools '
    "C:/ti/xdctools_3_51_01_18_core/xs "--xdcpath="C:/ti/bios_6_76_03_01/packages;C:/ti/pdk_am335x_1_0_14/packages;C:/ti/ccsv7/ccs_base;" xdc.tools.configuro configPkg -t GNU.targets.arm.a8F -p ti.platforms.evmAM3359 -r release -c "C:/ti/gcc-arm-none-eabi-6-2017-q1-update "..main.cfg
    正在制作 package.mak (由于 package.bld)...
    正在为软件包 configPkg 生成接口(因为 package/package.xdc.inc 比 package.XDC 旧)...
    从 package/cfg/main_pa8fg.cfg 配置 main.xa8fg ...
    SoC 类型为 AM335x
    SoC 类型为 AM335x
    正在生成自定义 ti.sysbios 库 makefile ...
    链接库 ti.drv.SPI:./lib/am335x/a8/release/ti.drv.spi.aa8fg
    链接库 ti.drv.UART:./lib/am335x/a8/release/ti.drv.uart.aa8fg
    链接库 ti.drv.i2c:./lib/am335x/a8/release/ti.drv.i2c.aa8fg
    链接库 ti.osal:/lib/tirtos/a8/release/ti.osal.aa8fg
    链接库 ti.csl:./lib/am335x/a8/release/ti.csl.aa8fg
    正在开始构建库源...
    制作 C:/Users/20033229/ccs_workspace/rtos_template_app_am335x_a8/src/sysbios/sysbios.aa8fg ...
    已完成库构建。
    cla8fg 封装/cfg/main_pa8fg.c……
    '完成的建筑:./main.cfg '
    '
    gmake[1]:离开目录'C:/Users/20033229/ccs_workspace/rtos_template_app_am335x_a8/Debug
    '生成文件:./main.c'
    '调用:GNU 编译器'
    "C:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe "-c -mcpu=cortex-A8 -mtune =cortex-A8 -March =armv7-a -marm -mfloat-abi=hard -Dam3358 -DevmAM335x -DSOC_AM335x -i"C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -i"C:/Users/20033229/ccs_workspace/rtos_template_app_am335x_a8 -i""C:/ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include -dwar"-mf-mf"-main.config-mf-mf"-mf"-mf.main.mf.mf.gmd -mf-mf"-mf_main.c -mf_mf.gmf.pr-md -md -md -mf"-mf_mf.pr-md -md -mf.@
    '完工建筑:./main.c'
    '
    '生成文件:./app.c'
    '调用:GNU 编译器'
    "C:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe "-c -mcpu=cortex-A8 -mtune =cortex-A8 -March =armv7-a -marm -mfloat-abi=hard -Dam3358 -DevmAM335x -DSOC_AM335x -i"C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -i"C:/Users/20033229/ccs_workspace/rtos_template_app_am335x_a8 -i"C:/ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include -dwarp -m"-mf"-mf-mf_config-mf"-mf"-mf-mf.app -mf -mf.app -md -mf.app -md -mf_mf.app -md -mf_mf_md -mf.app -md -mf_mf_mf.app -mf @
    '完成的建筑:./app.c'
    '
    'building file:./daemon .c'(构建文件:./daemon .c')
    '调用:GNU 编译器'
    "c:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe "-c -mcpu=cortex-A8 -mtun=cortex-A8 -March =armv7-a -mfloat-abi=hard -Dam3358 -DevmAM335x -DSOC_AM335x -i"C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -i"C:/Users/20033229/ccs_workspace/rtos_template_app_am335x_a8 -i""C:/ti/gcc-arm-none-eabi-6-2017-q1-update/arm-none-eabi/include -dwarm"-dmf"-mf_mf.daemon -mf -mf -configgmd @守护程序。
    在包含在 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:43:0的文件中、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/stacksys.h:86、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/netmain.h:39、
    从./daemon.c:42:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socketndk.h:94:0:警告:重新定义了"_SYS_SELECT_H"
    #define _SYS_SELECT_H 1 // TODO:结构时间值冲突仍然需要

    在包含在 c:\ti\BIOS_6_76_03_01\packages/GNU\targets\arm\libs\install-native\arm-none-eabi\include\sys\types.h:68:0中的文件中、
    从 c:\ti\BIOS_6_76_03_01\packages/GNU\Targets\arm\libs\install-native\arm-no-eabi\include\sys\time.h:43、
    来自 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socketndk.h:48、
    来自 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:43、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/stacksys.h:86、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/netmain.h:39、
    从./daemon.c:42:
    C:\ti\BIOS_6_76_03_01\packages/GNU\Targets\arm\libs\install-native\arm-none-eabi\include\sys\select.h:13:0:注意:这是先前定义的位置
    #define _SYS_SELECT_H

    '已完成构建:./daemon.c'
    '
    '构建目标:rtos_template_app_am335x_a8.out'
    '调用:GNU 连接器'
    "c:/ti/gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-gcc.exe -mtet=cortex-A8 -marm -Dam3358 -DevmAM335x -DSOC_AM335x -g -gdwarf-3 -gstrict-dwarf -Wall -mfloat-abi=hard -map、"rtos_template_am335x_am335x-g -gstrict-dwarf -wl -wl -wl -wl -end -mflo-m-m-mflo-m-m-ab-m-m-mfrom-m-m-cc-ram_m-m-m-ram.pr-m-ram_m-m-m-m-m-ram/cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn/mcu-ram_cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn/mcu-ram_cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn.cn./ti/bios_6_76_03_01/packages/gnu/targets/arm/libs/install-native/arm-none-eabi/lib/hard /ti/pdk_am335x_1_0_14/packages/ti/board/lib/evmAM335x/a8/release
    makefile:148:目标'rtos_template_app_am335x_a8.out'的配方失败
    /daemon.o:在函数`接受'中:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:58:未`对 NDK_ACCEPT 的引用
    /daemon.o:在函数`bind 中:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:66:对`NDK_BIND'的引用未定义
    /daemon.o:在函数`监听'中:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:116:对`NDK_Listen'的引用未定义
    /daemon.o:在函数`s套入'中:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:216:对`NDK_SOCKET'的引用未定义
    `Ddaemon.o:在函数"aemonNew"中:
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:229:未定义`llEnter'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:232:`SemCreate'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:236:未定义`llExit '的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:243:未`S对 emPend'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:268:`fdSelectAbort'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:271:未定义对`TaskCreate'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:273:`fdOpenSession'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:286:未`S对 emPost'的引用
    `Ddaemon.o:在函数"aemonFree"中:
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:314:未`S对 emPend'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:332:未`fdCloseSession'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:341:未`fdClose 的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:350:`fdCloseSession'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:356:未`S对"emPost"的引用
    /daemon.o:在函数`daemon 中:
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:367:未`S对 emPend'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:393:未`对 fdClose 的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:403:未`对 fdClose 的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemone.c:418:未`S对"emPost"的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:422:`fdPoll'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:426:未`SemPend'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:438:未`对 fdClose 的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:459:`mmalloc'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:464:未定义对`TaskCreate'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:470:未`mmFree"的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:475:`fdOpenSession'的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:495:`fdClose 的引用未定义
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:501:未定义对`TaskExit'的引用
    /daemon.o:在函数`d子项'中:
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:509:未`S对 emPend'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:510:未`S对 emPost'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:520:未`fdClose 的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:523:未`S对 emPend'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon.c:527:未`fdCloseSession'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:539:未`m对"mFree"的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:543:未`fdSelectAbort'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:546:未`S对 emPost'的引用
    C:\Users\20033229\ccs_workspace\rtos_template_app_am335x_a8\Debug/../daemon .c:548:未定义对`TaskExit'的引用
    collect2.exe:错误:LD 返回1退出状态
    gmaked[1]:***[rtos_template_app_am335x_A8.out]错误1.
    gmake:***[全部]错误2.
    Makefile:144:目标'all'的配方失败

    ****构建完成****

    此致、

    Vrund

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

    您好!

    轻柔提醒。

    此致、

    Vrund

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

    您似乎没有在项目构建中链接 NDK 库。 请参阅 PDK 中的 NIMU 示例工程、以了解如何在.cfg 文件中包含 NDK 模块、例如 packages/ti\transport \NDK\NIMU_ICSS\examples\AM335x\armv7\BIOS\am335x_app_icev2_wSoCLib.cfg

    此致、

    Garrett

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

    您好!

    我在 NDK 指南中添加了 NDK 库、如下所述。

    1.6.1将 NDK 支持添加到现有应用如果现有应用具有 SYS/BIOS 和 XDCtools 支持、但未启用 TIRTOS 或 NDK、请按照以下步骤启用 NDK 和 NSP:1. 在 Project Explorer 视图中右键点击 CCS 工程。 从上下文菜单中选择显示构建设置。 2.在"属性"对话框中选择"常规"类别。 3.转至 RTSC 选项卡。 4.选中最新安装的 NDK 和 NDK 网络支持包产品旁边的复选框。 5.单击“确定”。 6.使用 XGCONF 重新打开项目中的*。cfg 文件。 如果您展开 TI-RTOS >产品、则 NDK 和 NSP 现在应列在 Available Products 视图中。 7.在 Available Products 视图中选择 NDK > Global 项目。 右键单击"Global"模块并选择"Use Global"。 您将看到 NDK 配置的欢迎表。 该表提供了 NDK 的概述、配置信息和 NDK 文档。 8.单击"欢迎"表顶部的"系统概述"链接、查看您可以配置的 NDK 模块的便捷图。 9.在系统概述图中右键单击 EMAC 模块,然后选择使用 EMAC。 要配置 EMAC 模块、请选择要为其构建的器件。 EMAC 模块将尝试为该器件加载以太网驱动程序。 如果您使用的设备不在列表中、请选择"无"作为设备。 在这种情况下、您必须在设备中链接

    以太网驱动程序。 10.打开项目的属性对话框并转至生成>编译器>包含选项类别。 将${NDK_INSTALL_DIR}/packages/ti/ndk/inc 添加到应用程序的编译器包含路径中。

    但我仍然遇到错误。


    ****项目 RTOS_TEMPLE_APP_AM437X_A9的配置调试构建****

    "C:\\ti\\ccs930\\ccs\\utils\\bin\\gmake"-k -j 4 all -O

    编译文件:"../main.cfg
    调用:XDCtools
    "C:/ti/xdctools_3_50_07_20_core/xs "--xdcpath="C:/ti/bios_6_73_00_12/packages;C:/ti/pdk_am437x_1_0_12/packages;C:/ti/ndk_3_40_01_01/packages;" xdc.tools.configuro configPkg -t GNU.targets.arm.A9F -p ti.platforms.evmAM437X -r release -c "C:/ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32 "..main.cfg
    正在制作 package.mak (由于 package.bld)...
    正在为软件包 configPkg 生成接口(因为 package/package.xdc.inc 比 package.XDC 旧)...
    从 package/cfg/main_pa9fg.cfg 配置 main.xa9fg ...
    正在生成自定义 ti.sysbios 库 makefile ...
    链接库 ti.drv.SPI:./lib/am437x/a9/release/ti.drv.spi.aa9fg
    链接库 ti.drv.gpio:./lib/am437x/a9/release/ti.drv.gpio.aa9fg
    链接库 ti.drv.UART:./lib/am437x/a9/release/ti.drv.uart.aa9fg
    链接库 ti.drv.i2c:./lib/am437x/a9/release/ti.drv.i2c.aa9fg
    链接库 ti.csl:./lib/am437x/a9/release/ti.csl.aa9fg
    链接库 ti.osal:/lib/tirtos/a9/release/ti.osal.aa9fg
    正在开始构建库源...
    制作 C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9/src/sysbios/sysbios.aa9fg ...
    gmake[1]:输入目录`C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9/src/sysbios
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/IntrinsicsSupport_asm_gnu.asm……
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/TaskSupport_asm_gnu.asm……
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/gic/Hwi_asm_gnu.asm……
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/exc/Exception_asm_gnu.asm……
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a9/Cache_asm_gnu.sv7A……
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a8/Mmu_asm_gnu.sv7A……
    asma9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a15/TimestampProvider_asm_gnu.asm……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/BIOS.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/IntrinsicsSupport.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/TaskSupport.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Clock.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Idle.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Intrinsics.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Event.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Mailbox.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Queue.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Semaphore.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Swi.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/knl/Task.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/Cache.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/Core.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/CoreNull.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/Hwi.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/Hwi_stack.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/Hwi_startup.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/Seconds.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/hal/SecondsClock.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/rts/gnu/ReentSupport.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/rts/gnu/SemiHostSupport.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/gic/Hwi.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/exc/Exception.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a9/Cache.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a9/Timer.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a8/Mmu.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/gates/GateHwi.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/gates/GateMutex.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/heaps/HeapMem.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/sysbios/family/arm/a15/TimestampProvider.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/clock.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/mqueue.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread_barrier.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread_cond.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread_key.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread_mutex.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread_rwlock.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/pthread_util.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/sched.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/semaphore.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/sleep.c……
    cla9fg C:/ti/bios_6_73_00_12/packages/ti/posix/tirtos/timer.c……
    ara9fg arm_intrinsicsSupport_asm_GN0.o arm_TaskSupport_asm_GN0.o GIC_Hwi_asm_GN0.o exc_exception_asm_ng.o a9_cache_exgng.o a8_m9_as_as_sgng.o t gintrad_clock_clock_clock_clock_en.o ngine.o nginu.o ngc.h ngc.h ngpiz_clock_clock_clock_clock_clock_clock_clock_clock_clock_en.o nginar_clock_clock_clock_en.o nginar_clock_clock_clock_en.o nginar_clock_clock_clock_en.o nginar.o nginu.o nginu.o nginu.o nginu.h nginu.o nginu.o nginu.h ngin tirtos_sleep.o tirtos_timer.o ...
    gmake[1]:离开目录`C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9/src/sysbios
    已完成库构建。
    cla9fg 封装/cfg/main_pa9fg.c……
    在包含在 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:43:0的文件中、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/stacksys.h:86、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/netmain.h:39、
    从 package/cfg/main_pa9fg.c:2593:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socketndk.h:94:0:警告:重新定义了"_SYS_SELECT_H"
    #define _SYS_SELECT_H 1 // TODO:结构时间值冲突仍然需要

    在包含在 c:\ti\BIOS_6_73_00_12\packages/GNU\targets\arm\libs\install-native\arm-none-eabi\include\sys\types.h:68:0中的文件中、
    从 c:\ti\BIOS_6_73_00_12\packages/GNU\Targets\arm\libs\install-native\arm-no-eabi\include\time.h:28、
    从 package/cfg/main_pa9fg.c:2553:
    C:\ti\BIOS_6_73_00_12\packages/GNU\Targets\arm\libs\install-native\arm-none-eabi\include\sys\select.h:13:0:注意:这是先前定义的位置
    #define _SYS_SELECT_H

    已完成构建:"../main.cfg"

    构建文件:"../GPIO_evmAM437x_board.c"
    调用:GNU 编译器
    "c:/ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/bin/arm-none-eabi-gcc-7.2.1.exe /ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/arm-none-eabi/include "-c -mcpu=cortex-A9 -March =armv7-a -mtune =cortex-A9 -marm -mfloat-abi=hard -Dam4372 -DSOC_AM437x -DEVM_AM437x -DevmAM437x -i"C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -""-i="C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9 -mwarngpio"-m4mv_mvgpio-mv_m437x -mv_mv_mv_mv_mv_gpio-m_board.membultrad_m4mv/mv4mv_mv_mvgpio-mv_mv_m4gpio.c @-mv_mvgpio.c -m4gpio-m64_mv/mv_mv_mv_mv_mv_mv_
    完成构建:"../GPIO_evmAM437x_board.c"

    生成文件:"../daemon.c"
    调用:GNU 编译器
    "c:/ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/bin/arm-none-eabi-gcc-7.2.1.exe /ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/arm-none-eabi/include -c -mcpu=cortex-A9 -March =armv7-a -mtune =cortex-A9 -marm -mfloat-abi=hard -Dam4372 -DSOC_AM437x -DEVM_AM437x -DevmAM437x -i""C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -i""C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9 -dwarf"-mf-ngmd @守护程序-md -mf"-mf-md 守护程序 dmf"-configgmd 守护程序。
    在包含在 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:43:0的文件中、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/stacksys.h:86、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/netmain.h:39、
    从./daemon.c:42:
    C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socketndk.h:94:0:警告:重新定义了"_SYS_SELECT_H"
    #define _SYS_SELECT_H 1 // TODO:结构时间值冲突仍然需要

    在包含在 c:\ti\BIOS_6_73_00_12\packages/GNU\targets\arm\libs\install-native\arm-none-eabi\include\sys\types.h:68:0中的文件中、
    从 c:\ti\BIOS_6_73_00_12\packages/GNU\Targets\arm\libs\install-native\arm-no-eabi\include\sys\time.h:43、
    来自 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socketndk.h:48、
    来自 C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/socket.h:43、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/stacksys.h:86、
    发件人:/ti/ndk_3_40_01_01/packages/ti/ndk/inc/netmain.h:39、
    从./daemon.c:42:
    C:\ti\BIOS_6_73_00_12\packages/GNU\Targets\arm\libs\install-native\arm-none-eabi\include\sys\select.h:13:0:注意:这是先前定义的位置
    #define _SYS_SELECT_H

    已完成构建:"../daemon.c"

    编译文件:"../app.c"
    调用:GNU 编译器
    "c:/ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/bin/arm-none-eabi-gcc-7.2.1.exe /ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/arm-none-eabi/include "-c -mcpu=cortex-A9 -March =armv7-a -mtune =cortex-A9 -marm -mfloat-abi=hard -Dam4372 -DSOC_AM437x -DEVM_AM437x -DevmAM437x -i""C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -i""C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9 -dwar应用-mf"-mf-mf"-md -config-mf"-md -mf"-md -mf"-md @-g.app -mf"-mf_md -mf.app -mf"-md -mf"-mcr -mcr -mf_mf_mcr -mf"-mcr -m
    已完成构建:"./app.c"

    编译文件:"../main.c"
    调用:GNU 编译器
    "c:/ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/bin/arm-none-eabi-gcc-7.2.1.exe /ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/arm-none-eabi/include "-c -mcpu=cortex-A9 -March =armv7-a -mtune =cortex-A9 -marm -mfloat-abi=hard -Dam4372 -DSOC_AM437x -DEVM_AM437x -DevmAM437x -i""C:/ti/ndk_3_40_01_01/packages/ti/ndk/inc -i""C:/Users/20033229/workspace_v9/rtos_template_app_am437x_a9 -严格-mf-mf"-md -gmd -md -main.config"-mf"-mf-md -mf"-md -mf"-main.gmd -md -mf"-md -mf"-md -mf"-md -mf"-mf"-mf.g.g.gmd -mf"-md @
    建筑完工:"../main.c"

    构建目标:"rtos_template_app_AM437X_A9.out"
    调用:GNU 连接器
    "c:/ti/ccs930/ccs/tools/compiler/gcc-arm-none-eabi-7-2017-q4-major-win32/bin/arm-none-eabi-gcc-7.2.1.exe "-mtet=cortex-A9 -marm -Dam4372 -DSOC_AM437x -DEVM_AM437x -DevmAM437x -og -g -gdwarf-3 -gstrict-dwarf -Wall -mfloat-abi=hard -map、"rtos_template=-start-mwl.evm.cn"-mv1.tex-mv/ategr /ti/pdk_am437x_1_0_12/packages/ti/board/lib/evmAM437x/a9/release -r.ap-r.ap-mv-r.ap-mv-r.trab-mv-mv-mv/r -mv1.tex-mv-mv/r -mv1.pf-natempf-natempf-natr -mv/r -g.ap-mv1.tex-mv/r -mv1.tex-g.ap-mv-mv1.t/r -g.ap-g.ap-g.ap-g.ap-g.ap-r.ap-g./r -m.ap-mv1.tex-m /ti/bios_6_73_00_12/packages/gnu/targets/arm/libs/install-native/arm-none-eabi/lib/hard
    Makefile:149:目标'rtos_template_app_AM437X_A9.out'的配方失败
    C:\ti\ndk_3_40_01_01\packages/ti\ndk\stk6.aa9fg (Nimu.oa9fg):在函数中`NIMUInit':
    /db/vtree/library/trees/ndk/ndk-p19/src/ti/ndk/stack/nimu/nimu.c:1197:对`NIMUDeviceTable'的引用未定义
    /db/vtree/library/trees/ndk/ndk-p19/src/ti/ndk/stack/nimu/nimu.c:1197:对`NIMUDeviceTable'的引用未定义
    collect2.exe:错误:LD 返回1退出状态
    gmake.1]:***[rtos_template_app_AM437X_A9.out]错误1.
    gmake:***[全部]错误2.
    Makefile:145:目标'all'的配方失败

    ****构建完成****

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

    请参阅  

    此致、

    Garrett

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

    您好!

    我已经详细介绍并能够构建项目。

    此致、

    Vrund