我正在使用 LwIP 和 FreeRTOS 为嵌入式设备编写 C 程序,微控制器是Atmel AVR32。
在 LwIP 中,在udp_recv()
设置 udp 接收回调函数后,我知道一旦 UDP调用回调函数收到数据报。然后我可以在回调函数中执行类似process_udp_packet()
的操作。但是,如果在回调函数完成之前收到另一个 UDP 数据包,那么第二个数据包是否会在缓冲区中排队?或者即使第一个回调函数没有完成,也会立即再次调用回调函数?
非常感谢。
答案 0 :(得分:4)
在LwIP本身的上下文中调用回调。因此,在退出回调之前,LwIP将被阻止。它根本不会处理任何新数据包。 如果有到达的新数据,接口驱动程序不应从接口(如调制解调器)读取它或将其保存在自己的缓冲区中,直到LwIP被解除阻塞。
因此,回调应尽快退出,不要干扰正常的LwIP工作流程。 编程此类回调函数的最佳方法是将新数据包读入应用程序队列并立即从回调中返回。然后app在其自己的上下文中可以处理新数据。
但是,如果数据处理真的很快,你可以在回调函数内完成。