ARM体系与交叉编译

想要了解嵌入式开发,那么了解ARM的架构体系肯定是必不可少的。这篇文章主要就是介绍一些ARM的基本知识以及一些交叉编译的知识。

  1. ARM 公司是一家以卖知识产权为生的公司,主要是设计各种CPU内核,又称IP核(知识产权核)及其周边的开发工具,将其授权卖给芯片制造商。芯片制造产商为IP核设计外围电路然后形成自己的产品。
  2. ARM、X86/Atom、MIPS、PowerPC。
  • ARM使用RISC,主打低功耗。
  • X86由Intel开发制造的。80x86(80386/80686)采用CISC,可变指令长度。Intel Atom,中文名凌动,是一个超低电压系列。
  • MIPS采用RISC,有MIPS32和MIPS64架构标准,中科院计算研究所的龙芯中央处理器获得了所有的授权。
  • PowerPC采用RISC,貌似多用在IBM的服务器上。
  1. 32bit、64bit。在ARMv8架构中使用了64位CPU,这使得可寻址空间不再局限于4GB,最新的A72以及之前的A53、A57都使用了该架构。而A35、A17(A12)、A15通过Physical Address Extensions技术将最大内存寻址从4GB扩充至1TB,暂缓了内存上限问题,但仍然是32bit CPU。还有之前的A5、A7、A8、A9(区别参考这里)等都是32位内核并且都是使用的ARMv7架构。
  2. RISC与CISC。
  • 说到这个指令集得先说以前的程序员,以前的程序员都是神啊,那是编译器还不成熟,只能用机器码来给cpu下达指令。所以为了节省时间机智的程序员就会用一条二进制指令来做一系列事情,比如用一条011001来对一个数加1减2再加1。但是这样就会发现里面重复了加1这个操作,并且随着需求的增加就会有更多的指令出来(比如01110101对一个数加1减3加1加1),里面的重复度就更大。所以机智的程序员发现加1占据了绝大多数的操作,而减2和减3占据少数的操作,所以就把这三个小指令分离出来变成001加1,010减2,011减3。这个时候精简指令集就出现了,可以看到精简的指令长度固定便于CPU解码并且能减少CPU核在芯片上占用的面积从而留给外设,但是原来短的指令就变长了所以占用的flash会变多也会延长指令读取的时间。但是事实证明这样的指令集对于能耗敏感的嵌入式是很有利的,我们不能说谁就一定好,只能说对于某一场合的应用某个会适合一些。
  • 我们可以把指令集看成是积木。我们的目的就是建造一栋房子,对于CISC,就像是一包含有门、窗、墙的积木,而RISC就是一包含有正方块、长方块、圆块的积木。同样要堆出一栋房子,CISC的说明书可能只要一页,而RISC的说明书要10页,但是我们的CISC各种部件眼花缭乱,而RISC只有三四种部件。
  1. 架构、内核、处理器。架构师指从ARMv1到ARMv8的8代架构。内核是指在某一架构下设计出来的CPU,比如cortex-M3,cortex-A7、ARM7等等区别参考这里。而处理器是使用ARM设计的CPU加上自己的GPU(Nvidia的GPU),或使用ARM的GPU Mali,加上外设电路,得到的一个芯片,比如全志的A20。
  2. armel和armhf,参考这里
  • 出于低功耗、封装限制等种种原因,之前的一些ARM架构处理器因为内部资源宝贵,加入浮点运算单元是十分奢侈的,因为需要额外的软件实现。随着技术发展,目前高端的ARM处理器已经具备了硬件执行浮点操作的能力。这样新旧两种架构之间的差异,就产生了两个不同的嵌入式应用程序二进制接口(EABI)——软浮点与矢量浮点(VFP)。但是软浮点(soft float)和硬浮点(hard float)之间有向前兼容却没有向后兼容的能力,也就是软浮点的二进制接口(EABI)仍然可以用于当前的高端ARM处理器。

  • 在ARM体系架构内核中,有些有浮点运算单元(fpu),有些没有。对于没有fpu内核,是不能使用armel和armhf的。在有fpu的情况下,就可以通过gcc的选项-mfloat-abi来指定使用哪种,有如下三种值:

    • soft:不用​fpu计算,即使有fpu浮点运算单元也不用。
    • armel:也即softfp,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
    • armhf:也即hard,用fpu计算,传参数用fpu中的浮点寄存器传,省去了转换性能最好,但是中断负荷高。

    kernel、rootfs和app编译的时候,指定的必须保持一致才行。

  1. 哈佛/冯诺依曼(普林斯顿)。简单来说俩个的区别就是有没有把数据寻址和指令寻址分离开来。具体参考这里
  2. 交叉编译(参考)。交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。
  • 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]
    • arch – 体系架构,如ARM,MIPS
    • vendor – 工具链提供商
    • os – 目标操作系统
    • eabi – 嵌入式应用二进制接口(Embedded Application Binary Interface)
  • 根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如
    • arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。他使用的是newlib这个专用于嵌入式系统的C库。
    • arm-none-linux-eabi:用于Linux的,使用Glibc
  • ABI 和 EABI
    • ABI:二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。
    • EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)。
  • arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc 两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构
T B
站点访问量: / , 本页阅读量:
T B