2011-09-25 56 views
4

我正試圖爲8位AVR MCU實現一個非常小的IP協議棧。我不希望它支持TCP,因爲它太大了,我不需要它,而是UDP(當然還有ARP和ICMP)。嵌入式IP協議棧:是否可以接受異步發送?

我希望堆棧代碼適合16kB的ROM和1kB的RAM,當然爲應用程序留出儘可能多的空間。我正在使用基於ENC28J60的電路板進行PHY/MAC管理,該電路板具有一個內部8 kiB RX/TX環形緩衝區。當數據包到達該芯片時,它將一個接一個地寫入RX緩衝區,但不會覆蓋最早的那個。最老的一個是由一個指針指向的,當用戶讀完它時,指針必須更新以指向下一個數據包。當新的數據包到達時,它還會在其某個引腳上發送中斷。

對於RX的一部分,我想工作,就像LWIP的作用:信號一個新包準備好,當我們接收中斷(保存它的地址和大小),但只有當用戶調用我們的IP堆棧進行它功能。這應該沒問題;如果用戶沒有足夠頻繁地調用我們的函數,新到的數據包將被丟棄,就是這樣。用戶爲堆棧提供一個UDP回調。

現在,問題是關於TX。比方說,我想發送一個UDP數據包到我不知道鏈接地址的IP地址。在發送數據包之前,必須先發送ARP請求。如果在ARP應答之前有一個UDP數據包進入,怎麼辦?它必須通過我的UDP回調進行處理,但是如果我想從此回調中發送某些內容呢?我仍然在等待ARP答覆。肯定這種阻塞機制是不正確的。

我的問題是:是否可以接受異步發送?因此,如果我想發送一些東西,我會提供發送函數的回調函數,並在可能發送UDP數據包時調用get函數。這樣,一切都是事件驅動的

回答

2

至於是否是「可接受的」有異步發送,我不能想象爲什麼它會是一個問題,只要你可以實現你的代碼尺寸要求。

至於實現這樣一個方案的最佳方式,我不知道你想支持多大的數據包大小(我猜測比理論最大值小64K),但我會分配一個每當負責實際發送到硬件的進程運行其循環/中斷/任何時候,它將檢查每個活動緩衝區的ARP狀態(具有ARP條目,未完成的ARP請求,ARP請求超時,沒有ARP條目或請求未完成)並採取適當的措施(分別爲:用適當的MAC推送到硬件,跳過這個時間,丟棄,發送ARP請求)。每次更新ARP表時,您都可以觸發此發送例程,以便您可以滿足任何必要的實時要求(儘管有些人會認爲以太網不是,也不會是真正實時的系統,但這是另一個論壇不介意火焰戰爭的話題)。

1

你可以有兩個回調(基本上是異步路徑),一個用於從IP層接收和一個用於發送到IP?另外,如果你正在實現層,我認爲IP發送/路由功能應該照顧在該級別的ARP應答。

+0

這就是我所說的:有兩個回調,一個用於RX,一個用於TX。我真的不明白你的最後一點。你的意思是我必須等待發送功能中的ARP回覆嗎?我不能那樣做,因爲我必須按照它們到達的順序處理數據包,並且UDP數據包可能會在ARP請求及其答覆之前進入。 – eepp

+0

對不起,如果我不清楚。我的意思是send函數可以將UDP段/數據包交給IP並返回。爲什麼?因爲ARP請求應該由IP或更低層而不是UDP完成。因此,您的IP可能需要在處理ARP和發送方面再次異步。 –

+0

另外,@eepp如果你的問題只是知道是否可能有任何問題,由於完全事件驅動的UDP/IP,我沒有在概念上看到任何問題,但我會等待專家的意見。 –