历史上的今天

今天是:2024年10月24日(星期四)

正在发生

2019年10月24日 | ARM GCC浮点相关总结

发布者:ArtisticSoul 来源: eefocus关键字:ARM  GCC浮点 手机看文章 扫描二维码
随时随地手机看文章

1、名字解释:


ABI,application binary interface (ABI),应用程序二进制接口。


2、编译版本问题:

  GCC 4.0 为分界线

  4.0版本以下,由于采用OABI接口,其对浮点的支持不太好

  4.0版本以上,采用了新的EABI接口,其对软浮点和硬浮点的支持都比较好。


考虑在4.0版本以下时,其支持的ARM内核大多数没有硬浮点,所以可以分析资料比较少,

现在重点关注4.0版本以上。以下所述都是针对4.0版本以上的。



3、编译器相关的参数:

  -mfloat-abi=soft    使用这个参数时,其将调用软浮点库(softfloat lib)来支持对浮点的运算,GCC编译器已经有这个库了,一般在libgcc里面。这时根本不会使用任何浮点指令,而是采用常用的指令来模拟浮点运算。 但使用的ARM芯片不支持硬浮点时,可以考虑使用这个参数。在使用这个参数时,连接时一般会出现下面的提示:

   undefined reference to `__aeabi_fdiv'

  或者类似的提示,主要因为一般情况下连接器没有去主动寻找软浮点库,这时使用将libgcc库加入即可。


  -mfloat-abi=softfp

  -mfloat-abi=hard

  这两个参数都用来产生硬浮点指令,至于产生哪里类型的硬浮点指令,需要由-mfpu=xxx参数来指令。这两个参数不同的地方是:

         -mfloat-abi=softfp生成的代码采用兼容软浮点调用接口(即使用-mfloat-abi=soft时的调用接口),这样带来的好处是:兼 容性和灵活性。库可以采用-mfloat-abi=soft编译,而关键的应用程序可以采用-mfloat-abi=softfp来编译。特别是在库由第 三方发布的情况下。

         -mfloat-abi=hard生成的代码采用硬浮点(FPU)调用接口。这样要求所有库和应用程序必须采用这同一个参数来编译,否则连接时会出现接口不兼容错误。

  

  

  -mfpu=vfp

  -mfpu=fpa

  ...

前面已经讲述了,-mfpu参数就是用来指定要产生哪种硬浮点指令。常见的有vfp,fpa等。



4、编译器使用时要注意的地方:

  a.确认编译器默认是使用哪种参数来处理浮点操作的。写一个简单的浮点数程序:

  #include

int main(void)

{

    double d1 = 10.3;

    double d2 = 2.0;

    

    double dret = d1/d2;

    dret++;

    

    printf("result :%f",dret);

    

    return 0;

}

     

然后使用

      arm-linux-gcc -c main.c -o main.o

    再使用

      arm-linux-objdump -d main.o

     然后观察产生的指令,从而确定默认使用的是软浮点还是硬浮点。(确认的过程,看个人。晃一眼,里面如果有不熟悉指令,那可能就是硬浮点指令了)


  b.确认编译器所带的库使用哪种参数来编译的。

  c.确认所使用的芯片是否支持硬浮点,如果支持,是哪种类型的浮点指令。如果1,2与使用的芯片相冲突,这时就要考虑另寻编译器了。


这三点确认以后,我们在写自己的应用程序时,就会知道该怎样使用这些参数了。



5、Linux相关问题:


这里涉及两个问题:


问题1:使用的ARM芯片不支持硬浮点

   在配置ARM Linux内核时,应该都会看到这样的配置:

    menu "Floating point emulation"

    comment "At least one emulation must be selected"

    config FPE_NWFPE

        ...

这个是用来配置在内核里面模拟浮点处理器。


这个配置有什么作用呢?估计很少有人能够知道。其实它是这样的:

当使用的ARM芯片不支持硬浮点,而又采用了-mfpu=fpa -mfloat-abi=softfp/hard来编译应用程序。现在应该知道,采用这样的参数是要参数fpa硬浮点指令。但是使用的ARM芯片不支持硬 浮点,这时这个配置就其作用了。因为使用了fpa硬浮点指令,但使用的ARM芯片不支持硬浮点,这样当程序运行到fpa硬浮点指令,会出现指令异常,便会 陷入到内核里,这时这个模拟浮点处理器就来模拟这些浮点指令。现在应该清楚了,其作用了吧。但是现在有了更好的办法,前面已经讲过了,采用 -mfloat-abi=soft参数来编译应用程序,这样效率会快得多。想想从用户态切换到内核态,以及由此产生的cache和TLB表的损失。所以可 以考虑将这个配置抛弃了。


问题2:使用的ARM芯片支持硬浮点


一般ARM芯片支持硬浮点,都是采用协处理器方式的。与ARM内核本身一样,协处理器也有自己的寄存器。这样当多个进程同时涉及浮点运算时,会怎样?所以Linux内核为了支持硬浮点,也要做一些工作的。

内核配置:

   config VFP

    bool "VFP-format floating point maths"

    depends on CPU_V6 || CPU_ARM926T || CPU_V7 || CPU_FEROCEON


如果使用的ARM芯片支持硬浮点,同时在应用程序里面使用了硬浮点,那么内核可能需要做一些工作。。上面这个配置是针对vfp硬浮点处理器的;如果是其他 硬浮点处理,需要参考相关的资料,来确认要做哪些功能。如果可以确保所有时候,可以确保只有一个进程使用硬浮点处理器,那可以不需要考虑对硬浮点相关寄存 器的保存和切换,问题是可以确认吗?


对于浮点运算,针对ARM芯片应该尽量避免。如果无法避免,那就需要综合考虑到底使用哪种方式?如何去操作?性能如何?都需要考虑,去实验测试是最好的。


关键字:ARM  GCC浮点 引用地址:ARM GCC浮点相关总结

上一篇:软浮点 技术使用--GCC
下一篇:学习4412开发板烧写Ubuntu系统

推荐阅读

集微网消息,10月23-26日,一年一度的安博会在北京举办。作为两年一届的全球最权威、最具影响力的安防展会之一,是社会公共安全产品与技术交流的盛会。本届安博会继续秉承“普及安防知识、展示先进技术、引领行业发展、服务公安实战”的理念,以“构建平安中国、服务一带一路、创新智能安防”为主题,集产品展示、行业论坛、技术交流、科技普及等活动于一...
自制AVR控制1W变频器上次是直流伺服,这次来个交流的。主控是ATMEGA8A自制三相桥,电机是光驱的主轴电机,原来是无刷电机,相当一个三相永磁同步电机,四级驱动采用SPWM脉宽调制 ,转速范围120-6000转/分实测频率0.5-27赫兹。定时器T1负责频率调节,每个正弦波分36份每份25片脉宽调整率25级,每级4%。共900片。一个启动按钮,一个停止按钮,速度设定由模拟量端口设定
一加本月发布了一加8T,这是一加下半年发布的唯一旗舰。  除了旗舰产品线,一加Nord即将迎来新成员。  近日,据外媒报道,一加可能会在10月26日发布一加Nord N10,现在有关该机的细节被曝光。  如图所示,一加Nord N10采用了与一加8T相似的矩阵相机造型,摄像头数量为四颗。  规格方面,一加Nord N10像是一加8T的“青春版”,配置降...
上个月,realme在中国市场推出了搭载骁龙870芯片的realme GT Neo2。现在,该公司已经确认将于10月19日下午2点发布realme GT Neo2T。realme分享的GT Neo2T海报展示了它的零售包装,但该公司尚未分享这款智能手机的关键功能。根据之前的爆料,realme GT Neo2T拥有6.43英寸AMOLED屏幕,可提供全高清+分辨率。它可能支持120 Hz的刷新率。屏幕打孔装有1...

史海拾趣

问答坊 | AI 解惑

AT指令

谁有关于network的AT指令?…

查看全部问答∨

给分!进来说说程序的实际应用吧!

   虽然学习计算机已经两年了,但是不能十分清楚它是干嘛用的!因为一直都在编写书上的题目,实际的软件还没有开发过,而生活上用的软件也不了解是用哪种语言编写的!(恕我知识狭窄吧!)    如今,我想加入一个计算机协会, ...…

查看全部问答∨

wince中断流驱动的问题

我参照教程上编写的流驱动,采用外部中断,显示挂载成功,但是XXX_int()好像没有执行,我在该函数入口处输出了打印信息,结果没有显示,另外我感觉 DWORD PBT_IntrThread(PVOID pArg) {           DWORD ret; &n ...…

查看全部问答∨

求教如何将下面的结构体转换成unsigned int型数组?

希望将    typedef struct       {             int XH;             char YHM[8];         &nbs ...…

查看全部问答∨

请教 如何生成big5的codepage表。

现有的cp950.tbl里面却省某些字。希望重新建立一个tbl. 有没有相关的软件呢。google了很久没有找到合适的。谢谢…

查看全部问答∨

硅光电池

我想过能硅光电池对火焰进行检测,,也就是想用硅光电池将火焰的光信号转换成电信号 可是我现在的问题是对硅光电池的选型?我应该选择什么型号的硅光电池》? 还有硅光电池怎么连接AD转换器呀???…

查看全部问答∨

角度传感器的驱动程序怎么写

有一个平衡跷跷板,把一个可自动移动的物体放在跷跷板上。把角度传感器放在这个物体上。在这个物体移动的过程中用角度传感器测量跷跷板倾斜的角度。我们使用的MCU是飞思卡尔公司提供的MC9S12DG128B型芯片。这样的驱动程序应该怎么写呀? 谢谢!…

查看全部问答∨

毕业论文急需资料

谁买了lm3s6432的开发板啊?能发点资料给偶不?要写毕业论文啊  都不知道怎么写  先谢谢各位了啊  …

查看全部问答∨

ADC10序列通道单次转换又读不到数据

最近在学430,但是总遇到这样那样的问题,还请各位多多指点啊~~#include \"msp430x21x2.h\" void Delay(unsigned short time);unsigned  int ad_value[3]; void main(){     WDTCTL = WDTPW + WDTHOLD;   ...…

查看全部问答∨

招聘资深应用工程师-上海

猎头公司为某外资企业招聘招聘资深应用工程师(工作地点:上海) 职责: 售前售后技术支持。 技术培训等。 要求: 熟悉通信、电子、安防等行业; 熟悉嵌入式系统开发、FPGA、HDL编码和验证、DSP数字信号处理、通讯算法等相关知识。 如果有兴 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved