》 测试内容
利用下面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老是掉,好奇怪