原文:
很多網友在學習lwip的時候,都遇到過:剛開始ping 裝置的時候返回時間都在1ms以下,可是工作了一段時間後,ping返回的時間卻越來越長,甚至達到了超時的程度,通過使用ip tool等抓包工具可以發現,其實是有資料返回的,只不過返回的間隔太久了,有的達到了3000ms以上,可是這已經超出了tcp的資料報間隔要求。一旦出現了這種情況以後,只有通過復位微控制器才能恢復,別無他法。我在學習lwip的時候也遇到了這個問題,研究了好幾次,都沒能解決。
後來終於在網上看到了問題的原因:
使用了中斷的方式接收網絡卡資料報
,在每次中斷中只讀取網絡卡的乙個資料報
。如果一次中斷發生,而網絡卡內事實上可能存在有多個資料報,這樣如果唯讀乙個,最終導致網絡卡內資料報積壓,所以會出現ping延遲的現象
。如果資料報長期積壓,還可能出現因網絡卡緩衝區滿而無法接收資料的情況,由於無接收中斷產生,控制器也不會處理積壓資料的現象,從而發生網絡卡假死的現象,系統無法接收資料。
這裡的正確解決方法是,
在乙個中斷中,需要讀取並處理所有的已經接收的資料報。
從網上可以看到,有些比較厲害的網友給出了解決方案,就是修改ethernetif.c檔案中的ethernetif_input函式,修改後的函式:
void ethernetif_input( void * pvparameters )
else
}
}}}可是我修改了之後,程式啟動之後卻直接崩潰了,這真心難過,好不容易找到了乙個解決方案,卻不能用,欲哭無淚啊。心中不免暗想:是不是網友沒有測試過自己的**呢?可是給出這種解決方案的不止乙個網友,怎麼可能是不能用的呢?於是我掛上了jlink,不調不知道,一條嚇一跳,程式竟然進入了hardfault_handler函式,崩潰了!很多網友都給出了以上的解決方案,可是卻從沒有人提過還會引入這個問題啊!沒辦法,問題既然出了,就只能想辦法解決。
經過一番周折之後,發現原來是frame.descriptor->status = eth_dmarxdesc_own;這條語句引起的。於是檢視與它相關的函式呼叫,最終發現原來問題再這裡:
static struct pbuf * low_level_input(struct netif *netif)
測試:在增加本文修改之前,只要在除錯的時候設定斷點,停下來後再執行,ping資料報,返回的時間基本都在幾百毫秒,按照本文修改之後,又可以恢復到1ms以內了。困擾我幾個月的問題,終於在今天得到了解決!
為了感謝網友的無私奉獻,特記錄今天的修改過程,給出解決方案,如有不對之處,還請指出。
雙網絡卡IIS執行一段時間後假死
故障現象 區域網中伺服器,作業系統多見於win2003server,win2003serser 的事件檢視器不時顯示 名稱 workgroup 1d 不能註冊到 ip 位址 xx.xx.xx.xx1 的介面上。具有 ip 位址 xx.xx.xx.xx2 的機器沒有 允許這個名稱被此機器占用。事件 為...
最近一段時間
嗯。乙個是從那時候開始忙了一段時間,然後就沒有時間寫博,而且那段時間也緊張,還有就是人的劣根性 惰性。從那時候開始,大概過了一周5.30號的進候辭職了,因為拿到了南京一家公司的offer,很快,大概是週三面試,周五面試,周五下午發offer。然後周一去辭職的。一切都是這麼快。其實為什麼決定這麼快,因...
告別一段時間
不談過去。在這個學期,認真的做好兩個地理資訊系統。畢業 不用去管。初步的想法,是空間資料結構和演算法,空間資料探勘和知識發現,smartclient webservice和空間資訊網格三部分。第一部分,是很最重要的,也是最實在的,最具有挑戰性的,第二部分,其實就是吹牛,第三部分,也是很重要的,主要是...