为什么只有在接收到数据时才处理接发送队列?发送队列为什么要依托于接收数据才能对其处理(我们可以看到是先通过判断接收到的数据包是否有效,也就是如果不为空则进行接下来的处理,),在最后只是补充一次处理(One more),这样的处理方法能对发送队列处理完全吗?————也就是说如果没有接收到数据包,只是通过发送中断进入,那么就只能通过One more 这段代码来进行一次并且只有一次对发送队列的处理,这样的处理方法彻底吗??
你这次也说到了,在ETH中断处理中:如果没有接收到数据包,只是通过发送中断进入,那么就只能通过One more 这段代码来进行一次并且只有一次对发送队列的处理。发送是完全可以不用依托接收数据就能处理的。
你这次也说到了,在ETH中断处理中:如果没有接收到数据包,只是通过发送中断进入,那么就只能通过One more 这段代码来进行一次并且只有一次对发送队列的处理。发送是完全可以不用依托接收数据就能处理的。
1、之所以在收到一个数据包并对其处理之后,要马上处理一下发送队列,是因为:一方面在接收数据包的处理中,可能会产生要发送的数据包如应答包、窗口更新通告包、应用层数据包等,待发的数据包在ETH发送资源被占用时是直接放在发送队列中的,而没有直接发出去。另一方面对收到的数据包的处理是很花费时间的,不仅是LWIP协议栈的各层处理,若是有效数据包还要回调应用层的处理函数,这其中还可能会有产生新的发送包的处理,因此在处理完一个收到的数据包之后,在处理之前被占用的发送资源可能已经可用了,而且现在可能又有新的数据包收到了,while循环会接着处理收到的数据包。为提高处理效率,避免产生发送资源可用而发送队列却越来越长的情况,在每次处理完一个收到的数据包之后,要马上处理一下发送队列。
2、之所以一次只能处理一个发送队列中的包,这是芯片的ETH发送FIFO的要求,即一次只能向发送FIFO写一个数据包,然后等待这个数据包发出之后,发送FIFO才重新可用,这时才可再次向发送FIFO写数据包。因为芯片的ETH数据包的发送也需要时间,且发送FIFO可用时会产生ETH中断,因此没有必要在向发送FIFO写一个数据包后,浪费时间原地等待发送FIFO再次可用。
3、One more 这段发送处理其实主要是用于在ETH中断中,没有数据包收到时,直接处理发送的。
一点浅见,如有不对,欢迎指正!
一周热门 更多>