最近要使用iperf测试wifi模块的延时,所以重点研究了一下iperf.
1.安装使用
我主要是使用的linux,安装和使用方法其他文档有很详细的介绍,在此不再赘述,具体可参考下面链接:
2.iperf移植到ARM
这里关键点事交叉编译的问题,我是添加了一个Makefile文件,具体如下:
CUR_DIR := $(shell pwd)
OSDRV_CROSS ?= arm-himix100-linux
################################################################################
#https://download.savannah.gnu.org/releases/freetype/freetype-2.9.1.tar.gz
BUILD := iperf-3.1.2
################################################################################
.PHONY: $(BUILD) clean distclean
defalut: $(BUILD)
################################################################################
download:
#@if [ ! -f $(BUILD).tar.gz ]; then curl --insecure -O https://download.savannah.gnu.org/releases/****/$(BUILD).tar.gz; fi
$(BUILD): download
@if [ ! -d "$(BUILD)" ]; then\
tar -xzf $(BUILD).tar.gz;\
cd $(BUILD);./configure --prefix=$(CUR_DIR)/$(BUILD)/_INSTALL --host=$(OSDRV_CROSS);cd -;\
fi
make -C $(BUILD)
make install -C $(BUILD)
clean:
-make -C $(BUILD) clean
distclean: clean
-rm -rf $(BUILD)
################################################################################
也就是在./configure 后面添加了一个指定的交叉编译工具链arm-himix100-linux :--host=$(OSDRV_CROSS),因为我板子用的就是这个,如果ARM板用的是其他的编译工具链更换成对应的就行了。编译后直接报错:
/opt/hisi-linux/x86-arm/arm-himix100-linux/host_bin/../lib/gcc/arm-linux-uclibceabi/6.3.0/../../../../arm-linux-uclibceabi/bin/ld: cannot find gcrt1.o: No such file or directory
这个gcrt1.不知道是啥,然后osdrv的tool下工具对应的Makefile对比发现少了头文件路径的指定,所以加了LDFLAGS="$(OSDRV_CROSS_CFLAGS)" CFLAGS="$(OSDRV_CROSS_CFLAGS)",照猫画虎:
CUR_DIR := $(shell pwd)
OSDRV_CROSS ?= arm-himix100-linux
OSDRV_CROSS_CFLAGS ?= -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4
################################################################################
#https://download.savannah.gnu.org/releases/freetype/freetype-2.9.1.tar.gz
BUILD := iperf-3.1.2
################################################################################
.PHONY: $(BUILD) clean distclean
defalut: $(BUILD)
################################################################################
download:
#@if [ ! -f $(BUILD).tar.gz ]; then curl --insecure -O https://download.savannah.gnu.org/releases/freetype/$(BUILD).tar.gz; fi
$(BUILD): download
@if [ ! -d "$(BUILD)" ]; then\
tar -xzf $(BUILD).tar.gz;\
cd $(BUILD);./configure --prefix=$(CUR_DIR)/$(BUILD)/_INSTALL LDFLAGS="$(OSDRV_CROSS_CFLAGS)" CFLAGS="$(OSDRV_CROSS_CFLAGS)" --host=$(OSDRV_CROSS) ;cd -;\
fi
make -C $(BUILD)
make install -C $(BUILD)
clean:
-make -C $(BUILD) clean
distclean: clean
-rm -rf $(BUILD)
#
################################################################################
然后继续编译:依然是那个错误,查询发现arm-himix200-linux中有这个,然后将OSDRV_CROSS 指定为arm-himix200-linux,发现没问题,竟然过了,接下来我想的是直接一步到位把ARM板的编译器直接改了,改成200的,结果发现make menuconfig中竟然不支持arm-himix200-linux,计划泡汤,继续修改程序吧,投机取巧失败。
完全不知道为什么出错的自己也很迷茫,然后各种找资料,然后在一篇文章中了解到需要把iperf中src/Makefile.in中第613行和第615中的参数-pg去掉,保留-g,编译试一下,竟然直接通过了。
解释如下:
调试选项-g和-pg
GCC 支持数种调试和剖析选项,常用到的是 -g 和 -pg 。
-g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序。GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使-g 和 -O (产生优化代码)联用。
-pg 选项告诉 GCC 在编译好的程序里加入额外的代码。运行程序时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况。
3.移植
移植之前还要先判断一下生成的iperf3是不是linux文件, 方法:objdump -a iperf3
结果显示
iperf3: file format elf32-little
iperf3
而不是 x86
移植时一定要将lib下的libiperf.so移植走,注意这个是链接文件 拷贝是用cp -l
链接文件要放到板子的/usr/lib下面,方便执行。
前面为什么把-pg去掉就编译正常了,我也是懵懵的。不知道为什么,有知道的希望能留言告诉我。