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