60user143 发表于 2018-8-2 12:15
谢谢您的回答。
1、您说检查的cache 是否都enable是因为什么?我这里目前基本不涉及数据处理,应该不会有什么影响,我对cache使能或都不设置,处理效果类似。
2、当我将Rx free queue的数设置成32 时,PC机连续发100个时,DSP这提示只收到32个包,问题与之前一样的。描述述符是在中断里释放的,中断配置是例程中默认的,基 ...
1、您说检查的cache 是否都enable是因为什么?我这里目前基本不涉及数据处理,应该不会有什么影响,我对cache使能或都不设置,处理效果类似。
[Marvin Liang]这是因为根据你的描述,中断处理效率很低,对这里例子而言Cpsw_RxISR->VerifyPacket函数其实是对数据的处理,cache是否使能,性能差别巨大。
2、当我将Rx free queue的数设置成32 时,PC机连续发100个时,DSP这提示只收到32个包,问题与之前一样的。描述述符是在中断里释放的,中断配置是例程中默认的,基本没有改动,不知道 您有没有用这Pa_emacExample_exampleproject 工程进行过类似的测试,是不是我的程序中哪些地方被我改错了。
[Marvin Liang] 本例中软件调用Qmss_queuePush (gRxFreeQHnd, (Ptr)pHostDesc, pHostDesc->buffLen, SIZE_HOST_DESC, Qmss_Location_TAIL);将描述符回收Rx FDQ.请你只发送一个包,处理完毕后查询Rx FDQ中的描述符个数Qmss_getQueueEntryCount(gRxFreeQHnd);如果还剩下31个,则您需要单步跟踪一下,为什么处理完毕的描述符没有回到Rx FDQ.
3、在SendPacket函数中,有一如下几条语句:
if ((pCppiDesc = Qmss_queuePop (gTxFreeQHnd)) == NULL)
[
printf ("No Tx free descriptor. Cant run send/rcv test n");
return -1;
]
当没有空间的Tx queue时函数返回。这里我为了去掉函数末尾的cycledelay(10000),将这几句改成
while((pCppiDesc = Qmss_queuePop (gTxFreeQHnd)) == NULL);
希望得到的结果是当没有空间Tx queue时一直等待,直到有空间Tx queue时才往下运行,这样就能达到实时的发送。 这不知道我这种想法是否得当?
而在我运行程序时,得到的并不是我想要的结果,当时好像是只发送了16次就停止了(这里初始化时申请了16个描述符)。
[Marvin Liang] 这样的改动可行,但其实不建议,较好的办法是先通过Qmss_getQueueEntryCount(gTxFreeQHnd);查询该队列的个数,如果是非0再pop.
只发送16次就停止了,应该是你的TX FDQ中的描述符也没能回到该队列。按道理,在Setup_Tx函数中已经设置了return queue, Cppi_setReturnQueue ((Cppi_DescType) Cppi_DescType_HOST, pCppiDesc, qInfo);PKTDMA模块会在发送完毕后将描述符送回TX FDQ。对于这样的情况,你可以写一个函数,用Qmss_getQueueEntryCount查询所有的8000个队列中的描述符个数,看看这样描述符漏到那个队列去了。特别是是否在0号队列,如果是的话,应该是你初始化描述符还有问题。
谢谢~~