因为须要在arm上进行应用的开发,须要搭建arm的编译环境。环境的搭建有两种形式:
其中交叉编译环境包括以下几种:
因为Linux环境搭建上去较为便捷,推荐使用Linux环境进行开发。VisualStudio开发上去比较便捷,IDE做的比较好linux系统官网,而且还是选择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)linux交叉编译环境,准许支持它的操作系统上的程序不经更改在其他支持此ABI的操作体统上运行。
ABI不同于应用程序插口(API),API定义了源代码和库之间的插口,因而同样的代码可以在支持这个API的任何系统中编译,ABI容许编译好的目标代码在使用兼容ABI的系统中无需改动才能运行。
EABI与关于通用计算机的ABI的主要区别是应用程序代码中容许使用特权指令,不须要动态链接(有时是严禁的),和更紧凑的堆栈帧组织拿来节约显存。广泛使用EABI的有PowerPC和ARM.
gnueabi相关的两个交叉编译器:gnueabi和gnueabihf
在debian源里这两个交叉编译器的定义如下:
可见这两个交叉编译器适用于armel和armhf两个不同的构架,armel和armhf这两种构架在对待浮点运算采取了不同的策略(有fpu的arm能够支持这两种浮点运算策略)
虽然这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同.gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后二者都要求arm里有fpu浮点运算单元,soft与后二者是兼容的linux交叉编译环境,但softfp和hard两种模式互不兼容):
硬浮点Hard-float
编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU一般有一套额外的寄存器来完成浮点参数传递和运算。
使用实际的硬件浮点运算单元FPU其实会带来性能的提高。由于常常一个浮点的函数调用须要几个或则几十个时钟周期。
软浮点Soft-float
编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或则堆栈完成。
现今的Linux系统默认编译选择使用hard-float,虽然系统没有任何浮点处理器单元,这都会形成非法指令和异常。因此通常的系统镜像都采用软浮点以兼容没有VFP的处理器。
armelABI和armhfABI
在armel中redhat linux,关于浮点数估算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。
须要注意的是,在兼容性上,soft与后二者是兼容的,但softfp和hard两种模式不兼容。