ARM-LINUX交叉编译环境

2017-09-09  本文已影响0人  myth_0c21

由于需要在arm上进行应用的开发,需要搭建arm的编译环境。环境的搭建有两种方式:

其中交叉编译环境包括以下几种:

由于Linux环境搭建起来较为方便,推荐使用Linux环境进行开发。Visual Studio开发起来比较方便,IDE做的比较好,但是还是选择Linux + Makefile的方式更加方便。

Linux环境的搭建

所谓的环境搭建,就是安装一系列编译与debug的工具,这里安装的工具是am-linux-gcc。

sudo apt-get install gcc-arm-linux-gnueabihf  
sudo apt-get install g++-arm-linux-gnueabihf  
sudo apt-get remove gcc-arm-linux-gnueabihf
sudo apt-get remove g++-arm-linux-gnueabihf  

工具包名字解释

gcc是面向于x86-64的编译工具,可以编译SSE,AVX等指令集。面向的硬件是桌面级的CPU.而gcc-arm-linux是运行与桌面级的CPU上的软件,生成的可执行文件是运行在arm的文件。

什么是abi和eabi

一个完整的ABI,像Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。
ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。

EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM.

gnueabi相关的两个交叉编译器: gnueabi和gnueabihf

在debian源里这两个交叉编译器的定义如下:

可见这两个交叉编译器适用于armel和armhf两个不同的架构, armel和armhf这两种架构在对待浮点运算采取了不同的策略(有fpu的arm才能支持这两种浮点运算策略)

其实这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同. gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):

硬浮点Hard-float

编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。
使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。

软浮点 Soft-float

编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。
现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。

armel ABI和armhf ABI

在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。

需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。

  • 默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。
    而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。
  • 在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20%——25%的性能提升。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升。
上一篇 下一篇

猜你喜欢

热点阅读