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.

[参考译文] AWR2544:AWR2544:无法访问 ENET 的 RX 数据

Guru**** 2555630 points
Other Parts Discussed in Thread: AWR2544

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1348861/awr2544-awr2544-cannot-access-to-the-rx-data-of-enet

器件型号:AWR2544

文件位置:c:\ti\mmwave_mcuplus_sdk_04_06_00_01\mmwave_mcuplus_sdk_04_06_00_01\ti\demo\awr2544\mmw\mmw_enet\mmw_enet\mmw_enet.c

函数名称: static void MmwEnet_rxTask (void *args)

我按如下所示添加了一些用于打印 RX 数据内容的代码。 (程序将在标记为红色的位置停止。)

我的问题是如何访问 pktInfo->sgList.list[0].bufPtr 的数据;

========================================

while (1)
  {
     SemaphoreP_pend (&mmwEnetObj.rxSemObj、SystemP_WAIT_FOREVER);
    /*获得到目前为止接收到的数据包*/
     rxReadyCnt  =  MmwEnet_receivePkts()

 

     if (rxReadyCnt  >  0u)
    {
       EnetAppUtils_print ("rxReadyCnt =%d\r\n"、rxReadyCnt);  //此处为 OK
      /*使用接收到的数据包并将其释放*/
      pktInfo  = (EnRace_EnetQueue_DEQ Dma_Pkt  *)(&mmwEnetObj.rxReadyQ);
       while (NULL != pktInfo)
      {
         EnetDma_checkPktState (&pktInfo->pktState
                    Enet_PKTSTATE_MODULE_APP、
                    Enet_PKTSTATE_APP_WITH_READYQ、
                    Enet_PKTSTATE_APP_WIT_FREEQ);
        FRAME  = (EthFrame  *) pktInfo->sgList.list[0].bufPtr
         EnetAppUtils_print ("filled  len =%d、Alloc len = %d\r\n"、 pktInfo->sgList.list[0].segmentFilledLen、pktInfo->sgList.list[0].segmentAllocLen ); //此处正常,打印:plen = 60,Allen = 1536
         EnetAppUtils_print ("buf address = %p\r\n"、frame); //此处为 OK (确定)且 print:buf address = C025B800
         EnetAppUtils_print ("eth Type = %04x\r\n"、 frame->HDR.EtherType); //<===程序在此停止!!! 整个程序已被 此语句阻止。  
         EnetAppUtils_print ("检查点1111  \r\n ") //无法 打印 任何日志。
 
附录四
.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    您如何在何处定义  变量?

    此致、
    阿尼尔班

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

    抱歉、我 没有粘贴整个函数。

    变量 代码一样在此函数中定义。


    静态 void MmwEnet_rxTask (void * args)
    {
      En52 Dma_Pkt *pktInfo;
      Volatile uint32_t rxReadyCnt
      int32_t STATUS = ENET_SOK;
      以太网帧 *frame;  //<===此处定义

      mmwEnetObj.totalRxCnt = 0u

      /*等待数据包接收*/
      while (1)
      {
         SemaphoreP_pend (&mmwEnetObj.rxSemObj、SystemP_WAIT_FOREVER);
        /*获得到目前为止接收到的数据包*/
         rxReadyCnt  =  MmwEnet_receivePkts()

     

         if (rxReadyCnt  >  0u)
        {
           EnetAppUtils_print ("rxReadyCnt =%d\r\n"、rxReadyCnt);  //此处为 OK
          /*使用接收到的数据包并将其释放*/
          pktInfo  = (EnRace_EnetQueue_DEQ Dma_Pkt  *)(&mmwEnetObj.rxReadyQ);
           while (NULL != pktInfo)
          {
             EnetDma_checkPktState (&pktInfo->pktState
                        Enet_PKTSTATE_MODULE_APP、
                        Enet_PKTSTATE_APP_WITH_READYQ、
                        Enet_PKTSTATE_APP_WIT_FREEQ);
            FRAME  = (EthFrame  *) pktInfo->sgList.list[0].bufPtr
             EnetAppUtils_print ("filled  len =%d、Alloc len = %d\r\n"、 pktInfo->sgList.list[0].segmentFilledLen、pktInfo->sgList.list[0].segmentAllocLen ); //此处正常,打印:plen = 60,Allen = 1536
             EnetAppUtils_print ("buf address = %p\r\n"、frame); //此处为 OK (确定)且 print:buf address = C025B800
             EnetAppUtils_print ("eth Type = %04x\r\n"、 frame->HDR.EtherType); //<===程序在此停止!!! 整个程序已被 此语句阻止。  
             EnetAppUtils_print ("检查点1111  \r\n "); //无法 打印 任何日志。
     
    附录四
    .
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的问题似乎与一些错误的指针操作有关。

    如果您能详细介绍一下、我将不胜感激。

    此致、
    阿尼尔班

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

    我无法找到任何使用指针的错误运算。 您能告诉我错误在哪里吗?

    指针'frame'是一个局部变量、设置如下:'frame =(EthFrame *) pktInfo->sgList.list[0].bufPtr;'该语句位于'EnetDma_checkPktState (...)'的下方 调用。

    当我注释或删除以下语句时:'EnetAppUtils_print ("eth Type =%04x\r\n"、frame->HDR.EtherType);'该程序运行时不会出现问题。

    同样,如果我将'frame'替换为'(EthFrame *)pktInfo->sgList.list[0].bufPtr',程序也会在该点停止。

     如果 TI 工程师能检查一下、我将不胜感激。 几天时间里,我的工作都被这种情况弄得越来越混乱。

    如何访问  RX 任务中 pktInfo->sgList.list[0].bufPtr 的项目?

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

    您好!

    您是否可以将以太网类型的值存储在某个变量中并打印相同的值?

    Br、

    A·阿尼什

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

    是的、我尝试将 bufPrt 的值 memcpy 到另一个缓冲区。 程序还阻止了 memcpy 语句、如下所示:

    memcpy (tempBuffer、 pktInfo->sgList.list[0].bufPtr、10);//程序在此被阻止

    在这里,"tempBuffer"被定义为: uint8_t tempBuffer[10]。  

    P.S.无论所占用的字节数量如何、即使是1个字节、程序也会在此被阻止。

    你有什么想法吗? 谢谢。

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

    您好!

    您可以在 CCS 中检查、是否有任何数据存储在帧中? 在 CCS 的表达式窗口中添加名称帧。

    Br、

    A·阿尼什

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

    抱歉。 我无法在 CCS 中进行检查、因为我在终端窗口中使用"make"命令构建了演示、并使用 COM 端口烧录了映像。

    是否有其他方法可以找出问题所在?

    TI 工程师是否能够在本地环境中重现此问题?

    谢谢。

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

    您好!

    即使您使用 make 命令编译工程、也可以检查 CCS。 只需在相应的内核上加载相应的二进制文件.out 文件。 然后逐行步进入代码中、并在表达式窗口中检查帧的值。

    Br、

    A·阿尼什