1. 程式人生 > >關於Lwip移植-測試ping顯示超時

關於Lwip移植-測試ping顯示超時

硬體描述:STM32F107VCT6  PHY晶片:DM9161

LWip軟體版本:1.4.0

這裡沒有使用作業系統,裸機移植Lwip。

      注意點:除錯過程中由於這裡我使用串列埠列印除錯,使用了printf重對映,在尋找資料走向的時候這裡開始一直沒有列印資訊,後來發現是在測試列印的C檔案中沒有包含串列埠重對映的函式的標頭檔案,這裡使用printf編譯器也沒有警告。

這裡關於具體檔案的移植和工程的建立,網上有很多的文章介紹,這裡自己也是參照網友的帖子來一步步移植,感謝這些網友的幫助。這裡在移植過程中涉及到很多巨集定義的開啟,這裡建議大家在移植過程中多關注這裡巨集定義的意義。這樣會對你對專案後期的理解很有幫助,畢竟我們這裡是站在巨人的肩膀上去使用這麼一套協議棧。

問題描述:這裡網絡卡的顯示燈可以正常閃速,自己在網絡卡接收函式入口列印也發現有接收到資料。這裡ping的結果就是顯示超時,這裡使用抓包軟體Wireshark發現ping目標板的時候有資料返回。

問題解決:這裡ping使用的是IP協議包裹的ICMP協議,這裡網絡卡資料接收到之後再到LWip協議中分層,分別進行處理。這裡ethernet_input()函式是註冊的一個網絡卡資料接收分層函式的入口,再到ip_input(),最後進入到icmp_input(),這裡再把資料接收到的ping包,做一個修改封裝好資料再到底層網絡卡傳送。ethernet_input()--->(MAC層)ip_input() (IP層) --->icmp_input()  (ICMP層)。這裡我們把資料流向搞清楚也是我們發現問題的關鍵。這裡我們把ping目標裝置時候的接收包和傳送包都打印出來了。對於底層具體資料最後我們通過比對可以成功ping通裝置的資料發現,只有資料包的第37個位元組和第38個位元組不一樣。這裡成功的資料包為0000,而我的資料為554e。這裡最後通過查詢發現這兩個位元組的資料為ICMP的校驗位。這裡涉及到一個關鍵的巨集定義  CHECKSUM_BY_HARDWARE  這裡巨集決定了LWip在傳送資料包的時候使用軟體校驗還是硬體校驗。如果定義了這個巨集使用的是硬體校驗這裡校驗碼必須給0000。這裡在STM32F107VCT6中 這個韌體庫函式便是開啟硬體校驗 ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable。這裡最後我發現Lwip1.4.0的版本里面在icmp_input()這個函式裡面沒有關於這個巨集的條件CHECKSUM_BY_HARDWARE ,這裡比對其他版本都有一個關於這個巨集定義的條件編譯,具體操作是開了這個CHECKSUM_BY_HARDWARE 巨集便把相關校驗位清0  (iecho->chksum = 0)。由於移植過程中我按照其他人的文件來,但是我們Lwip和他們版本不同,打開了硬體校驗巨集,但是Lwip內部沒有把這校驗位清0導致資料不通過。下面給出我相關介紹的截圖:

網絡卡資料入口:


ping資料列印比對:


Lwip相關程式碼修改:


Lwip是否開啟硬體校驗相關操作:



注意:所以這裡應該是Lwip1.4.0的BUG,這個我們使用這個版本的協議棧需要關閉硬體校驗才能通過PING,但是這樣做會耗費硬體資源,所以這裡我們按照其他版本做了一個巨集的編譯修復這個小BUG便可以通過了。這裡簡單通過ping發現使用軟體校驗的時間幾乎沒有差別,但是對於後期真正與伺服器建立連線通訊的過程中,隨著資料量的增加肯定有影響,具體情況這裡有待驗證。

這裡在你移植除錯的過程中,如果你的網口指示燈或者網絡卡中斷函式也沒有進入,這裡就要去檢查你的MAC配置和PHY相關配置了。

上面的所講都是個人理解,有錯誤的地方還希望大家給予建議和糾正。本人有個嵌入式交流群 469602418歡迎有興趣的人可以加入遇到問題一起交流。

轉載請註明原創人地址:謝謝