1. 程式人生 > >iperf交叉編譯執行出現illegal instruction問題

iperf交叉編譯執行出現illegal instruction問題

轉載請註明出處:https://blog.csdn.net/luomin5417/article/details/77770886

最近在基於at91sam9x5 系列CPU做開發,進行iperf程式移植的時候遇到一個illegal instruct的問題,問題如圖1-1:


 圖 1-1

在執行iperf  -s之後會出現illegal instruction的錯誤。

參考http://blog.csdn.net/jody1989/article/details/50040229和http://blog.chinaunix.net/uid-25756789-id-3420210.html

開啟核心DEBUG_USER選項,修改uboot啟動引數新增user_debug=1,再次執行iperf -s,出現了錯誤地址,pc=0x0000c7f8地址出現了未識別的指令,如圖1-2


圖 1-2

反彙編iperf程式,如圖1-3


圖 1-3

在彙編程式碼中找到0x0000c7f8處彙編指令程式碼,如圖1-4所示


圖 1-4

到ARM官網搜尋該指令,地址:http://infocenter.arm.com/help/index.jsp?lang=en,搜尋結果如圖1-5所示:


圖 1-5

指令拷貝立即數則要求vfpv3以及更高版本,如果只是從暫存器拷貝值則在所有VFP系統中都支援。在官網找了下at91sam9x5對應的arm核arm926ej-s的FPU,對應使用的是softvfp,即軟體浮點


圖 1-6


圖 1-7

可以看到,arm925ej-s核並不支援硬體浮點,在官網找到了ARM Compiler toolchain.pdf 這個文件,在文件中找到了關於-mfpu的配置,如圖1-8所示:


圖 1-8

原來是編譯選項設定的問題,我之前的編譯選項設定如圖1-9所示,設定-mfpu=vfp,應該要改成softvfp才對:


圖 1-9

修改之後,再編譯iperf執行,執行情況如圖1-10所示:


圖 1-10

但是,改了之後編譯出現問題,還是懷疑-mfpu設定不對,再次上網搜了下-mfpu的配置引數,在http://blog.sina.com.cn/s/blog_602f87700100r5xe.html看到了如下的說明,如圖1-11:


圖 1-11

嘗試將-mfpu改為fpa,然後編譯iperf再次執行,奇蹟發生了,這個時候居然沒報錯了,如圖:


真是應了那句詩,"山重水複疑無路,柳暗花明又一村"。希望把解決問題的思路分享給有需要的人,可以幫助需要的人省點時間。