A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

通常在kernel或是module中是不建议使用float的,因为对于没有硬件浮点单元的arm来说,这样会降低性能。
对于有fpu的arm来说是没有问题的。
问题是如何使用让module使用硬浮点。
1.修改kernel /arch/arm/Makefile
全文搜索-msoft-float

120 # Need -Uarm for gcc < 3.x
121 KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm
122 KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/unified.h -msoft-float
123
1
2
3
4
改成

120 # Need -Uarm for gcc < 3.x
121 KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -mhard-float -Uarm
122 KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/unified.h -mhard-float
123
1
2
3
4
然后执行make编译就行了。

下一个是对module的硬编译的设置。
其实最初我们只是想让driver支持硬浮点,根据网上查到的信息,需要将
-mfloat-abi的值设置为
-mfloat-abi=softfp 或者 -mfloat-abi=hard ,最好是后者,因为后者不仅使用的是硬浮点,而是也使用了硬浮点模块的寄存器,而softtp虽然使用的是fpu,但它是使用普通的寄存器来传递参数的。

于是便围绕这个问题一直在driver的Makefile中添加编译选项。此时发现,不添加额外的选项时,默认是使用软浮点编译的。我和同事试了半天最后他发现,需要先把kernel配置成使用硬浮点,即修改arch/arm/Makefile的-msoft-float为-mhard-float之后,module才会跟随着使用硬浮点。

1.如果不确信使用的是硬浮点还是软浮点,可以反汇编查看一下。
1.1因为软浮点是通过调用库实现的浮点运算,所以会有_eabi_i2f,_eabi_fad之类的abi接口调用。并有如下类似警告:

undefined reference to `__aeabi_fdiv'
1
1.2如果是硬浮点的话会用硬浮点的汇编语句,flds之类的,具体跟处理器有关,且使用了fpu的寄存器。

2.在Makefile的编译选项中加入-v可以查看编译时使用的编译选项。

3.driver或这个module的编译选项,是源自kernel的配置的,如果想修改什么的话可以考虑一下先改一下kernel的配置。
除了这里说的fpu编译问题,还有一个就是编译module时,它默认的根目录是所引用的kernel的目录。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马