现在遇到的主要问题就是,当一端广播另一端单播时,有丢帧。下面让我一步一步分析整个收发帧过程。
首先清楚一下片的结构,前两个字节是固定发送字节,第3个字节用于发送片的序号,第四个字节是用于发送片应答。当读出第三个字节与记录的片序号不同时,就表示有新片到,开始接收,并把接收后的片序号写到第四个字节发送回去。
首先单播端A向E1通道10发送帧, 假设帧序号为5,那么等收到片应答5后才会发送下一片。但此时广播端正在发送广播,广播使能的时候其他路的是不能发送任何数据和应答的,直到广播时能关闭。而广播是向所有路发送片,而所有路收到片后会把片应答发送回来。广播端结束发送以后第10路收到第三个片的帧序号,写到第四个字节,做出应答,只要这个应答在收到片后400ms内发出就不会丢帧。
也就是说如果使用FPGA广播功能,所广播的帧必须小于400ms,也就是小于20片,(20*28==360byte)
可是实验一下,广播一片后关闭广播使能,让可以做出应答,但不是发送片,只是可以做出片应答,因为此时发送队列不会发出帧,所以对于广播来说不会打断广播帧。但有可能引进的问题就是关广播时能的时间问题。在什么地方关闭使能,在什么地方打开时能。还是不行,当使能关闭后,其他通道的片就会发送过去覆盖掉刚发送过去的广播片。
可以这样做,完全放弃FPGA广播功能,广播是向所有路写入片,发送出去,然后间隔20ms后发送下片,这样相当于没有慢多少。而且同时可以接收对段发送过来的帧,而且不占用发送队列空间。减少很多memcpy时间。
今天实验的以上办法,直接向所有路写片,但是速度还是很慢,改成汇编,速度稍好,并且可以同时接收对方帧。
现在广播时可以接收帧了,现在主要问题又出现了。就是速度问题。当连续发帧很快时会有丢帧。虽然发片间隔
只能是20ms,发40片必然大于800ms,并且,当双向同时广播时,负载很大,几乎是全负载,当然我还没加入到帧队列中,我只是单纯的接收。瓶颈到底在哪里呢?为什么会有丢帧呢?
关键的瓶颈在搬移的速度,上一帧还没有来的及搬移走就进来了新片。
干脆把中断也放弃掉,直接在大循环中多调用几次segasm,提高搬移的速度,并同时保证10ms内执行一次片接收。