我正試圖爲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函數。這樣,一切都是事件驅動的。
這就是我所說的:有兩個回調,一個用於RX,一個用於TX。我真的不明白你的最後一點。你的意思是我必須等待發送功能中的ARP回覆嗎?我不能那樣做,因爲我必須按照它們到達的順序處理數據包,並且UDP數據包可能會在ARP請求及其答覆之前進入。 – eepp
對不起,如果我不清楚。我的意思是send函數可以將UDP段/數據包交給IP並返回。爲什麼?因爲ARP請求應該由IP或更低層而不是UDP完成。因此,您的IP可能需要在處理ARP和發送方面再次異步。 –
另外,@eepp如果你的問題只是知道是否可能有任何問題,由於完全事件驅動的UDP/IP,我沒有在概念上看到任何問題,但我會等待專家的意見。 –