2012-04-10 69 views
2

我寫使用LwIP的一個Ç程序與FreeRTOS的用於嵌入式設備,該微控制器是Atmel AVR32。是否收到在LwIP堆棧中排隊的UDP數據包?

LwIP的,建立UDP後通過udp_recv()收到回調函數,我知道,回調函數將被調用一次接收到UDP數據報。然後,我可以在回調函數中執行類似process_udp_packet()的操作。但是,如果在回調函數完成之前接收到另一個UDP數據包,這個第二個數據包是否會在緩衝區中排隊?或者立即再次調用回調函數,即使第一個回調函數沒有完成?

非常感謝。

回答

4

在LwIP本身的環境中調用回調。所以,直到你退出回叫,LwIP將被阻止。它根本不會處理任何新的數據包。 如果將有新數據到達,接口驅動程序不應從接口(如調制解調器)讀取它或將其保存在自己的緩衝區中,直到LwIP將被解除阻塞。

因此,回調應儘快退出,以免干擾正常的LwIP工作流程。 編程這種回調函數的最佳方法是將新數據包讀入應用程序隊列並立即從回調中返回。然後,應用在其自己的上下文中可以處理新數據。

但是,如果數據處理真的很快,你可以在回調函數內部完成。

+0

謝謝。事實上,我也發現它不適合在回調中做太多事情,因爲回調輸入參數並不適合我。所以現在我只是分配一個緩衝區來存儲數據包(因爲我知道一個真正的數據包可以存儲在一個pbuf結構的鏈接中,並且pbuf的頭部不是真實的數據)。但是,通過這樣做,我需要輪詢以檢查數據包是否被接收,是否正確?我擔心這不好,因爲實際上我正在做一個支持RTP的VoIP項目,所以實時性很重要。你能建議嗎? – eepty 2012-04-11 15:07:23

+0

此外,我想問一下struct pbuf中的** len **字段是代表有效負載的長度還是整個pbuf的長度?代碼中的評論說前者。但是,當我檢查函數** pbuf_header()**,似乎* len *代表整個pbuf的長度.....謝謝@werewindle – eepty 2012-04-11 18:00:12

+0

@eepty,如果你正在創建實時VoIP項目,我建議您使用一些RT Tasker(即Keil RTOS或FreeRTOS)。這將允許您在實時環境中擁有多個線程。在你的情況下,等待新數據包的線程不會輪詢它。它只會在信號量上被阻塞。當新數據包到達時,回調會將其保存到緩衝區併發信號給信號量。這將解鎖處理線程。同時(當沒有新數據包時),您的設備可以執行其他低優先級線程,例如與用戶交互。 – werewindle 2012-04-12 15:13:33