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再次运行,奇迹发生了,这个时候居然没报错了,如图:


真是应了那句诗,"山重水复疑无路,柳暗花明又一村"。希望把解决问题的思路分享给有需要的人,可以帮助需要的人省点时间。