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.

利用PCI express实现两片TMS320c6678le间通信



》 测试内容

 利用下面pdk的例程实现两片TMS320c6678le间通信

 测试从RC送信到EP返回的时间

 使用例程

 C:\ti\pdk_C6678_1_0_0_21\packages\ti\drv\pcie\example\sample

》 结果

  通信成功

  得到的测试时间30ms左右

  不明白在哪里花费了这么长时间

》 问题

  1 需要HW 或者SW的特殊设置吗

  2 通信时间过长的理由

》 ps

时间测试方法

... ...

 System_printf ("Link is up.\n");

 if(PcieModeGbl == pcie_RC_MODE) /* RC送信 */

 {

   /**********************************************************************/

   /* Push a single message to the EP then verify that it is echoed back */

   /**********************************************************************/

   /* Write from RC to EP                                                */

   if ((retVal = Pcie_getMemSpaceRange (handle, &pcieBase, NULL)) != pcie_RET_OK) {

     System_printf ("getMemSpaceRange failed\n", (int)retVal);

     exit(1);

   }

   for (i=0; i<PCIE_BUFSIZE_APP; i++)

   {

     *((volatile uint32_t *)pcieBase + i) = srcBuf[i];

   }

   prevCnt =  TSCL;   ←←←←←←←←←←←←←←←←←←←←←←←←←←←读送信前时间

   /* Mark that the buffer is full, so EP can process it */

   *((volatile uint32_t *)pcieBase + PCIE_BUFSIZE_APP) = PCIE_EXAMPLE_BUF_FULL;

   /* Note on cache coherence: Write back is not necessary because pcieBase is in

      peripheral address space instead of physical memory*/

   /* Data sent to EP.

      RC waits for the loopback to be completed and

      receive data back from EP */

   do {prevCnt2++;

     unsigned int key;

     /* Disable Interrupts */

     key = _disable_interrupts();

     /*  Cleanup the prefetch buffer also. */

     CSL_XMC_invalidatePrefetchBuffer();  

     CACHE_invL1d ((void *)dstBuf.buf,  PCIE_EXAMPLE_DSTBUF_BYTES, CACHE_FENCE_WAIT);

     CACHE_invL2  ((void *)dstBuf.buf,  PCIE_EXAMPLE_DSTBUF_BYTES, CACHE_FENCE_WAIT);

     /* Reenable Interrupts. */

     _restore_interrupts(key);

   } while(dstBuf.buf[PCIE_BUFSIZE_APP] != PCIE_EXAMPLE_BUF_FULL);

   prevCnt1 =  TSCL;      ←←←←←←←←←←←←←←←←←←←←←←←←←←←读收信后时间

   Cnt = prevCnt1 - prevCnt;  ←←←←←←←←←←←←←←←←←←←←←←←←←←←计算送收信时间

   /* check all the data */

   for (i=0; i<PCIE_BUFSIZE_APP; i++)

   {

     if(dstBuf.buf[i] != srcBuf[i])

     {

       System_printf ("Received data = %d\nTransmited data = %d\nIndex = %d.\n\nTest failed.\n",

                       dstBuf.buf[i], srcBuf[i], i);

       exit(1);

     }

   }

   System_printf ("Root Complex received data.\nTest passed.\n");

 }

 else

 {  /* EP收信 */

 }

》 ps

结果

 Cnt = 2931335

 prevCnt = 253694

 prevCnt1= 3185029

  • 得到的时间是cnt,如果按照1GHz来算的话,耗时2.9ms

  • CPU频率是1GHz,实验用的是TI提供的例程

    如果没理解错的话,

    例程做的事是 将160bytes由RC发送给EP,

    EP接收后原封不动的反传给RC。

    PCIe设置为1lane 2.5Gps

    整个过程要耗时·2.9ms 好像长了点儿

    不明白2.9 ms的时间花费在那些处理上了?

    如果能帮忙解答的话

    十分感谢

  • 如上测试中的所用CNT时间不光是PCIE lane上传输时间,还包括了测试程序指令执行时间,及PCIE IP延时

  • 谢谢您的解答。

    实际上 我刚开始学习使用PCIe

    TI C66x系列也是第一次接触

    但是程序指令的执行时间是不是有些过长

    160bytes传输来回要2.9ms,那么可不可以认为单程1.45ms

    这样算来数据的吞吐量大概为 160bytes/1.45ms=0.11MBps

    完全达不到 sprabk5a.pdf 中的吞吐量

    诚然只有1lane 2.5G好像也太慢了

    不知道是不是还要设置硬件的实验环境(boot, CLK等)

    还是软件还需要另行设置

    期待您的答复

  • 你好,

    下面的数据请你参考

    在PCIe传输过程中需要进行8b/10b的解码,而且协议中的数据包头等它都是要占用传输带宽的,用公式简单算下:

    2.5G×8/10(8b/10b编码消耗)×84%(协议消耗)×1byte/8bits=210Mbyte/s(理论值)

    至于你的0.11Mbps不应该是时间除以二的,建议你测下开始发和全部发完所用时间再进行计算。

  • 谢谢大家的解答。

    已经找到原因了。

    在测试RC→EP→RC的传输过程时间中,

    包含了两个花时间的项目。

    1  EP收信处理后,给RC再送信之前做了一下分配地址的处理。

       /* Loopback to RC what was written in the DST buffer.

          Write from EP to RC */

       if ((retVal = Pcie_getMemSpaceRange (handle, &pcieBase, NULL)) != pcie_RET_OK) {

         System_printf ("getMemSpaceRange failed\n", (int)retVal);

         exit(1);

       }

    2 系统向Console写接收结果,可能是使用中断了吧,花了一些时间

       System_printf ("End Point received data.\n");

    以上两项排除在测试之外后,所得结果约为1.245us(128bytes 约205MBps payload)

    大致在理解的范围内。

  • 你好,请问你是通过boc的那块板卡,将两块evm板进行连接的么?

    我现在用这种方式

    发现两边导入程序,都会卡在

     CACHE_invL1d ((void *)dstBuf.buf,  PCIE_EXAMPLE_DSTBUF_BYTES, CACHE_FENCE_WAIT);

    这里

    不知道你有什么建议?

    谢谢 

  • 请问,这种方法是用BOC连接的么?

    需要对example进行什么修改么?我这边link up老是掉,好奇怪