大家好,
**************************************************************************************************************
我在做用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,找到效率最低的点。