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

C6670以太网发包出现No TX Free Descriptor的问题

大家好,

**************************************************************************************************************

我在做用C6670发送MAC层的以太网数据包。

环境是:C6670,为客户定制的板卡,C6670链接到以太网SWITCH再连接到背板,CCSv5.3,SYS/BIOSv6.33.06.50

**************************************************************************************************************

代码情况:工程基于C:\ti\pdk_C6670_1_1_2_6\packages\ti\drv\exampleProjects\PA_multicoreExample_exampleProject。Core0初始化QMSS、CPPI、以太网TX/RXQueue、以太网物理层配置等,给4个Core每个Core分配一个MAC地址,4个Core可同时收发以太网MAC层数据包。.text放在DDR3上。

**************************************************************************************************************

代码功能:4个Core同时响应一个1.5ms的GPIO脉冲信号,在中断处理函数中,对机箱内的主机发送一个MAC数据包(payload是100Bytes左右),在主机上用抓包软件分析数据包流量。

**************************************************************************************************************

遇到的问题是:4个Core同时按照1.5ms中断发送一个包,每秒每个Core发送667个包,每个包的payload为100Bytes。如果再提高payload或者增加每次中断发包个数,就会出现No TX Free Descriptor的问题。感觉C6670以太网发包发不过来了,请帮忙分析。

具体情况:

1. 如果把pyadload增加到600Bytes,也就是每个Core每隔1.5ms中断一次,对外发送一个600Bytes字节的MAC层数据包,此时会出现“No TX Free Descriptor“的问题。

2. 如果payload仍然是100Bytes,但每个Core每隔1.5ms中断一次,对外连续发送5个MAC层数据包,也会出现”No TX Free Descriptor“的问题。

3. 如果payload改成600Byes,每个Core每隔1.5ms中断一次,对外了连续发送5个MAC层数据包,此时哪怕只有Core0工作,也会出现”No TX Free Descriptor“的问题。

**************************************************************************************************************

而我想实现的是:C6670的4个Core,每个Core同时每隔1.5ms,对外连续发送5个payload为600Bytes的MAC层数据包。

**************************************************************************************************************

我揣测原因可能是是:

每次发包,都是从TX Free Queue从Pop出来一个Descriptor,填充Buffer Pointer,再Push到PA TX Queue(648)中去,从而完成一个发包。

按理说,每次这个Descriptor被Push完以后,应该Return回TX Free Queue中,这样的话,整个TX Free Queue就不会空。

但是,如果我增加发包强度(例如每隔1.5ms,连续发送5个包或者增加每次发包的payload字节数),这样的话Descriptor就没法及时地Return到TX Free Queue中,渐渐地TX Free Queue就空了,于是出现了“No TX Free Descriptor”的问题。

而且我每次从TX Free Queue中Pop出一个Descriptor之前,先用

do
{queue_pkt_num = Qmss_getQueueEntryCount(gTxFreeQHnd);
}while(queue_pkt_num == 0);

读取一个TX Free Queue中的Descriptor数,发现发包强度不大时(每隔1.5ms只发生一个100Bytes的包),Descpripor数量基本不变;但是如果增加发包强度(例如每隔1.5ms,连续发送5个包或者增加每次发包的payload字节数),则TX Free Queue中的Descriptor逐渐下降直至变空!!

但是,感觉我拟实现的目标(即每隔1.5ms,4个Core同时对外连续发送5个Payload为600Bytes的MAC层数据包)整个数据率才1000/1.5*4*5*600=7.6MBytes,对于千兆的以太网应该能够足以胜任的啊,可是为什么会出现这样的问题呢??

求TI专家指点一下!非常感谢。

Marvin Liang:

"连续发送5个包或者增加每次发包的payload字节数"…看起来你的问题跟以太网子系统关系不大,倒可能是发包使用的描述符或者buffer的cache问题。

请先确认:

1. SGMII的协商速率和能力是GE全双工

2. 发包使用的描述符和buffer是在LL2,MSMC还是DDR? 如果是MSMC或者DDR,是否使能cache?

3.将你的发包函数用TSC进行profiling,找到效率最低的点。

赞(0)
未经允许不得转载:TI中文支持网 » C6670以太网发包出现No TX Free Descriptor的问题
分享到: 更多 (0)