免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11424 | 回复: 7
打印 上一主题 下一主题

请教一下如何在内核中使用浮点?~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-20 19:05 |只看该作者 |倒序浏览
看了一下~
如果编译器是软浮点的话~ 会在编译的时候使用浮点库~  但是内核编译是链接不上这些库的~ 所以在链接过程中会报错~
如果编译器是硬浮点但是CPU不支持的话,在内核编译中选上软浮点的支持就可以使用软浮点了~

我现在的情况是需要在内核做浮点运算,但是CPU不支持,编译器也是软浮点的~
有没有什么参数能让编译器使用硬浮点么?~
或者内核有没有提供什么整数模拟浮点的接口?~ 运算量并不大~

Orz~ 不支持浮点的CPU真麻烦啊~

论坛徽章:
0
2 [报告]
发表于 2010-10-20 23:09 |只看该作者
搜了一下~   有SoftFloat-2b这个函数库~

不过不知道能用不~

大家有用过什么浮点库么?~

论坛徽章:
0
3 [报告]
发表于 2010-10-20 23:57 |只看该作者
不能将浮点转为整数运算吗?放大若干倍的做法。图像处理时,经常用到的技巧

论坛徽章:
0
4 [报告]
发表于 2010-10-21 06:33 |只看该作者
回复 1# superfight in


    如果cpu core没有浮点指令,并且没有浮点协处理器,而且compiler又是硬浮点的话,你就必须要保证你cpu arch的kernel code中有对应的float emulator,就像arm下面的nwfpe一样。如果你的cpu arch下面没有float emulator,那么让compiler输出float instruction又如何?肯定跑步起来(浮点异常了)。所以,这种情况下你只有让编译器不输出浮点指令。不管你用的什么编译器,应该都是gcc的交叉编译版,gcc的软浮点模拟是在libgcc.a中,你可以用$(CROSS_COMPILE)-gcc -print-libgcc-file-name看一下放在神马地方。然后将其lib名写入arch/xxx/Makefile中就行了。难道你的编译器提供商没输出libgcc??

论坛徽章:
0
5 [报告]
发表于 2010-10-21 09:19 |只看该作者
不能将浮点转为整数运算吗?放大若干倍的做法。图像处理时,经常用到的技巧
sep 发表于 2010-10-20 23:57 [img]http://linux.chinaunix.net/bbs/images/common/bac
k.gif[/img]


算了一下~ 极限值超过了int的范围~ = =~ 所以直接改简单的整数运算猜是不可能了~

回复  superfight  in


    如果cpu core没有浮点指令,并且没有浮点协处理器,而且compiler又是硬浮点 ...
snail_314 发表于 2010-10-21 06:33


恩~  编译器是软浮点的~  但没有浮点库~  所以提示undefined reference to `__aeabi_fadd'
根据你的提示,找到libgcc.a的绝对地址后,在/arch/arm/Makefile的LDFLAGS_vmlinux加上-L/XXX/libgcc.a~
但还是提示undefined reference to `__aeabi_fadd' , 应该是和平常指定库的方法不一样~
能不能再提示一下怎么改?~   

{:2_165:}

论坛徽章:
0
6 [报告]
发表于 2010-10-21 09:32 |只看该作者
回复 5# superfight


    你可以先用arm-nm确定一下libgcc.a有没有__aeabi_fadd这个symbol,如果有的话,大致是这种输出:
  1. _addsubsf3.o:
  2. 0000000c T __addsf3
  3. 0000000c T __aeabi_fadd
  4. 00000000 T __aeabi_frsub
  5. 00000008 T __aeabi_fsub
  6. 000001a4 T __aeabi_i2f
  7. 000001d4 T __aeabi_l2f
  8. 0000019c T __aeabi_ui2f
  9. 000001c4 T __aeabi_ul2f
  10. 000001d4 T __floatdisf
  11. 000001a4 T __floatsisf
  12. 000001c4 T __floatundisf
  13. 0000019c T __floatunsisf
  14. 00000008 T __subsf3
复制代码
如果没有,那说明你的cross-tool在build时就没有把soft-float的功能build进去吧

如果有,那么再确定你是否真正链接了libgcc.这个最好看看你的make的输出,不一定你加的command走到了正确的path上

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-10-21 10:48 |只看该作者
如果对浮点的要求不高的话,可以考虑自己模拟实现

论坛徽章:
0
8 [报告]
发表于 2010-10-21 20:38 |只看该作者
最好要开启浮点模拟吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP