a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 50|回复: 0

[综合辅导] Linux认证综合辅导:关于ARM上的浮点运算

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证综合辅导:关于ARM上的浮点运算
9 c" C/ U; T3 K8 {9 x) o2 WARM上的浮点运算0 |% a/ b! C. x8 W. Q
这篇文章对最近遇到上的 arm上浮点运算的问题做一个总结。, y  c' F8 }6 \$ E# Y0 g
首先,我们先看一下arm处理器是如何处理浮点运算的。6 `' ?; H% A& q" n7 s" |  A; @
交叉编译器在编译的时候,对于浮点运行会预 设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制。也就是说如果有浮点协处理器则交给它去做,如果没有则会产生一个陷阱(trap,处理器响应异常的机制), 而我们事先准备好针对浮点指令的陷阱处理程序就可以通过软件来模拟浮点运算指令。& N) Q( Q/ x' W6 w
然后,我们 解释一下OABI和EABI这两个概念。, U$ s1 h0 A5 X  Z: b% q/ ?' O
/********************************************************************************************/以下部分转 载至 linux.chinaunix.net/bbs/thread-1143604-1-1.html“》http://linux.chinaunix.net/bbs/thread-1143604-1-1.html 。 1.什么是ABI ABI,application binary interface (ABI),应用程序二进制接口。
) ^. E" r' Y/ y+ }- I4 A+ U既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:A.应用程序 《-》 操作系统;B.应用程序 《-》 (应用程序所用到的)库C 。应用程序各个组件之间
  ?  ]! A$ S1 u/ |+ p, W类似于API的作用 是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。
' R" p9 Z: N% g8 {) a7 e- }; T2.什么是OABI 和 EABI OABI中的O,表示 “Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI. EABI中的E,表示“Embedded”,是一种新的ABI. EABI 有时候也叫做GNU EABI. OABI和EABI都是专门针对arm的CPU来说的。- o% T1 {3 S  k- ~  K
3.EABI的好处 / 为何要用EABI A.支持软件浮点和硬件实现浮点功 能混用B.系统调用的效率更高C.后今后的工具更兼容D.软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。
5 E* Y& x! D2 Q4.OABI和EABI的区别两种ABI在如下方面有区别:A.调用规则(包括参数如何传递及如何获得返回 值)
6 F9 c* O  x, y0 W# u' {B.系统调用的数目以及应用程序应该如何去做系统调用C.目标文件的二进制格式,程序库等D.结构体中的 填充(padding/packing)和对齐。
, w: s$ ~1 s9 z8 gE. OABI:* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa * gcc -dumpmachine: arm-unknown-linux * objdump -x for compiled binary:
/ t. h3 N  d2 f: mprivate flags = 2: [APCS-32] [FPA float format] [has entry point] * ”file“ on compiled Debian binary:ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped * ”readelf -h | grep Flags“” Flags: 0x0 EABI:* ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4 * gcc -dumpmachine: arm-unknown-linux-gnueabi * objdump -x for compiled binary:private flags = 4000002: [Version4 EABI] [has entry point] * “file” on compiled binary (under Debian):ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped * “readelf -h | grep Flags”“ Flags: 0x4000002, has entry point, Version4 EABI /********************************************************************************************/在虚拟机 中,运行:arm_v5t_le-gcc -dumpmachine,输出:armv5tl-montavista-linuxeabi;运行 arm_v5t_le-readelf -h EXEC | grep Flags,(注:EXEC代表用交叉编译工具编译的可执行文件名),输出: Flags: 0x4000002, has entry point, Version4 EABI.上述结果说 明当前使用的montavista的编译器是符合EABI标准的。
+ U% H5 H( K2 ?4 p" N4 [2 v0 A使用EABI(Embedded Application Binary Interface)则可以对此改善处理,arm EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。6 D. n4 o: b# S; X& o# ~
看到这里,之前遇到的一个问题终于弄明白 了。之前在Makefile中一直包含一个-mabi=apcs-gnu的参数,而apcs-gnu是OABI的参数,因此将OABI的参数传给符合 EABI标准的编译,编译阶段没有报错,但在板上运行时,程序中涉及到浮点数的部分出现了许多莫名的问题。比如printf(”%s %f“,s,f);这句话输出的浮点数值并不是传给printf的参数,而是一个莫名其妙的数字。解决办法:在Makefile中将 “-mabi=apcs-gnu”去掉,重新编译运行,成功!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 02:56 , Processed in 0.235311 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表