TI中文支持网
TI专业的中文技术问题搜集分享网站

利用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

Andy Yin1:

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

Jing Bai:

回复 Andy Yin1:

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

如果没理解错的话,

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

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

PCIe设置为1lane 2.5Gps

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

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

如果能帮忙解答的话

十分感谢

Thomas Yang1:

回复 Jing Bai:

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

Jing Bai:

回复 Thomas Yang1:

谢谢您的解答。

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

TI C66x系列也是第一次接触

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

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

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

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

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

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

还是软件还需要另行设置

期待您的答复

Yue Cao:

回复 Jing Bai:

你好,

下面的数据请你参考

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

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

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

xing wang1:

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

我现在用这种方式

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

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

这里

不知道你有什么建议?

谢谢 

xing wang1:

回复 Thomas Yang1:

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

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

赞(0)
未经允许不得转载:TI中文支持网 » 利用PCI express实现两片TMS320c6678le间通信
分享到: 更多 (0)