TI论坛
直播中

李之

8年用户 15经验值
私信 关注
[问答]

利用PCI express实现两片TMS320c6678le间通信,请问需要HW 或者SW的特殊设置吗?通信时间过长的理由是什么?

本帖最后由 一只耳朵怪 于 2018-6-25 15:34 编辑

》 测试内容
  利用下面pdk的例程实现两片TMS320c6678le间通信
  测试从RC送信到EP返回的时间
  使用例程
  C:tipdk_C6678_1_0_0_21packagestidrvpcieexamplesample
》 结果
   通信成功
   得到的测试时间30ms左右
   不明白在哪里花费了这么长时间
》 问题
   1 需要HW 或者SW的特殊设置吗
   2 通信时间过长的理由
》 ps
时间测试方法
  1. ... ...
  2.   System_printf ("Link is up.n");
  3.   if(PcieModeGbl == pcie_RC_MODE) /* RC送信 */
  4.   [
  5.     /**********************************************************************/
  6.     /* Push a single message to the EP then verify that it is echoed back */
  7.     /**********************************************************************/
  8.     /* Write from RC to EP                                                */
  9.     if ((retVal = Pcie_getMemSpaceRange (handle, &pcieBase, NULL)) != pcie_RET_OK) [
  10.       System_printf ("getMemSpaceRange failedn", (int)retVal);
  11.       exit(1);
  12.     ]
  13.     for (i=0; i
  14.     [
  15.       *((volatile uint32_t *)pcieBase + i) = srcBuf;
  16.     ]
  17.     prevCnt =  TSCL;   ←←←←←←←←←←←←←←←←←←←←←←←←←←←读送信前时间
  18.     /* Mark that the buffer is full, so EP can process it */
  19.     *((volatile uint32_t *)pcieBase + PCIE_BUFSIZE_APP) = PCIE_EXAMPLE_BUF_FULL;
  20.     /* Note on cache coherence: Write back is not necessary because pcieBase is in
  21.        peripheral address space instead of physical memory*/
  22.     /* Data sent to EP.
  23.        RC waits for the loopback to be completed and
  24.        receive data back from EP */
  25.     do [prevCnt2++;
  26.       unsigned int key;
  27.       /* Disable Interrupts */
  28.       key = _disable_interrupts();
  29.       /*  Cleanup the prefetch buffer also. */
  30.       CSL_XMC_invalidatePrefetchBuffer();   
  31.       CACHE_invL1d ((void *)dstBuf.buf,  PCIE_EXAMPLE_DSTBUF_BYTES, CACHE_FENCE_WAIT);
  32.       CACHE_invL2  ((void *)dstBuf.buf,  PCIE_EXAMPLE_DSTBUF_BYTES, CACHE_FENCE_WAIT);
  33.       /* Reenable Interrupts. */
  34.       _restore_interrupts(key);
  35.     ] while(dstBuf.buf[PCIE_BUFSIZE_APP] != PCIE_EXAMPLE_BUF_FULL);
  36.     prevCnt1 =  TSCL;      ←←←←←←←←←←←←←←←←←←←←←←←←←←←读收信后时间
  37.     Cnt = prevCnt1 - prevCnt;  ←←←←←←←←←←←←←←←←←←←←←←←←←←←计算送收信时间
  38.     /* check all the data */
  39.     for (i=0; i
  40.     [
  41.       if(dstBuf.buf != srcBuf)
  42.       [
  43.         System_printf ("Received data = %dnTransmited data = %dnIndex = %d.nnTest failed.n",
  44.                         dstBuf.buf, srcBuf, i);
  45.         exit(1);
  46.       ]
  47.     ]
  48.     System_printf ("Root Complex received data.nTest passed.n");
  49.   ]
  50.   else
  51.   [  /* EP收信 */
  52.  }
  53. 》 ps
  54. 结果
  55.   Cnt = 2931335
  56.   prevCnt = 253694
  57.   prevCnt1= 3185029

回帖(8)

杨娟

2018-6-25 04:33:43
得到的时间是cnt,如果按照1GHz来算的话,耗时2.9ms
                                                                          

举报

李之

2018-6-25 04:45:49
引用: zbb9612 发表于 2018-6-25 04:33
得到的时间是cnt,如果按照1GHz来算的话,耗时2.9ms
                                                                          

CPU频率是1GHz,实验用的是TI提供的例程
如果没理解错的话,
例程做的事是 将160bytes由RC发送给EP,
EP接收后原封不动的反传给RC。
PCIe设置为1lane 2.5Gps
整个过程要耗时·2.9ms 好像长了点儿
不明白2.9 ms的时间花费在那些处理上了?
如果能帮忙解答的话
十分感谢
举报

高欢

2018-6-25 04:56:17
引用: testd022 发表于 2018-6-25 04:45
CPU频率是1GHz,实验用的是TI提供的例程
如果没理解错的话,
例程做的事是 将160bytes由RC发送给EP,

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

李之

2018-6-25 05:13:25
引用: liuqin123 发表于 2018-6-25 04:56
如上测试中的所用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等)
还是软件还需要另行设置
期待您的答复
举报

更多回帖

发帖
×
20
完善资料,
赚取积分