c6678的網路協處理器netcp模組有兩個對外千兆網口,但pdk提供的網口驅動示例只支援單網口,需要做修改。採用多核導航器描述符中的乙個欄位來區分兩個網口完成了這一任務。使用了幾個月後沒有出現大的問題。然而某一天當工程的優化屬性配置為o3優化時,網口啟動有一定概率失敗。將o3優化取消再測,則啟動一直能成功。
首先定位是**出現問題,將單獨的網口驅動檔案取消優化再測,沒有出現失敗的情況,因此將問題聚焦到網口驅動中。
然後分析**,畫出網口模組的初始化流程圖。在這個過程中發現其中有延時操作。因此重點懷疑是延時時間不夠,查手冊後發現手冊中並不要求延時,這裡是照抄pdk示例**,但將其擴大一百倍後再測仍有概率出錯,因此主要問題不在延時上。
這時需要進一步精細定位。把驅動檔案拆分為兩個檔案,一部分優化一部分不優化,用這個方法來精細定位到函式級別。最後發現是硬體初始化的幾個函式有問題。但這幾個函式中並不涉及延時操作,只是單純的配置暫存器。對照文件逐位元檢視配置的暫存器值,並沒有發現問題。
這時除錯又陷入僵局。只能再次仔細分析文件和**。在閱讀文件過程中發現**中的初始化流程與文件要求不一致。會不會是這個問題呢?
修改**的初始化流程後再測,居然成功了。o3優化後測試近百次,也沒有再出錯。問題解決。
回過頭來再分析,為什麼原來沒有出錯,而o3優化後就出錯了呢?應該是某個時序上正好處於臨界值,無優化時恰好符合條件,當優化後又恰好不符合條件。因此優化只是將原本就存在的問題放大並暴露出來而已。
聯想到另乙個c6455網口驅動的bug。在測試完畢後交付使用,然後某次在某個網路中,一台機器死活ping不通本板。最後在該機器上wireshark抓包發現本板傳送的arp包有問題,其fcs校驗不通過因而被該機器丟棄。與正常的arp包相比發現有問題的包最後四位元組為全零,而非乙太網資料幀的幀校驗。
最後也是花費了大量時間排查問題,最終證明是c6455網口驅動中用於補齊小包的分支中將小包錯誤地補齊到了64位元組,而非正常的60位元組(不含fcs)。而這處錯誤正是從ti的示例**中沿襲而來。
這些教訓都證明了乙個真理:demo不可信,抄襲要謹慎!
linux網口初始化 Linux網路程式設計入門
根據前面所介紹的內容,本節介紹下網路位址初始化的方法。網路位址初始化本質上就是對sockaddr in結構體進行賦值 include include memset include sockaddr in int main int argc,char ar const char server ip 1...
OCI環境初始化失敗
在suse10上安裝了oracle 11g,結果編寫oci測試程式時,老是初始化環境失敗 ociinitialize 報1804錯誤,在google上搜尋了一下,原來是沒有設定oracle base oracle home等環境變數導致的,設定後,程式正常了。如 export oracle base...
EAS輔助賬初始化失敗
前提 1 科目已錄入 2 科目餘額初始化結束 問題 一級科目的輔助賬在錄入結束後不准再新增輔助賬型別,於是,我便想通過輔助賬型別變更的方式來為以及科目新增輔助賬型別,但這是有總是報如下錯誤 於是,我便懷疑是不是有未過賬的憑證,但查了很久卻依然查不出有未過賬的憑證,所以,我想這也許時eas測試版的乙個...