mips 平台linux系统软浮点

嵌入式领域,为了节省成本和减少功耗,很多芯片都是没有浮点运算模块的,一般该模块叫做 FPU(float process unit)。这种情况下,linux内核有一个模块叫math-emu的软件模块,就是用整数运算模拟浮点数运算,一般位于arch/mips/目录下。那么在应用空间的程序是怎么跑到该内核空间的模块呢。简单说就是,用工具链编译含有浮点运算的文件时,编译器并不知道目标板上没有FPU,所以遇到浮点运算的时候还是将其编译成浮点运算指令。但是,编译生成的执行文件最终在执行到浮点运算指令的时候就有问题了。因为芯片没有FPU,所以浮点指令对于芯片来说是属于不认识或者叫不支持的指令,那么他就会产生一个异常。内核在初始化的时候为这个异常设置了异常处理函数,当内核捕捉到这个异常后进入异常处理函数执行。而这个异常处理函数就是内核浮点模拟运算模块的入口。内核将运算的结果再通过寄存器返回给系统空间,这样在应用空间来看的话就好像普通运算一样,没有什么区别。
      但是,事实上并非如此。应用空间 使用内核实现的浮点运算模块进行浮点运算,效率不是很高。这主要是基于两个方面,一个是因为需要反复的产生异常从而进行应用空间和内核空间的切换。另一个是因为,内核的浮点模拟模块效率并不高,因为异常处理时并不知道产生异常的指令到底是加减乘除指令,还是浮点比较等指令。所以,他需要先用switch确定一下该指令到底需要什么运算然后再进行模拟,最后返回运算结果。
      另外一种浮点运算的解决方案就是使用软浮点库。方法就是在编译的时候使用编译选项-msoft-float,然后在链接的时候加上软浮点库。软浮点库的源文件在网上应该找的到。这样加上该编译选项后,编译器在编译浮点运算时,并不将浮点运算翻译成浮点运算指令而是,将其在编译阶段就转化成整形数,然后调用相应的软浮点运算库中浮点运算指令模拟函数,这样一条浮点运算指令在同软浮点运算库链接完成后就成了一堆整形数运算。这样的可执行文件能够充分的利用芯片的流水线,而且避免了应用空间和系统空间的切换,并且运算指令的类别判定放在了编译阶段,提高了运行阶段的效率。通常情况下,用软浮点和用内核浮点模拟模块相比,运算效率快一个数量级,相当的可观!
      需要注意的几个问题:
      内核浮点和软浮点不能混用。什么意思呢?比如一个工程中A库里面有函数的参数是浮点类型的,B库调用A库的这个函数,那么不能B库编译的时候带 -msoft-float,而编译A库的时候却不带(直接使用内核浮点)。或者是A库带 -msoft-float,而B库不带。通常网上很多文章说使用软浮点时,一定要使用支持软浮点的工具链,我想应该是因为使用软浮点时,工具链中很多系统库必须是 -msoft-float选项下编译出来的,典型的就是数学库libm.a ,不然调用到该库中的函数时就可能计算错误。所以存在调用关系时,必须调用者和被调者在是否带-msoft-float选项上保持一致。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值