历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-24 来源:eefocus

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芯片应该尽量避免。如果无法避免,那就需要综合考虑到底使用哪种方式?如何去操作?性能如何?都需要考虑,去实验测试是最好的。


推荐阅读

史海拾趣

Gumstix公司的发展小趣事
检查电路连接是否松动或断裂,重新连接或更换损坏的部件。
Axiomtek公司的发展小趣事
检查电路连接是否松动或断裂,重新连接或更换损坏的部件。
Abracon公司的发展小趣事
检查电路连接是否松动或断裂,重新连接或更换损坏的部件。
ETRI公司的发展小趣事

在光通信技术领域,ETRI也取得了显著成果。他们与Eldis公司合作,成功将一种电吸收调制光源(EML)商业化。这种光源能够在30公里内每秒传输250亿比特,且在高温和室温下都能稳定工作。这一技术的成功商业化,对于提高数据传输速度和效率具有重要意义。

CoolerMaster公司的发展小趣事

随着业务的不断发展,Cooler Master逐渐将触角延伸至全球。集团总部位于中国台北,同时在大陆设立了制造基地,并在北美、欧洲、东亚及北京、上海等地设有办事处或研发中心。这种全球化的布局使得Cooler Master能够更好地了解各地市场的需求,进而提供更加精准的产品和服务。此外,公司还与多家全球500强品牌合作,为其提供散热解决方案,进一步巩固了其在全球散热领域的领导地位。

Advanced Thermal Solutions公司的发展小趣事

ATS始终坚持以创新为驱动力,不断提升研发创新能力。公司设立了专门的研发团队,负责新技术和新产品的研发工作。通过与高校和研究机构的合作,ATS不断引入前沿的科技成果和人才资源,为公司的创新发展提供了有力支持。此外,ATS还建立了完善的研发流程和质量控制体系,确保每一款产品都能达到最高的性能和质量标准。

问答坊 | AI 解惑

[转帖]应聘数字电路笔试习题

1、同步电路和异步电路的区别是什么?(仕兰微电子) 2、什么是同步逻辑和异步逻辑?(汉王笔试) 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 電路設計可分類為同步電路和非同步電路設計。同步電路利用時鐘 ...…

查看全部问答>

请教关于串口程序调试

请问没有ARM硬件平台的条件下,可以在pc机上只通过SDK编译调试串口程序,实现和另一台pc的串口数据收发么? 环境:pc机1+vs2005,WinCE6.0,  pc机2+通用串口精灵 注:我在WinCE中映射了串口,但是运行程序时提示无法打开串口,请问可 ...…

查看全部问答>

本人想实现wince6.0 + usb + 手机 上网

如标题所述,本人想通过usb链接手机的方式实现wince上网,在这里请教各位大侠,大家可以给我提供资料或者建议,小弟在这不胜感激!…

查看全部问答>

求助:背景图片挡住了文字

大家好,我使用函数ExtTextOut 输出文字,但是由于我的程序有一个全屏的背景图,所以加载图片后文字被遮挡住了。 我大概知道可能是透明、背景色之类的问题,但是改了参数效果依然不对,麻烦大家给指点下,最好能有个例子详细些,多谢啦…

查看全部问答>

MPLAB ICD2無法工作,請教

我用MPLAB V7.52 連接ICD2時,報錯,錯誤代碼是 Connecting to MPLAB ICD 2 ...Connected ICD0133: Firmware does not support command (0x7). ICD0082: Failed MPLAB ICD 2 operation MPLAB ICD 2 Ready 請問該怎麼弄,上一次用還是好好的呀 ...…

查看全部问答>

嵌入式的必备知识,请给个方向!

嵌入式需要软件和硬件方面的知识,软件方面有操作系统,硬件方面有微型计算机原理方面的。还需要掌握一些什么,望大家给出一个方向,以后准备朝这个方向发展。谢谢了!!…

查看全部问答>

PC机通过9针RS232给单片机数据

PC机通过9针RS232给单片机数据,单片机由串口中断获取数据并执行判断      为了方便调试,在p0/p2口接了灯。         可是实际在板上调试时,不论在PC端发任何数据,发现该LED一直不变。偶 ...…

查看全部问答>

你有遇到程序在ram里时跑的正常,用flash下载后就不正常了!

你有遇到程序在ram里时跑的正常,用flash下载后就不正常了! 大家过来晒晒会出现什么症状?…

查看全部问答>

低功率纳米技术及其它敏感器件的交流与直流测量方法的比较——大电阻的测量1

目前,大于10 kΩ的被测电阻是对电流噪声和输入负载误差[1]方面的挑战。因电压噪声与测试对象的电阻成比例,电流噪声就会非常明显。在锁定放大器法和直流反转系统中,电流噪声来自于测量电路,在流经测试对象和/或引线电阻时会产生额外的直流和交 ...…

查看全部问答>

要从从AVR 转向msp430了

我大一的时候开始学习AVR单片机,现在也差不多快两年了,上次团购msp430 launchpad,开始学习msp430,从eeworld论坛搜索资料,从编译器的安装到自己第一个自己的流水灯程序,以前就想买一块msp430的板子, 后来买了一块空的PCB板,从TI公司申请的43 ...…

查看全部问答>