arm 订阅
英国ARM公司是全球领先的半导体知识产权(IP)提供商。全世界超过95%的智能手机和平板电脑都采用ARM架构 [1]  。ARM设计了大量高性价比、耗能低的RISC处理器、相关技术及软件。2014年基于ARM技术的全年全球出货量是120亿颗,从诞生到现在为止基于ARM技术的芯片有600亿颗 [2]  。技术具有性能高、成本低和能耗省的特点。在智能机、平板电脑、嵌入控制、多媒体数字等处理器领域拥有主导地位。2016年7月18日消息,日本软银已经同意以234亿英镑(约合310亿美元)的价格收购英国芯片设计公司ARM。软银认为,凭借这笔收购,ARM将让软银成为下一个潜力巨大的科技市场(即物联网)的领导者。这笔交易将在周一早晨宣布。软银和ARM暂时都未对此发表评论。 [3] 展开全文
英国ARM公司是全球领先的半导体知识产权(IP)提供商。全世界超过95%的智能手机和平板电脑都采用ARM架构 [1]  。ARM设计了大量高性价比、耗能低的RISC处理器、相关技术及软件。2014年基于ARM技术的全年全球出货量是120亿颗,从诞生到现在为止基于ARM技术的芯片有600亿颗 [2]  。技术具有性能高、成本低和能耗省的特点。在智能机、平板电脑、嵌入控制、多媒体数字等处理器领域拥有主导地位。2016年7月18日消息,日本软银已经同意以234亿英镑(约合310亿美元)的价格收购英国芯片设计公司ARM。软银认为,凭借这笔收购,ARM将让软银成为下一个潜力巨大的科技市场(即物联网)的领导者。这笔交易将在周一早晨宣布。软银和ARM暂时都未对此发表评论。 [3]
信息
员工数
3300 (2014年)
CEO
沃伦·伊斯特
总部地点
英国剑桥
外文名称
Advanced RISC Machines
经营范围
电子半导体微处理器智能手机
公司名称
ARM
ARM企业简介
ARM Holdings 是全球领先的半导体知识产权(IP)提供商,并因此在数字电子产品的开发中处于核心地位。ARM 公司的总部位于英国剑桥,它拥有 1700 多名员工,在全球设立了多个办事处,其中包括比利时、法国、印度、瑞典和美国的设计中心。 [4] 
收起全文
精华内容
下载资源
问答
  • arm

    千次阅读 2011-02-25 21:37:00
    ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类...

    ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。

    ARM公司

    ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。

     

      ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的

    ARM公司(6张)

    都是一套独一无二的ARM相关技术及服务。利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者

     

      目前,总共有30家半导体公司与ARM签订了硬件技术使用许可协议,其中包括IntelIBM、LG半导体、NECSONY飞利浦和国民半导体这样的大公司。至于软件系统的合伙人,则包括微软、升阳和MRI等一系列知名公司。

     

      1991 年 ARM 公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用 ARM技术知识产权( IP )核的微处理器,即我们通常所说的 ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器 75 %以上的市场份额, ARM 技术正在逐步渗入到我们生活的各个方面。

     

      20世纪90年代,ARM公司的业绩平平,处理器的出货量徘徊不前。由于缺乏资金,ARM做出了一个意义深远的决定:自己不制造芯片,只将芯片的设计方案授权(licensing)给其他公司,由它们来生产。正是这个模式,最终使得ARM芯片遍地开花,将封闭设计的Intel公司置于"人民战争"的汪洋大海。

     

      。但是进入21世纪之后,由于手机的快速发展,出货量呈现爆炸式增长,ARM处理器占领了全球手机市场。2006年,全球ARM芯片出货量为20亿片,2010年预计将达到45亿片。

     

      ARM 公司是专门从事基于 RISC 技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的 ARM 微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的 ARM 微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用 ARM 公司的授权,因此既使得 ARM 技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。

     

      ARM商品模式的强大之处在于它在世界范围有超过100个的合作伙伴(Partners)。ARM 是设计公司,本身不生产芯片。采用转让许可证制度,由合作伙伴生产芯片。

     

      2007年底,ARM的雇员总数为1728人,持有专利700项(另有900项正在申请批准中),全球分支机构31家,合作伙伴200家,年收入2.6亿英镑。

    ARM 授权方

      ARM 公司本身并不靠自有的设计来制造或出售 CPU ,而是将处理器架构授权给有兴趣的厂家。ARM 提供了多样的授权条款,包括售价与散播性等项目。对于授权方来说,ARM 提供了 ARM 内核的整合硬件叙述,包含完整的软件开发工具(编译器、debugger、SDK),以及针对内含 ARM CPU 硅芯片的销售权。对于无晶圆厂的授权方来说,其希望能将 ARM 内核整合到他们自行研发的芯片设计中,,通常就仅针对取得一份生产就绪的智财核心技术(IP Core)认证。对这些客户来说,ARM 会释出所选的 ARM 核心的闸极电路图,连同抽象模拟模型和测试程式,以协助设计整合和验证。需求更多的客户,包括整合元件制造商(IDM)和晶圆厂家,就选择可合成的RTL(暂存器转移层级,如 Verilog)形式来取得处理器的智财权(IP)。藉著可整合的 RTL,客户就有能力能进行架构上的最佳化与加强。这个方式能让设计者完成额外的设计目标(如高震荡频率、低能量耗损、指令集延伸等)而不会受限于无法更动的电路图。虽然 ARM 并不授予受权方再次出售 ARM 架构本身,但受权方可以任意地出售制品(如芯片元件、评估板、完整系统等)。商用晶圆厂是特殊例子,因为他们不仅授予能出售包含 ARM 内核的硅晶成品,对其它客户来讲,他们通常也保留重制 ARM 内核的权利。

     

      就像大多数 IP 出售方,ARM 依照使用价值来决定 IP 的售价。在架构上而言,更低效能的 ARM 内核比更高效能的内核拥有较低的授权费。以硅芯片实作而言,一颗可整合的内核要比一颗硬件宏(黑箱)内核要来得贵。更复杂的价位问题来讲,持有 ARM 授权的商用晶圆厂(例如韩国三星和日本富士通)可以提供更低的授权价格给他们的晶圆厂客户。透过晶圆厂自有的设计技术,客户可以更低或是免费的ARM预付授权费来取得 ARM 内核。相较于不具备自有设计技术的专门半导体晶圆厂(如台积电联电),富士通/三星对每片晶圆多收取了两至三倍的费用。对中少量的应用而言,具备设计部门的晶圆厂提供较低的整体价格(透过授权费用的补助)。对于量产而言,由于长期的成本缩减可借由更低的晶圆价格,减少ARM的NRE成本,使得专门的晶圆厂也成了一个更好的选择。

     

      许多半导体公司持有 ARM 授权:AtmelBroadcomCirrus LogicFreescale(于2004从摩托罗拉公司独立出来)、富士通、英特尔(借由和Digital的控诉调停)、IBM,英飞凌科技任天堂,恩智浦半导体(于2006年从飞利浦独立出来)、OKI电气工业,三星电子Sharp,STMicroelectronics,德州仪器VLSI等许多这些公司均拥有各个不同形式的ARM授权。虽然ARM的授权项目由保密合约所涵盖,在智慧财产权工业,ARM是广为人知最昂贵的CPU内核之一。单一的客户产品包含一个基本的 ARM 内核可能就需索取一次高达美金20万的授权费用。而若是牵涉到大量架构上修改,则费用就可能超过千万美元。

     

      ARM(Asynchronous Resbonse Mode)异步响应方式异步响应方式ARM(Asynchronous Responses Mode)也是一种非平衡数据链路操作方式,与NRM不同的是,ARM下的传输过程由从站启动。从站主动发送给主站的一个或一组帧中可包含有信息,也可以是仅以控制为目的而发的帧。在这种操作方式下,由从站来控制超时和重发。该方式对采用轮询方式的多站链路来说是必不可少的。

    ARM处理器

    ARM(Advanced RISC Machines)处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器。更早称作Acorn RISC Machine)。   ARM处理器本身是32位设计,但也配备16位指令集。一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。   ARM的Jazelle技术使Java加速得到比基于软件的Java虚拟机(JVM)高得多的性能,和同等的非Java加速核相比功耗降低80%。CPU功能上增加DSP指令集提供增强的16位和32位算术运算能力,提高了性能和灵活性。ARM还提供两个前沿特性来辅助带深嵌入处理器的高集成SoC器件的调试,它们是嵌入式ICE-RT逻辑和嵌入式跟踪宏核(ETMS)系列。

    体系结构扩充

      当前ARM体系结构的扩充包括:   ·Thumb 16位指令集,为了改善代码密度;   ·DSP DSP应用的算术运算指令集;   ·Jazeller 允许直接执行Java字节码。   ARM处理器系列提供的解决方案有:   ·无线、消费类电子和图像应用的开放平台;   ·存储、自动化、工业和网络应用的嵌入式实时系统;   ·智能卡和SIM卡的安全应用。

    ARM处理器特点

      ARM处理器的三大特点是:耗电少功能强、16位/32位双指令集和合作伙伴众多。   1、体积小、低功耗、低成本、高性能;   2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;   3、大量使用寄存器,指令执行速度更快;   4、大多数数据操作都在寄存器中完成;   5、寻址方式灵活简单,执行效率高;   6、指令长度固定。

    ARM处理器的历史

      1978年12月5日,物理学家赫尔曼·豪泽(Hermann Hauser)和工程师Chris Curry,在英国剑桥创办了CPU公司(Cambridge Processing Unit),主要业务是为当地市场供应电子设备。1979年,CPU公司改名为Acorn计算机公司。   起初,Acorn公司打算使用摩托罗拉公司的16位芯片,但是发现这种芯片太慢也太贵。"一台售价500英镑的机器,不可能使用价格100英镑的CPU!"他们转而向Intel公司索要80286芯片的设计资料,但是遭到拒绝,于是被迫自行研发。   1985年,Roger Wilson和Steve Furber设计了他们自己的第一代32位、6M Hz的处理器,
      

    Roger Wilson和Steve Furber

    [1]
    用它做出了一台RISC指令集的计算机,简称ARM(Acorn RISC Machine)。这就是ARM这个名字的由来。   RISC的全称是"精简指令集计算机"(reduced instruction set computer),它支持的指令比较简单,所以功耗小、价格便宜,特别合适移动设备。早期使用ARM芯片的典型设备,就是苹果公司的牛顿PDA。   20世纪80年代后期,ARM很快开发成Acorn的台式机产品,形成英国的计算机教育基础。   1990年11月27日,Acorn公司正式改组为ARM计算机公司。苹果公司出资150万英镑,芯片厂商VLSI出资25万英镑,Acorn本身则以150万英镑的知识产权和12名工程师入股。公司的办公地点非常简陋,就是一个谷仓。 20世纪90年代,ARM 32位嵌入式RISC(Reduced lnstruction Set Computer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权。

    市场前景

      微软公司(2011年)宣布,下一版Windows将正式支持ARM处理器。这是计算机工业 发展历史上的一件大事,标识着x86处理器的主导地位发生动摇。目前在移动设备市场,ARM处理器的市场份额超过90%;在服务器市场,今年(2011年)就会有2.5GHz的服务器上市;在桌面电脑市场,现在又有了微软的支持。ARM成为主流,恐怕指日可待。难怪有人惊呼,Intel公司将被击败!   与这场轰轰烈烈的变革相比,它的主角ARM公司却没有受到太多的关注,显得不太起眼。这家远离硅谷、位于剑桥大学的英国公司,到底是怎么走到今天的,居然能将芯片巨人Intel拉下马?   展望未来,即使Intel成功地实施了Atom战略,将x86芯片的功耗和价格大大降低,它与ARM竞争也将非常吃力。因为ARM的商业模式是开放的,任何厂商都可以购买授权,所以未来并不是Intel vs. ARM,而是Intel vs. 世界上所有其他半导体公司。那样的话,Intel的胜算能有多少呢?

    ARM处理器结构

      体系结构   1 CISC(Complex Instruction Set Computer,复杂指令集计算机)   在CISC指令集的各种指令中,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%。   2 RISC(Reduced Instruction Set Computer,精简指令集计算机)   RISC结构优先选取使用频最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻地方式种类减少;以控制逻辑为主,不用或少用微码控制等   RISC体系结构应具有如下特点:   1 采用固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种。   2 使用单周期指令,便于流水线操作执行。   3 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/ 存储指令可以访问存储器,以提高指令的执行效率。   除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗:   4 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。   5 可用加载/存储指令批量传输数据,以提高数据的传输效率。   6 可在一条数据处理指令中同时完成逻辑处理和移位处理。   7 在循环处理中使用地址的自动增减来提高运行效率。   寄存器结构   ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括:   1 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。   2 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。   指令结构   ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的   ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。

    使用ARM处理器的手机

    欧洲诺基亚

      诺基亚 N86 诺基亚 N97 诺基亚 N8 诺基亚 N96 诺基亚 N95 诺基亚 N78 诺基亚 N900 诺基亚 N81 诺基亚 N85 诺基亚 X6 诺基亚 E72 诺基亚 E71 诺基亚 E66 诺基亚 E63 诺基亚 E52 诺基亚 E51 诺基亚 E50 诺基亚 5530XM 诺基亚 5800XM 诺基亚 5320XM 诺基亚 5630XM 诺基亚 5730XM 诺基亚 5230等

    美国摩托罗拉

      摩托罗拉 XT711 摩托罗拉 XT800 摩托罗拉 XT702 摩托罗拉 XT701 摩托罗拉 ME600 摩托罗拉 ME501 摩托罗拉ME500 摩托罗拉 Milestone 摩托罗拉 RAZR V8 摩托罗拉 VE66 摩托罗拉 A1200E 摩托罗拉 A1210 摩托罗拉 A1600 摩托罗拉 A1800 摩托罗拉 A1890 摩托罗拉 U9 摩托罗拉 A810 摩托罗拉 ROKR EM30 摩托罗拉 EM35 摩托罗拉 ROKR E6 摩托罗拉 ROKR E8

    英国索爱

      索爱 X1 索爱 X2 索爱 M1i 索爱 X10 索爱 Satio 索爱 U8i等

    韩国三星

      三星 i8910 三星 i8510等

    美国奔迈

      palm pre palm pixi palm pre plus

    ARM处理器系列

      ARM7系列 ARM9系列 ARM9E系列 ARM10E系列    SecurCore系列 Inter的Xscale Inter的StrongARM ARM11系列   其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。SecurCore系列专门为安全要求较高的应用而设计。   ARM内核
    家族 架构 内核 特色 高速缓存 (I/D)/MMU 常规 MIPS 于 MHz 应用
    ARM1 ARMv1 ARM1


    ARM2 ARMv2 ARM2 Architecture 2 加入了MUL(乘法)指令 4 MIPS @ 8MHz Acorn Archimedes,Chessmachine
    ARMv2a ARM250 Integrated (完整的)MEMC (MMU),图像与IO处理器。Architecture 2a 加入了SWP和SWPB(置换)指令。 无,MEMC1a 7 MIPS @ 12MHz Acorn Archimedes
    ARM3 ARMv2a ARM2a 首次在ARM架构上使用处理器高速缓存 均为4K 12 MIPS @ 25MHz Acorn Archimedes
    ARM6 ARMv3 ARM610 v3 架构首创支援寻址32位的内存(针对26位) 均为4K 28 MIPS @ 33MHz Acorn Risc PC 600,Apple Newton
    ARM7TDMI ARMv4T ARM7TDMI(-S) 三级流水线 15 MIPS @ 16.8 MHz Game Boy Advance,Nintendo DS,iPod


    ARM710T
    均为8KB, MMU 36 MIPS @ 40 MHz Acorn Risc PC 700,Psion 5 series,Apple eMate 300


    ARM720T
    均为8KB, MMU 60 MIPS @ 59.8 MHz Zipit


    ARM740T
    MPU


    ARMv5TEJ ARM7EJ-S Jazelle DBX

    ARM9TDMI ARMv4T ARM9TDMI 五级流水线



    ARM920T
    16KB/16KB, MMU 200 MIPS @ 180 MHz ArmadilloGP32GP2X(第一颗内核), Tapwave Zodiac(Motorola i. MX1)


    ARM922T
    8KB/8KB, MMU



    ARM940T
    4KB/4KB, MPU
    GP2X(第二颗内核)
    ARM9E ARMv5TE ARM946E-S
    可变动,tightly coupled memories, MPU
    Nintendo DS,Nokia N-GageConexant 802.11 chips


    ARM966E-S
    无高速缓存,TCMs
    ST Micro STR91xF,包含Ethernet [2]


    ARM968E-S
    无高速缓存,TCMs


    ARMv5TEJ ARM926EJ-S Jazelle DBX 可变动,TCMs, MMU 220 MIPS @ 200 MHz 移动电话:Sony Ericsson(K, W系列),Siemens 和 Benq(x65 系列和新版的)

    ARMv5TE ARM996HS 无振荡器处理器 无高速缓存,TCMs, MPU

    ARM10E ARMv5TE ARM1020E (VFP),六级流水线 32KB/32KB, MMU



    ARM1022E (VFP) 16KB/16KB, MMU


    ARMv5TEJ ARM1026EJ-S Jazelle DBX 可变动,MMU or MPU

    XScale ARMv5TE 80200/IOP310/IOP315 I/O处理器




    80219

    400/600MHz Thecus N2100


    IOP321

    600 BogoMips @ 600 MHz Iyonix


    IOP33x





    IOP34x 1-2核,RAID加速器 32K/32K L1, 512K L2, MMU



    PXA210/PXA250 应用处理器,七级流水线

    Zaurus SL-5600


    PXA255
    32KB/32KB, MMU 400 BogoMips @ 400 MHz Gumstix,Palm Tungsten E2


    PXA26x

    可达 400 MHz Palm Tungsten T3


    PXA27x

    800 MIPS @ 624 MHz HTC Universal, Zaurus SL-C1000,3000,3100,3200, Dell Axim x30, x50,和 x51 系列


    PXA800(E)F





    Monahans

    1000 MIPS @ 1.25 GHz


    PXA900


    Blackberry 8700, Blackberry Pearl (8100)


    IXC1100 Control Plane Processor




    IXP2400/IXP2800





    IXP2850





    IXP2325/IXP2350





    IXP42x


    NSLU2


    IXP460/IXP465



    ARM11 ARMv6 ARM1136J(F)-S SIMD, Jazelle DBX, (VFP),八级流水线 可变动,MMU ?? @ 532-665MHz (i.MX31 SoC) Nokia N93ZuneNokia N800
    ARMv6T2 ARM1156T2(F)-S SIMD, Thumb-2, (VFP),九级流水线 可变动,MPU

    ARMv6KZ ARM1176JZ(F)-S SIMD, Jazelle DBX, (VFP) 可变动,MMU+TrustZone

    ARMv6K ARM11 MPCore 1-4核对称多处理器,SIMD, Jazelle DBX, (VFP) 可变动,MMU

    Cortex ARMv7-A Cortex-A8 Application profile, VFP, NEON, Jazelle RCT, Thumb-2, 13-stage pipeline 可变动 (L1+L2), MMU+TrustZone up to 2000(2.0 DMIPS/MHz 从600 MHz到超过1 GHz的速度) Texas Instruments OMAP3

    ARMv7-R Cortex-R4(F) Embedded profile, (FPU) 可变动高速缓存,MMU可选配 600 DMIPS Broadcom is a user

    ARMv7-M Cortex-M3 Microcontroller profile 无高速缓存,(MPU) 120 DMIPS @ 100MHz Luminary Micro[3] 微控制器家族

    ARM内核的设计文件

      设计文件讲求精简又快速的设计方式,整体电路化却又不采用微码,就像早期使用在Acorn微电脑的8位6502处理器。   ARM架构包含了下述RISC特性:   读取/储存 架构不支援地址不对齐内存存取(ARMv6内核现已支援)正交指令集(任意存取指令可以任意的寻址方式存取数据Orthogonal instruction set)大量的16 × 32-bit 寄存器阵列(register file)固定的32 bits 操作码(opcode)长度,降低编码数量所产生的耗费,减轻解码和流水线化的负担。大多均为一个CPU周期执行。为了补强这种简单的设计方式,相较于同时期的处理器如Intel 80286和Motorola 68020,还多加了一些特殊设计:   大部分指令可以条件式地执行,降低在分支时产生的负重,弥补分支预测器(branch predictor)的不足。算数指令只会在要求时更改条件编码(condition code)32-bit筒型位移器(barrel shifter)可用来执行大部分的算数指令和寻址计算而不会损失效能强大的索引寻址模式(addressing mode)精简但快速的双优先级中断子系统,具有可切换的暂存器组有个附加在ARM设计中好玩的东西,就是使用一个4-bit 条件编码 在每个指令前头,表示每支指令的执行是否为有条件式的   这大大的减低了在内存存取指令时用到的编码位,换句话说,它避免在对小型叙述如if做分支指令。有个标准的范例引用欧几里德最大公因子算法:   在C编程语言中,循环为:   int gcd (int i, int j) { while (i != j) if (i > j) i -= j; else j -= i; return i;} 在ARM 汇编语言中,循环为:   loop CMP Ri, Rj ; 设定条件为 "NE"(不等於) if (i != j) ; "GT"(大於) if (i > j), ; or "LT"(小於) if (i < j) SUBGT Ri, Ri, Rj ; 若 "GT"(大於), i = i-j; SUBLT Rj, Rj, Ri ; 若 "LT"(小於), j = j-i; BNE loop ; 若 "NE"(不等於),则继续回圈这避开了then和else子句之间的分支。   另一项指令集的特色是,能将位移(shift)和回转(rotate)等功能并成"资料处理"型的指令(算数、逻辑、和暂存器之间的搬移),因此举例来说,一个C语言的叙述   a += (j << 2);在ARM之下,可简化成只需一个word和一个cycle即可完成的指令   ADD Ra, Ra, Rj, LSL #2这结果可让一般的ARM程式变得更加紧密,而不需经常使用内存存取,流水线也可以更有效地使用。即使在ARM以一般认定为慢速的速度下执行,与更复杂的CPU设计相比它仍能执行得不错。   ARM处理器还有一些在其他RISC的架构所不常见到的特色,例如PC-相对寻址(的确在ARM上PC为16个暂存器的其中一个)以及 前递加或后递加的寻址模式。   另外一些注意事项是 ARM 处理器会随着时间,不断地增加它的指令集。某些早期的 ARM 处理器(比ARM7TDMI更早),譬如可能并未具备指令可以读取两 Bytes 的数量,因此,严格来讲,对这些处理器产生程式码时,就不可能处理如 C 语言物件中使用 "volatile short" 的资料型态。   ARM7 和大多数较早的设计具备三阶段的流水线化(Pipeline):提取指令、解码,并执行。较高效能的设计,如 ARM9,则有五阶段的流水线化。提高效能的额外方式,包含一颗较快的加法器,和更广的分支预测逻辑线路。   这个架构使用“协处理器”提供一种非侵入式的方法来延伸指令集,可透过软件下 MCR、MRC、MRRC和MCRR 等指令来对协处理器寻址。协处理器空间逻辑上通常分成16个协处理器,编号分别从 0 至 15 ,而第15号协处理器(CP15)是保留用作某些常用的控制功能,像是使用高速缓存和记忆管理单元运算(若包含于处理器时)。   在 ARM 架构的机器中,周边装置连接处理器的方式,通常透过将装置的实体暂存器对应到 ARM 的内存空间、协处理器空间,或是连接到另外依序接上处理器的装置(如总线)。协处理器的存取延迟较低,所以有些周边装置(例如 XScale 中断控制器)会设计成可透过不同方式存取(透过内存和协处理器)。Thumb    较新的ARM处理器有一种16-bit指令模式,叫做Thumb,也许跟每个条件式执行指令均耗用4位的情形有关。在Thumb模式下,较小的opcode有更少的功能性。例如,只有分支可以是条件式的,且许多opcode无法存取所有CPU的暂存器。然而,较短的opcode提供整体更佳的编码密度(注:意指程式码在内存中占的空间),即使有些运算需要更多的指令。特别在内存埠或总线宽度限制在32 以下的情形时,更短的Thumb opcode能更有效地使用有限的内存带宽,因而提供比32位程式码更佳的效能。典型的嵌入式硬件仅具有较小的32-bit datapath寻址范围以及其他更窄的16 bits寻址(例如Game Boy Advance)。在这种情形下,通常可行的方案是编译成 Thumb 程式码,并自行最佳化一些使用(非Thumb)32位指令集的CPU相关程式区,因而能将它们置入受限的32-bit总线宽度的内存中。   首颗具备 Thumb 技术的处理器是 ARM7TDMI。所有 ARM9 和后来的家族,包括 XScale 都纳入了 Thumb 技术。   Jazelle    ARM 还开发出一项技术,Jazelle DBX (Direct Bytecode eXecution),允许它们在某些架构的硬件上加速执行Java bytecode,就如其他执行模式般,当呼叫一些无法支援bytecodes的特殊软件时,能提供某些bytecodes的加速执行。它能在现存的ARM与Thumb模式之间互相执行。   首颗具备Jazelle技术的处理器是ARM926EJ-S:Jazelle以一个英文字母'J'标示于CPU名称中。它用来让手机制造商能够加速执行Java ME的游戏和应用程式,也因此促使了这项技术不断地开发。   Thumb-2     Thumb-2 技术首见于 ARM1156 核心 ,并于2003年发表。Thumb-2 扩充了受限的 16-bit Thumb 指令集,以额外的 32-bit 指令让指令集的使用更广泛。因此 Thumb-2 的预期目标是要达到近乎 Thumb 的编码密度,但能表现出近乎 ARM 指令集在 32-bit 内存下的效能。   Thumb-2 至今也从 ARM 和 Thumb 指令集中派生出多种指令,包含位栏(bit-field)操作、分支建表(table branches),和条件执行等功能。   Thumb Execution Environment (ThumbEE)     ThumbEE,也就是所谓的Thumb-2EE,,业界称为Jazelle RCT技术,于2005年发表,首见于 Cortex-A8 处理器。ThumbEE 提供从 Thumb-2 而来的一些扩充性,在所处的执行环境(Execution Environment)下,使得指令集能特别适用于执行阶段(Runtime)的编码产生(例如即时编译)。Thumb-2EE 是专为一些语言如 LimboJavaC#PerlPython,并能让 即时编译器 能够输出更小的编译码却不会影响到效能。   ThumbEE 所提供的新功能,包括在每次存取指令时自动检查是否有无效指标,以及一种可以执行阵列范围检查的指令,并能够分支到分类器(handlers),其包含一小部份经常呼叫的编码,通常用于高阶语言功能的实作,例如对一个新物件做内存配置。   进阶 SIMD (NEON)    进阶 SIMD 延伸集,业界称为NEON技术,它是一个结合 64 和 128 bit 的 SIMD(Single Instruction Multiple Data 单指令多重数据)指令集,其针对多媒体和讯号处理程式具备标准化加速的能力。NEON 可以在 10 MHz 的 CPU 上执行 MP3 音效解码,且可以执行 13 MHz 频率以下的 GSM AMR (Adaptive Multi-Rate) 语音编码。NEON具有一组广泛的指令集、各自的寄存器阵列,以及独立执行的硬件。NEON 支援 8-, 16-, 32- 和 64-bit 的整数及单精度浮点数据,并以SIMD 的方式运算,执行图形和游戏处理中关于语音/视讯的部分。SIMD 在 向量超级处理机 中是个决定性的要素,它具备同时多项处理功能。在 NEON 技术中,SIMD 最高可支援到同时 16 个运算。   VFP     VFP 是在协同处理器针对ARM架构的衍生技术。它提供低成本的单精度和倍精度浮点运算能力,并完全相容于ANSI/IEEE Std 754-1985 二进制浮点算数标准。VFP 提供大多数适用于浮点运算的应用,例如PDA、智慧手机、语音压缩与解压、3D图像以及数位音效、打印机、机上盒,和汽车应用等。VFP 架构也支援 SIMD(单指令多重数据)平行化的短向量指令执行。这在图像和讯号处理等应用上,非常有助于降低编码大小并增加输出效率。   在ARM-based处理器中,其他可见的浮点、或 SIMD 的协同处理器还包括了 FPA, FPE, iwMMXt。他们提供类似 VFP 的功能但在opcode层面上来说并不具有相容性。   安全性扩充 (TrustZone)    TrustZone(TM) 技术出现在 ARMv6KZ 以及较晚期的应用核心架构中。它提供了一种低成本的方案,针对系统单芯片SoC)内加入专属的安全核心,由硬件建构的存取控制方式支援两颗虚拟的处理器。这个方式可使得应用程式核心能够在两个状态之间切换(通常改称为领域(worlds)以避免和其他功能领域的名称混淆),在此架构下可以避免资讯从较可信的核心领域泄漏至较不安全的领域。这种内核领域之间的切换通常是与处理器其他功能完全无关联性(orthogonal),因此各个领域可以各自独立运作但却仍能使用同一颗内核。内存和周边装置也可因此得知目前内核运作的领域为何,并能针对这个方式来提供对装置的机密和编码进行存取控制。典型的 TrustZone 技术应用是要能在一个缺乏安全性的环境下完整地执行操作系统,并在可信的环境下能有更少的安全性的编码。

    ARM的开发教程

      总结起来最主要的有以下几个吧    1 ADS调试用   确切的说是ADS+AXD。ADS里包含AXD。原来都用SDT后来ARM公司停止对SDT支持了,改支持ADS了,还是用ADS吧。 有的人的程序发布的仍然是SDT版本的,但基本都可以找到相应ADS的,新人在这里不要发蒙。ADS是编译器,AXD是调试器。编译成AXF以后再在ARM的RAM里调试。   2 FLASHPGM   FLASH烧写的软件。AXF在RAM里调试,掉电就没有了,方便程序修改。调试好的程序再下到FLASH里,上电直接运行。   同类的软件还有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好,要是有人还问FLASH不支持BIN格式文件的问题就要看我写的FLASHPGM使用了。   3 BANYANT调试代理(不知道名对不,起这么个难记的,我一般都叫它“半羊”因为知道它那几天刚吃了烤羊)   调试代理就是用它帮你使用更简单的JTAG(便宜啊)来实现原本1K才卖的JTAG仿真器的大部分功能。JTAG调试原理看我另一篇笔记。简单的就可以把他理解为你自己做的JTAG的驱动就行了。   调试代理还有很多种,什么H-JTAG了、ARM7了(不知道具体叫什么,就记得可执行文件叫ARM7.EXE)都是,BANYANT比较好。   需要注意的是,每种调试代理安装方法虽然都简单但都不一样,需要看说明。而且AXD调试之前都要运行。省钱了,就别怕麻烦了。   4 ARM-ELF-TOOLS工具链   里面是UCLINUX开发用的工具比如ARM-ELF-GCC只类的。工具链就是把很多工具打包在一起发布的方便你开发的东西。具体安装方法看我另一篇笔记。   另外如果你开发LINUX就要用ARM-LINUX-TOOLS,不一样,不通用。   5 U-BOOT   大名鼎鼎的BOOTLOADER生成工具,同类的好象还有VIVI(名字很暧昧~~)   生成的BOOTLOADER烧到FLASH里,然后就可以用BOOTLOADER下载 烧写其他了   有了BOOTLOADER才能下UCLINUX。BOOTLOADER就像电脑上的BIOS。当然UCOS的不用这个,用什么我不知道:)   最新版本是1.1.4 具体使用方法看我另一篇笔记吧。   6 UCLINUX包   UCLINUX的源码包,不用多说了吧?建议大家用现成的先体会一下,然后再自己编译,裁剪。因为单独UCLINUX的编辑技术上比较简单,但涉及的方面还是比较广的。   7 VMWARE   老牌的虚拟机软件,在一个机器上虚拟出一个机器装LINUX(PC上用的),省得你来回开关机了。记得装VMWARE-TOOLS。   8 source insight 代码编辑工具 linux下使用kscope
    展开全文
  • 从零使用qemu模拟器搭建arm运行环境

    万次阅读 多人点赞 2015-07-04 15:26:17
    本文从零开始介绍如何搭建qemu+arm的运行环境

    提醒:本文已有自动构建的项目支持,请移步到:再续【从零使用qemu模拟器搭建arm运行环境】

    为什么会有这篇文章

    早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C++业务和数据库的开发经验,也没有底层的内核和驱动开发经验,到底路该如何走……基于对Linux系统开发的理解和内核的兴趣,认为选择Linux内核开发更适合自己。于是到淘宝上买了块三星s3c2440(arm 9)开发板,学起内核开发。没有过多久,机缘巧合,正式加入了公司的内核开发部。就这样跟内核和arm打上交道了。

     

    没有想到这一做就是3年了,arm芯片只有在公司才能使用,回到家里就不能访问了。去年(2014)开始觉得做内核久了,应该向内核社区提交patch,提升知名度和影响力。但在公司提交patch不方便,于是在家里通过qemu方式搭建于ARM A9的运行环境,进行开发和测试验证,一口气提交了好几个patch(link1, link2, link3, link4, link5)并被社区接纳了。

     

    最近在梳理Linux内存机制,无论是《深入理解Linux内核》还是《深入理解内核架构》这两本红宝书都无法告知你每个细节的时候,就需要查看代码细节,修改代码,甚致做行为分析。此时需要修改代码输出调试信息,以帮助更深入体会代码的逻辑。这该是qemu派上场的时候。

     

    其实我前前后后搭建qemu+arm的运行环境已超过5次了,每次都要花上很多时间。碰巧昨天有同事看到我再次搭建,他如搭珍宝,告诉我一定要将搭建qemu的方法告诉他。

     

    所以,如果你想买个开发板来做arm + linux嵌入式开发,完全可以使用qemu进行开发。或者你像我一样,对内核机制关心,而不关心于具体的外设器件,最多是关心arm架构相关的功能,也可以使用qemu进行开发。

     

    一句话:搭建qemu+arm环境,用于做内核开发和功能分析调试。

    搭建环境

    我整个搭建过程都是在笔记本上进行的,Ubuntu 12.04系统;如果是Fodera环境,搭建过程可能略有不同,但关键步骤是不变的。

     

    qemu模拟得最好的arm芯片,要数ARM公司的vexpress A9开发板了,本文的搭建过程都是围绕这个开发板进行的。当然,如果你想搭其它开发板,也不难,只要qemu和内核对它有成熟的支持就够了。

     

    下面是step by step的搭建过程,建议没有特别诉求的朋友,按照下在面的步骤操作。或者先根据下面的步骤成功搭建vexpress运行环境之后,再根据自己的需求进行更改。

     

    下载Linux内核

    下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发。另一种是直接到内核社区下载稳定版本(详见:https://www.kernel.org/pub/linux/kernel/v4.x/)。下面演示从Linux kernel主线下载代码进行编译。

     

    git clonegit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

     

    整个下载过程会持续半个小时左右,有足够时间来泡杯茶。

     

    安装arm的交叉编译工具链

     

    想必做嵌入式开发的朋友,对交叉编译工具链不陌生。如果你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。但在这里建议直接安装arm的交叉编译工具链:

    sudo apt-get install gcc-arm-linux-gnueabi

     

    编译Linux内核

    生成vexpress开发板子的config文件:
     

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

     

    编译:

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

     

    生成的内核镱像位于arch/arm/boot/zImage, 后续qemu启动时需要使用该镜像。

     

    下载和安装qemu模拟器

    其实Ubuntu 12.04有qemu的安装包,但由于版本较低,对vexpress开发板支持不友好,建议下载高版本的qemu:

    wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2

     

    配置qemu前,需要安装几个软件包:

    sudo apt-get install zlib1g-dev

    sudo apt-get install libglib2.0-0

    sudo apt-get install libglib2.0-dev

     

     

    配置qemu,支持模拟arm架构下的所有单板:

    ./configure --target-list=arm-softmmu --audio-drv-list=

     

    编译和安装:

    make

    make install

     

    测试qemu和内核能否运行成功

     

    qemu已经安装好了,内核也编译成功了,到这里最好是测试一下,编译出来的内核是否OK,或者qemu对vexpress单板支持是否够友好。

    运行命令很简单:

    qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

     

    这里的 /path/to/kernel/dir/  是内核的下载目录,或者编译目录。

    如果看到内核启动过程中的打印,说明前面的搭建是成功的。

     

    这里简单介绍下qemu命令的参数:

    -M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板

    -m 512M 单板运行物理内存512M

    -kernel /path/to/kernel/dir/arch/arm/boot/zImage  告诉qemu单板运行内核镜像路径

    -nographic 不使用图形化界面,只使用串口

    -append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是那个tty。

     

    注意:

    我每次搭建,都忘了内核启动参数中的console=参数应该填上哪个tty,因为不同单板串口驱动类型不尽相同,创建的tty设备名当然也是不相同的。那vexpress单板的tty设备名是哪个呢? 其实这个值可以从生成的.config文件CONFIG_CONSOLE宏找到。

    如果搭建其它单板,需要注意内核启动参数的console=参数值,同样地,可从生成的.config文件中找到。

     

    制作根文件系统

    到这里是否大功告成了呢? 其实在上面的测试中,你会发现内核报panic,因为内核找不到根文件系统,无法启init进程。

     

    根文件系统要考虑两个方面:

    1. 根文件系统的内容

        如果你看过《Linux From Scratch》,相信你会对这一步产生恐惧感,但如果一直从事嵌入式开发,就可以放下心来。根文件系统就是简单得不能再简单的几个命令集和态动态而已。为什么Linux From Scratch会有那么复杂,是因为它要制作出一个Linux发生版。但在嵌入式领域,几乎所有的东西,都是mini版本,根文件系统也不例外。

       本文制本的根文件系统 = busybox(包含基础的Linux命令)  + 运行库 + 几个字符设备

    2. 根文件系统放在哪里

        其实依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。

        本文直接使用SD卡做为存储空间,文件格式为ext3格式

     

    下载、编译和安装busybox


     wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2

     

    make defconfig

    make CROSS_COMPILE=arm-linux-gnueabi-

    make install CROSS_COMPILE=arm-linux-gnueabi-

     

    安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

     

    形成根目录结构

    先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录
     
    1.  创建rootfs目录(根目录),根文件系统内的文件全部放到这里
     

    mkdir -p rootfs/{dev,etc/init.d,lib}

     

    2. 拷贝busybox命令到根目录下

     

    sudo cp busybox-1.20.2/_install/* -r rootfs/

     

    3. 从工具链中拷贝运行库到lib目录下

     

    sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

     

    4. 创建4个tty端终设备

    sudo mknod rootfs/dev/tty1 c 4 1

    sudo mknod rootfs/dev/tty2 c 4 2

    sudo mknod rootfs/dev/tty3 c 4 3

    sudo mknod rootfs/dev/tty4 c 4 4

    制作根文件系统镜像

    1. 生成32M大小的镜像
     

     dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

     

    2. 格式化成ext3文件系统

     

    mkfs.ext3 a9rootfs.ext3

     

    3.  将文件拷贝到镜像中

     

    sudo mkdir tmpfs

    sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

    sudo cp -r rootfs/*  tmpfs/

    sudo umount tmpfs

    系统启动运行

    完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:

    qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

     

    从内核启动打印,到命令行提示符出现,激动人心的时刻出现了……

     

    写在后面的话

    通过上面的步骤,搭建出来一个最小的qemu+arm开发环境,你可以上面的基础上修改内核,或者增加一些测试程序在单板上运行,甚至使用单板的flash设备。
    在此,你可以做纯arm架构的内核开发,或者与架构无关的内核开发,也可以做单板相关的驱动开发。

    最后的最后:本文已经过多次修改,如果各位读者按照本文方法搭建遇到问题,还请各位反馈给我(lyt2008bj at 163 dot com),我会修改直至完全成功。
    展开全文
  • ARM7、ARM9、ARM11、ARM-Cortex的关系

    千次阅读 2018-08-24 14:40:32
    1. ARM7、ARM9、ARM11、ARM-Cortex的关系  ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构 ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE...

    1. ARM7ARM9ARM11ARM-Cortex的关系

        ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构 ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统, 因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间 。ucOS、ucLinux这些精简实时的RTOS不需要MMU,当然可以在ARM7上运行。 ARM9、ARM11,是嵌入式CPU(处理器),带有MMU,可以运行诸如Linux等多用户多进程的操作系统,应用场合也不同于ARM7。 到了ARMv7架构的时候开始以Cortex来命名,并分成Cortex-A、Cortex-R、Cortex-M三个系列。 三大系列分工明确:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用; “R”系列针对实时系统; “M”系列对微控制器。 简单的说Cortex-A系列是用于移动领域的CPU,Cortex-R和Cortex-M系列是用于实时控制领域的MCU。 所以看上去ARM7跟Cortex-M很像,因为他们都是MCU,但确是不同代不同架构的MCU(Cortex-M比ARM7高了三代!),所以性能也有很大的差距。此外,Cortex-M系列还细分为M0、M3、M4和超低功耗的M0+,用户依据成本、性能、功耗等因素来选择芯片。 想必楼主现在肯定知道了ARM7、Cortex-M的区别,不过还是花了点时间整理在此,可以帮助后来的初学者搞明白这些基本的概念性问题

    2. ARM7,ARM9,cortex-m3,cortex-m4,cortex-a8的区别
    arm系列从arm11开始,以后的就命名为cortex,并且性能上大幅度提升。
    从cortex开始,分为三个系列,a系列,r系列,m系列。
    m系列与arm7相似,不能跑操作系统(只能跑ucos2),偏向于控制方面,说白了就是一个高级的单片机。
    a系列主要应用在人机互动要求较高的场合,比如pda,手机,平板电脑等。a系列类似于cpu,与arm9和arm11相对应,都是可以跑草错系统的。linux等。
    r系列,是实时控制。主要应用在对实时性要求高的场合。
    arm7和m3,m4是同一类型。这三个里面,arm7是最早的arm产品。m3是cortex m系列的过渡品,其低端市场被cortex m0的高端替代, 其高端市场又被cortex m4的低端取代。现在m系列,是m4内核的。典型的芯片是st公司和飞思卡尔公司的。
    arm9 和cortex a8 是一个类型的,都是跑操作系统的,现在的高端手机,三星,htc等智能手机,就是用的cortex a8,cortex a9 内核的芯片作为cpu。
    (1)ARM7,ARM9属于v4T或v5E架构
    (2)ARM11属于v6架构
    (3)Contex属于v7架构
    ARM7,ARM9的区别在于是否有MMU(存储器管理单元)或MPU(存储器保护单元)
    架构上v5E相比v4T则是在于v5E新加入的增强型DSP(数字信号处理)指令,v4T则是Thumb指令集的加入,v6架构则是开始支持SIMD以及Thumb2的问世. 

    展开全文
  • 目前,针对于 ARM 平台的主流编译器主要有以下三者: 比较 ARMCC IAR GCC for ARM 命令行工具 IDE中,独立提供 仅随其IDE发布,不独立提供 独立提供 开发商 ARM IAR GNU(目前由ARM维护) 支持的平台 ...

    必备

      在讲解各编译器之前,必须先了解一下以下文件。这些文件在编译器目录下或者编译生成目标平台的可执行程序时经常见到。此外,还需要注意区分 Windows 平台 和 Linux 平台的文件。

    • .o 文件: 指的是 object 文件,俗称目标文件。在 Linux 下扩展名缩写为 .o,在 windows 下通常为 .obj 文件。
    • .a 文件: 指的是 archive 文件,俗称静态库文件。在 Linux 下扩展名缩写为 .a,在 windows 下通常为 .lib 文件。
    • .so 文件: 指的是 shared object 文件,用于动态连接的。在 Linux 下扩展名缩写为 .so,在 windows 下通常为 .dll 文件。

    .o 文件是链接文件,.a 是静态库文件,需要 .o 文件生成,作为一个库为外部程序提供函数接口。详细的可以看一下博文 ARM 之一 镜像文件(Image)/可执行文件/ELF文件/对象文件 详解

      在交叉编译工具链目录中,有大量的 .o 和 .a 文件。这些文件在我们编译目标平台时会被用到!为什么在Windows下面的编译工具链中会有这么多的 .o 和 .a 文件呢?这是因为编译工具链是在 Linux 系统 中编译生成的! 。看下图:
    在这里插入图片描述
    如果有亲自编译过交叉编译工具链,那么就一定会见到 build、host 和 target 这几个参数:

    • –build=编译该软件(就是指的交叉编译工具链本身)所使用的平台
    • –host=该软件(就是指的交叉编译工具链本身)将运行的平台
    • –target=该软件(就是指的交叉编译工具链本身)所要处理的目标平台。即交叉编译工具链编译出来的程序运行的平台

    比较

    目前,针对于 ARM 平台的主流编译器主要有以下三者:

    比较 ARMCC IAR GCC for ARM
    命令行工具 随IDE发布,也独立提供 仅随其IDE发布,不独立提供 独立提供
    开发商 ARM IAR ARM、Linaro、Mentor
    支持的平台 Windows、Linux Windows Windows、Linux、Mac(部分)
    配套 IDE Keil MDK、ARM Development Studio 5、ADS IAR EMBEDDED WORKBENCH FOR ARM 除以上两者外的其他支持ARM的IDE,例如:eclipse、Visual Studio
    官网 https://developer.arm.com/tools-and-software/embedded/arm-compiler/downloads https://www.iar.com/iar-embedded-workbench/ 1. https://launchpad.net/gcc-arm-embedded
    2. https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

    ARM

      ARM 官网上除了提供了配套 IDE(参考博文《ARM 之 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)》) 以外,每次都会提供编译器的独立下载。用户可以单独安装编译器,编译器采用命令行形式使用。
      也就是说,ARM 的 IDE 和编译器是相互独立的,使用者可以为同一个IDE配置不同版本的编译器!目前,ARM 官方提供两个版本的编译器,如下图所示:
    在这里插入图片描述
      其中,Arm Compiler 6 被 ARM 称为是 Arm Compiler 5 的替代者!相比于 Arm Compiler 5 的使用的 Edison Design Group 编译器前端,Arm Compiler 6 将编译器前端换为了基于 LLVM 的 Clang!
    在这里插入图片描述
    在 ARM 官网的介绍中,有如下一段话
    General update releases on the last branch, version 5.06, ended in H2 2017 with 5.06u6. After this, further support and maintenance will be available through Arm Compiler Long Term Maintenance releases with maintenance continuing until at least summer 2020. Arm Compiler 5.06 for Certification and Arm Compiler 5.06 Long Term Maintenance releases will each be supported by an Arm Compiler Qualification Kit.
    大意就是,Arm Compiler 5 以后就要退出舞台了!在 ARM 内核的支持上,Arm Compiler 6 也要比 Arm Compiler 5 完善的多!
    目前,ARM 官方的 IDE 都会包含这两个版本的编译器。例如,在 Keil MDK 的安装目录下面会有如下两个目录,分别对应了 Arm Compiler 5 和 Arm Compiler 6
    在这里插入图片描述
    上面说了,以上编译器 ARM 也提供独立下载安装,具体见上文的官网地址即可!我本身安装了多个版本的 ARM编译器,如下:
    在这里插入图片描述

    1. Edison Design Group 是一家公司,靠卖产品给卖编译器的公司生存,它卖的是前端,包括 C++、Java 和 Fortran 前端,全世界几乎所有商用编译器,都会用这家公司的前端。最重要的,这家公司只有 5 个人。
      这五个人依次是:Mike Miller, Daveed Vandevoorde, Steve Adamczyk, John Spicer, Mike Herricl。Daveed Vandevoorde 写过两本书《C++ Templates》和《C++ Solutions》,Mike Miller是C++专家,实现部分C++的功能。Mike Herrick在Bell实验室呆了19年。Steve Adamczyk 和 John Spicer 是 EDG 的创建者。
    2. 在最早期,ARM 的编译器也是随 IDE 发布的,如 ADS 时代!

    armcc.exe

      The ARM and Thumb® compiler. This compiles your C and C++ code.It supports inline and embedded assemblers, and also includes the Advanced SIMD vectorizingcompiler. ARM和Thumb®编译器。 这将编译您的 C 和 C++代码。它支持内联和嵌入式汇编程序,还包括高级SIMD矢量化编译器。
      编译器支持将以下不同标准的C和C ++源代码编译为 ARM 和 Thumb® 代码:

    • ISO Standard C:1990 source.
    • ISO Standard C:1999 source.
    • ISO Standard C++:2003 source.
    • ISO Standard C++:2011 source.

    armcc 符合 Base Standard Application Binary Interface for the ARM Architectur(ARM体系结构的基本标准应用程序二进制接口,BSABI)。 特别是编译器:

    D:\ARM\ARM_Compiler_5.06u4>armcc
    Product: ARM Compiler 5.06
    Component: ARM Compiler 5.06 update 4 (build 422)
    Tool: armcc [4d3604]
    
    Usage:         armcc [options] file1 file2 ... filen
    Main options:
    
    --arm          Generate ARM code 创建 ARM 代码
    --thumb        Generate Thumb code 创建 Thumb 代码
    --c90          Switch to C mode (default for .c files) 切换到C模式 (默认是 .c 文件)
    --cpp          Switch to C++ mode (default for .cpp files) 切换到C++模式 (默认 .cpp 文件)
    -O0            Minimum optimization 最小优化级别
    -O1            Restricted optimization for debugging 受限的调试级别优化
    -O2            High optimization 高优化
    -O3            Maximum optimization 最大优化
    -Ospace        Optimize for codesize 对代码大小进行优化
    -Otime         Optimize for maximum performance 优化最大优化级别的运行时间
    --cpu <cpu>    Select CPU to generate code for 选择CPU
    --cpu list     Output a list of all the selectable CPUs 输出所有被选中的CPU列表
    -o <file>      Name the final output file of the compilation 最终输出文件的名字
    -c             Compile only, do not link 只进行编译,不链接
    --asm          Output assembly code as well as object code 输出汇编以及obj文件
    -S             Output assembly code instead of object code 只输出汇编文件
    --interleave   Interleave source with disassembly (use with --asm or -S) 交叉反汇编 (use with --asm or -S)
    -E             Preprocess the C source code only 仅仅预处理C代码
    -D<symbol>     Define <symbol> on entry to the compiler 定义 <symbol> 符号并且传入编译过程
    -g             Generate tables for high-level debugging 为高级别调试创建表
    -I<directory>  Include <directory> on the #include search path 在编译的时候包含 <directory> 作为头文件搜索目录
    

    其默认的头文件搜索路径如下图所示:
    在这里插入图片描述

    armasm.exe

      The ARM and Thumb assembler. This assembles ARM and Thumb assembly language sources. ARM 和 Thumb 汇编器。这将汇编 ARM 和 Thumb 汇编语言源文件。

    D:\ARM\ARM_Compiler_5.06u4>armasm
    Product: ARM Compiler 5.06
    Component: ARM Compiler 5.06 update 4 (build 422)
    Tool: armasm [4d35cf]
    For Educational purposes only
    Software supplied by: ARM Limited
    
    Usage:      armasm [options] sourcefile
    
    Options:
    --list       listingfile   Write a listing file (see manual for options)    生成列表文件
     -o          outputfile    Name the final output file   命名最终输出文件名
    --depend     dependfile    Save 'make' source file dependencies 保留 'make' 源文件依赖
    --errors     errorsfile    Put stderr diagnostics to errorsfile 把标准错误判断放入errorsfile
     -I          dir[,dir]     Add dirs to source file search path  添加源文件的搜索目录
    --pd
    --predefine  directive     Pre-execute a SET{L,A,S} directive   预执行 SET{L,A,S} 指令
    --maxcache   <n>           Maximum cache size    (default 8MB)  最大闪存空间 (default 8MB)
    --no_esc                   Ignore C-style (\c) escape sequences 忽略C风格(\ c)转义序列
    --no_warn                  Turn off Warning messages    关闭警告信息
     -g                        Output debugging tables  输出调试表
    --apcs       /<quals>      Make pre-definitions to match the
                               chosen procedure-call standard 进行预定义以匹配选择的程序调用标准
    --checkreglist             Warn about out of order LDM/STM register lists   警告LDM/STM寄存器列表出现故障
    --help                     Print this information   打印帮助信息
    --li                       Little-endian ARM    小端模式的 ARM 
    --bi                       Big-endian ARM   大端模式的 ARM
     -M                        Write source file dependency lists to stdout 将源文件依赖关系列表写入stdout
    --MD                       Write source file dependency lists to inputfile.d 将源文件依赖关系列表写入inputfile.d
    --keep                     Keep local labels in symbol table of object file 将本地标签保存在目标文件的符号表中
    --regnames none            Do not predefine register names 不预定义寄存器名称
    --split_ldm                Fault long LDM/STM
    --unsafe                   Downgrade certain errors to warnings 将某些错误降级为警告
    --via        <file>        Read further arguments from <file><file>中读取更多参数
    --cpu        <target-cpu>  Set the target ARM core type 设置目标ARM核心类型
    --cpu list                 Output a list of all the selectable CPUs 输出所有可选CPU的列表
    --fpu        <target-arch> Set target FP architecture version 设置目标FP架构版本
    --fpu list                 Output a list of all selectable FP architectures 输出所有可选FP架构的列表
    --thumb                    Assemble Thumb instructions  汇编 Thumb 指令
    --arm                      Assemble ARM instructions    汇编 ARM 指令
    

    armlink.exe

      The linker. This combines the contents of one or more object files with selected parts of one ormore object libraries to produce an executable program.A 64-bit version of armlink is also provided that can access the greater amount of memoryavailable on 64-bit machines. It supports all the features that are supported by the 32-bit versionof armlink in this release. 连接器。这将一个或多个目标文件的内容与一个或多个对象库的选定部分组合在一起,以生成可执行程序。还提供了64位版本的armlink,可以访问64位计算机上可用的更大内存量。它支持此版本中32位版本的armlink支持的所有功能。
      If you are using ARM Compiler as a standalone product, then the 32-bit version is used bydefault. 如果您使用ARM编译器作为独立产品,则默认使用32位版本。
      For ARM Compiler in DS-5, the linker version depends on the host platform. 32-bit tools havethe 32-bit linker and 64-bit tools have the 64-bit linker. You do not get both versions.For the Microcontroller Developer Kit (MDK), only the 32-bit linker is provided. 对于DS-5中的ARM编译器,链接器版本取决于主机平台。 32位工具具有32位链接器,64位工具具有64位链接器。 您没有获得这两个版本。对于微控制器开发工具包(MDK),仅提供32位链接器。

    D:\ARM\ARM_Compiler_5.06u4>armlink
    Product: ARM Compiler 5.06
    Component: ARM Compiler 5.06 update 4 (build 422)
    Tool: armlink [4d35d2]
    For Educational purposes only
    Software supplied by: ARM Limited
    
    Usage: armlink option-list input-file-list
    where
        option-list      is a list of case-insensitive options. 不区分大小写的选项列表。
        input-file-list  is a list of input object and library files. 输入对象或者库文件列表。
    
    General options (abbreviations shown capitalised):
       --help          Print this summary. 显示帮助信息。
       --output file   Specify the name of the output file. 指定输出文件名。
       --via file      Read further arguments from file.
    
    Options for specifying memory map information:
       --partial       Generate a partially linked object. 创建一个被分散链接的对象文件。
       --scatter file  Create the memory map as described in file. 按文件(分散加载文件)中的描述创建内存映射。
       --ro-base n     Set exec addr of region containing RO sections. 设置执行地址空间域,包含RO段(只读数据段)--rw-base n     Set exec addr of region containing RW/ZI sections. 设置执行地址空间域,包含RW/ZI段。
    
    Options for controlling image contents:
       --bestdebug     Add debug information giving best debug view to image.  添加调试信息,为镜像提供最佳调试视图。
       --datacompressor off
                       Do not compress RW data sections. 不要压缩RW数据段。
       --no_debug      Do not add debug information to image. 不添加调试信息。
       --entry         Specify entry sections and entry point. 指定输入段与输入点。
       --libpath       Specify path to find system libraries from. 指定系统库文件路径。
       --userlibpath   Specify path to find user libraries from. 指定用户库文件路径。
       --no_locals     Do not add local symbols to image symbol table. 不要添加局部标号到image的标号列表。
       --no_remove     Do not remove unused sections from image. 不要移除image的未使用段。
    
    Options for controlling image related information:
       --callgraph     Create a static callgraph of functions. 创建一个函数静态调用图。
       --feedback file Generate feedback that can be used by the compiler in file.
       --info topic    List misc. information about image.
                        Available topics: (separate multiple topics with comma)
                         common   List common sections eliminated from the image.
                         debug    List eliminated input debug sections.
                         sizes    List code and data sizes for objects in image.
                         totals   List total sizes of all objects in image.
                         veneers  List veneers that have been generated.
                         unused   List sections eliminated from the image.
       --map           Display memory map of image. 显示image内存映射。
       --symbols       List symbols in image. 列出image符号。
       --xref          List all cross-references between input sections. 列出输入的段之间所有的交叉引用.最终输出会放在.map文件里面。
    

    armar.exe

    The librarian. This enables sets of ELF object files to be collected together and maintained inarchives or libraries. You can pass such a library or archive to the linker in place of several ELFfiles. You can also use the archive for distribution to a third party for further applicationdevelopment. 库文件管理工具。 这使得 ELF 对象文件集可以一起收集并维护在原始文件或库中。 您可以将此类库或存档传递给链接器以代替多个ELF文件。 您还可以使用存档分发给第三方以进行进一步的应用程序开发。

    D:\ARM\ARM_Compiler_5.06u4>armar
    Product: ARM Compiler 5.06
    Component: ARM Compiler 5.06 update 4 (build 422)
    Tool: armar [4d35c8]
    
    Archive creation and maintenance tool
    
    Command format:
    
    armar options archive [ file_list ]
    
    Wildcards '?' and '*' may be used in file_list
    
    Options:-
    
     -r         Insert files in <file_list>, replace existing members of the same name.<file_list> 中插入文件, 替换掉已经存在的同名成员。
     -d         Delete the members in <file_list>.<file_list> 中删除成员。
     -x         Extract members in <file_list> placing in files of the same name.<file_list> 中提取同名的成员。
     -m         Move files in <file_list>.<file_list> 中移动文件。
     -p         Print files to stdout. 打印文件到标准输出设备。
     -a pos     Insert/move files after file named <pos>. 插入/删除 <pos> 后面的文件。
     -b pos     Insert/move files before file named <pos>. 插入/删除 <pos> 前面的文件。
     -u         Update older files only, used with -r. 只更新旧的文件,-r 一起使用。
    
     -n         Do not add a symbol table to an object archive. 不要向 object 文件中添加符号表。
     -s         Force regeneration of archive symbol table. 强制重新生成文档符号表。
     -t         Print table of contents of archive. 打印文档的内容表。
    --zs        Show the symbol table. 显示符号表。
    --zt        Summarize the archive contents (sizes + entries). 汇总文档内容 (大小和输入)-c         Suppress warning when a new archive is created. 当一个新文档被创建的时候不显示警告。
     -C         Do not overwrite existing files when extracting. 提取的时候不要覆盖一个已经存在的文件。
     -T         Truncate file names to system maximum length. 截取系统最大长度文件名。
     -v         Give verbose output. 提供详细输出。
    --create    Force creation of a new archive. 强制创建一个新文档。
    --via file  Take additional arguments from via file. 从 via 文件中获取额外参数。
    --sizes     List the size of each member and the library total. 列出所有成员大小与库的总大小。
    --entries   List sections containing ENTRY points. 列出包括入口点的部分。
    --vsn       Print the current Armar Version. 打印最新的armar版本。
    --help      Print this message. 打印帮助信息。
    
    Examples:-
    
            armar -r  mylib.a obj1 obj2 obj3...
            armar -x  mylib.a ?sort*
            armar -d  mylib.a hash.o
            armar -tv ansilib.a
    

    fromelf.exe

    The image conversion utility. This can also generate textual information about the input image,such as its disassembly and its code and data size.镜像转换实用程序。 这还可以生成有关输入图像的文本信息,例如其反汇编及其代码和数据大小。

    D:\ARM\ARM_Compiler_5.06u4>fromelf
    Product: ARM Compiler 5.06
    Component: ARM Compiler 5.06 update 4 (build 422)
    Tool: fromelf [4d35cb]
    
    ARM image conversion utility. ARM 镜像转换工具
    fromelf [options] input_file
    
    Options:
           --help         display this help screen 显示帮助信息
           --vsn          display version information 显示版本信息
           --output file  the output file. (defaults to stdout for -text format) 输出文件名. (默认输出 -text 格式)
           --nodebug      do not put debug areas in the output image 不要输出调试信息到映像文件中
           --nolinkview   do not put sections in the output image 不要输出段信息到映像文件中
    
    Binary Output Formats:
           --bin          Plain Binary 普通二进制
           --m32          Motorola 32 bit Hex 摩托罗拉32位Hex码
           --i32          Intel 32 bit Hex 英特尔32位Hex码
           --vhx          Byte Oriented Hex format 定向字节的 Hex 格式
    
           --base addr    Optionally set base address for m32,i32 为 m32,i32设置基地址(可选的)
    
    Output Formats Requiring Debug Information 输出格式要求的调试信息
           --fieldoffsets Assembly Language Description of Structures/Classes. Structures/Classes的汇编描述
           --expandarrays Arrays inside and outside structures are expanded. 展开内部和外部结构的数组
    
    Other Output Formats:
           --elf         ELF ELF格式
           --text        Text Information 文本信息
    
                    Flags for Text Information 文本信息的标志
                    -v          verbose 详细信息
                    -a          print data addresses (For images built with debug) 打印数据的地址信息 (得到的.axf映像文件)
                    -c          disassemble code 汇编码
                    -d          print contents of data section 打印数据的段内容
                    -e          print exception tables 打印异常表
                    -g          print debug tables 打印调试表
                    -r          print relocation information 打印重定位信息
                    -s          print symbol table 打印符号表
                    -t          print string table 打印字符表
                    -y          print dynamic segment contents 打印动态段内容
                    -z          print code and data size information 打印代码与数据的大小信息
    

    IAR

      相比于 ARM 对于编译器的灵活安装,IAR 的编译器则只跟随其 IDE 发布,编译器不独立提供。IAR 安装后,目录就是下面这个样子了:
    在这里插入图片描述
    这里我们重点关注一下arm目录下的相关内容。其中内容有很多,这里主要介绍一下编译器相关的那些,首先看下图
    在这里插入图片描述
      我们可以手动提取其编译器,来作为命令行工具使用。但是对于 IAR 还是不建议这么用,个人感觉 IAR 在设计时,估计没考虑过让用户使用命令行模式来独立使用编译套件,因为其编译套件和其他好多东西都放在了一个目录中,不像ARM 将编译套件独立存放。但是,IAR 的编译套件是支持命令行使用的 ,在其介绍文档中有这么一句话:The compiler, assembler, and linker can also be run from a command line environment,if you want to use them as external tools in an already established project environment. 官方的介绍文档主要就是《 IAR C/C++ Development Guide Compiling and Linking》。

    1. IAR 我用的比较少,主要内容来自于官方文档。管方文档更加详细,如有疑问直接去官方文档查看即可!官方文档目录为 IAR安装目录\arm\doc。具体如下:
      1. 《 IAR C/C++ Development Guide Compiling and Linking》,文档名为 EWARM_DevelopmentGuide.ENU.pdf
      2. 《IAR Assembler Reference Guide》,文档名为 EWARM_AssemblerReference.ENU.pdf
      3. 《C-STAT® Static Analysis Guide》,文档名为 EW_MisraC1998Reference.ENU.pdf
    2. 还可以直接从 IAR 的 IDE 的菜单进入:菜单 -> help
      在这里插入图片描述

    iasmarm.exe

      这个是 IAR 的汇编语言的编译器。官方文档是这么介绍的:The IAR Assembler for Arm is a powerful relocating macro assembler with a versatile set of directives and expression operators. The assembler features a built-in C language preprocessor and supports conditional assembly. 大意就是: IAR Assembler for Arm是一个功能强大的重定位宏汇编程序,具有多种指令和表达式运算符。 汇编程序具有内置的C语言预处理程序,并支持条件汇编。该工具官方有个独立的说明文档《IAR Assembler Reference Guide》,里面有该工具的详细使用说明。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iasmarm
    
        IAR Assembler V8.32.3.193/W32 for ARM
        Copyright 1999-2019 IAR Systems AB.
    
    Usage:        iasmarm {<options>} <sourcefile> {<options>}
    Sourcefile:   source file with default extension: .msa, , .asm, or .s
    
    Environment:  IASMARM
    Options (specified order is of no importance):
    -B            Print debug info for assembler macros
    -c{DEAOM}     Listing options
                     D: Disable listing,             E: Disable macro expansion
                     A: List only assembled part     O: List several lines of code
                     M: List Macro definition
    -DSYMB        Equivalent to: #define SYMB 1
    -DSYMB=xx     Equivalent to: #define SYMB xx
    -e            Use big-endian byte order
    -Enumber      Allow <number> errors
    -f file       Extend command line with <file> <.xcl>
    -g            No system include
    -G            Open standard input as source
    -i            List #included files
    -Ipath        Add #include search path
    -j            Enable alternative register names, operators and mnemonics
    -l file       Generate a list on: <file> <.lst>
    -Lpath        Generate a list on: <path> \ <source> <.lst>
    -Mab          Change asm.macro argument quote chars,
                      where a is start-of-quote and b is end-of-quote char.
                      default is a == < and b == >.
    -N            No header in listing
    -o file       Put object  on: <file> <.o>
    -Opath        Put object on: <path> \ <source> <.o>
    -pnn          Page listing with 'nn' lines/page (10-150)
    -r            Enable debugger output in object
    -S            Silent operation of assembler
    -s{+|-}       Set case sensitivity for user symbols
                     -s and -s+ enables sensitivity, -s- disables it.
    -tn           Set tab spacing between 2 and 9 (default 8)
    -USYMB        Equivalent to: #undef SYMB
    -ws           To make warnings generate exit code 1
    -wstring      Disable warnings
                     string: <+|-,><+|-range><,+|-range>...
                     range: low_warning_nr<-high_warning_nr>
                     example: -w turns all warnings off
                              -w-,+10-12,+20 turns all but 10,11,12 and 20 off
    
    -x{DI2}       Generate cross-reference list
                     D: Show all #defines, I: Show Internal table
                     2: Dual line space listing
    --aarch64     Generate code for AArch64, same as --cpu_mode A64
    
    --abi {lp64|ilp32}
                  Specify ABI for AArch64: ilp32 or lp64.
    --arm         Generate code in arm mode, same as --cpu_mode arm
    
    --cmse
                  Target secure mode in CMSE (ARMv8-M security extensions)
    --cpu core    Specify target core
                     Valid options are core names such as Cortex-M3
                     and architecture names such as 7M
                     Default is Cortex-M3
    --cpu_mode {arm|a|thumb|t}
                  Select default mode for CODE directive, ARM is default
    
    --endian {little|l|big|b}
                  Specify target byte order
    --fpu {VFPv1|VFPv2|VFPv3{_D16}{_FP16}|VFP9-S|none}
                  Specify target FPU coprocessor support
                     Default is none, which selects the software
                     floating-point library.
    --legacy {legacyOption}
                  Generate object files compatible with
                  older toolchains. Valid options are:
                  RVCT3.0
    --no_dwarf3_cfi
                  Suppress Dwarf 3 Call Frame Information instructions
    --no_it_verification
                  Do not verify that the instructions following
                  an IT instruction has the correct condition set
    
    --no_literal_pool
                  Use MOV32 for LDR Rd,=expr (requires ARMv7-M)
    --no_path_in_file_macros
                  Strip path from __FILE__ macros
    --source_encoding {locale|utf8}
    Encoding to use for source files with no BOM
    --suppress_vfe_header
                  Do not generate VFE header info
    
    --system_include_directory <path>
                  Set system header directory
    --thumb       Generate code in thumb mode, same as --cpu_mode thumb
    
    --version     Output version info and exit
    

    iccarm.exe

      这个是 IAR 的 C/C++ 编译器。官方文档是这么介绍的:The IAR C/C++ Compiler for Arm is a state-of-the-art compiler that offers the standard features of the C and C++ languages, plus extensions designed to take advantage of the Arm-specific facilities.大意就是: IAR C / C ++ Compiler for Arm是一个最先进的编译器,提供C和C ++语言的标准功能,以及旨在利用Arm特定功能的扩展。
      默认使用的头文件目录.\arm\inc\<vendor>

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iccarm
    
       IAR ANSI C/C++ Compiler V8.32.3.193/W32 for ARM
       Copyright 1999-2019 IAR Systems AB.
       PC-locked license - IAR Embedded Workbench for ARM
    
    Available command line options:
    --aapcs {std|vfp}
                    Specify calling convention.
    --aeabi         Generate aeabi compliant code
    --align_sp_on_irq
                    Generate code to align SP on entry to __irq functions
    --arm           Generate code in arm mode, same as --cpu_mode arm
    --c++           C++
    --c89           Use C89 standard
    --char_is_signed
                    'Plain' char is treated as signed char
    --char_is_unsigned
                    'plain' char is treated as unsigned char
    --cmse          Enable CMSE secure object generation
    --cpu core      Specify target core
                    Valid options are core names such as Cortex-M3
                    and architecture names such as 7M
                    Cortex-M3 is default
    --cpu_mode {arm|a|thumb|t}
                    Select default mode for functions, arm is default
    -D symbol[=value]
                    Define macro (same as #define symbol [value])
    --debug
    -r              Insert debug info in object file
    --dependencies=[i|m|n][s][lw][b] file|directory|+
                    List file dependencies
                       i     Include filename only (default)
                       m     Makefile style (multiple rules)
                       n     Makefile style (one rule)
                       s     Don't include system file dependencies
                       l     Use locale encoding instead of UTF-8
                       w     Use little endian UTF-16 instead of UTF-8
                       b     Use a Byte Order Mark in UTF-8 output
                    (+: output same as -o, only with .d extension)
    --deprecated_feature_warnings [+|-]feature,[+|-]feature,...
                    Enable (+) or disable (-) warnings about deprecated features:
                       attribute_syntax         Warn about attribute syntax that
                                                will change
                       preprocessor_extensions  Warn about use of migration
                                                preprocessor extensions
                       segment_pragmas          Warn about use of #pragma constseg/
                                                dataseg/memory
    --diagnostics_tables file|directory
                    Dump diagnostic message tables to file
    --diag_error tag,tag,...
                    Treat the list of tags as error diagnostics
    --diag_remark tag,tag,...
                    Treat the list of tags as remark diagnostics
    --diag_suppress tag,tag,...
                    Suppress the list of tags as diagnostics
    --diag_warning tag,tag,...
                    Treat the list of tags as warning diagnostics
    --discard_unused_publics
                    Discard unused public functions and variables
    --dlib_config name|path
                    Specify DLib library configuration
    --do_explicit_zero_opt_in_named_sections
                    Allow zero init optimization for variables in named
                    sections/segments
    -e              Enable IAR C/C++ language extensions
    --enable_hardware_workaround waid[,waid[...]]
                    Generate hardware workaround for specified problem
    --enable_restrict
                    Enable the restrict keyword
    --endian {little|l|big|b}
                    Select byte order, little-endian is default
    --enum_is_int   Force the size of all enumeration types to be at least 4 bytes
    --error_limit limit
                    Stop after this many errors (0 = no limit)
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --fpu {VFPv2|VFPv3{_D16}{_FP16}|VFPv4{_sp}|VFP9-S|none}
                    Specify target FPU coprocessor support
                    Default is none, which selects the software
                    floating-point library.
    --generate_entries_without_bounds
                    Generate functions for use from non-instrumented code
    --guard_calls   Use a guard call for a function static initialization
    --header_context
                    Adds include file context to diagnostics
    -I directory    Add #include search directory
    --ignore_uninstrumented_pointers
                    Disable checking of accesses via pointers from uninstrumented
                    functions
    -l[c|C|D|E|a|A|b|B][N][H] file|directory
                    Output list file
                       c     C source listing
                       C        with assembly code
                       D        with pure assembly code
                       E        with non-sequential assembly code
                       a     Assembler file
                       A        with C source
                       b     Basic assembler file
                       B        with C source
                       N     Do not include diagnostics
                       H     Include header file source lines
    --lock_regs registers
                    Prevent compiler from using specified registers (R4-R11).
    --macro_positions_in_diagnostics
                    Use positions inside macros in diagnostics
    --make_all_definitions_weak
                    Make all variable and function definitions weak
    --max_cost_constexpr_call limit
                    Maximum cost (number of calls/number of loop iterations) when
                    evaluating a top-level constexpr call
    --max_depth_constexpr_call limit
                    Maximum depth of recursion when evaluating a top-level
                    constexpr call
    --mfc           Enable multiple file compilation
    --misrac1998[=arg,arg,...]
                    Enable MISRA-C 1998 diagnostics
                        all       Enable all rules
                        required  Enable all required rules
                        i         Enable rule i
                        i-j       Enable rule i through j
                        ~i        Disable rule i
                        ~i-j      Disable rule i through j
    --misrac2004[=arg,arg,...]
                    Enable MISRA-C 2004 diagnostics
                        all       Enable all rules
                        required  Enable all required rules
                        X         Enable rule or chapter
                        X-Y       Enable range
                        ~X        Disable rule or chapter
                        ~X-Y      Disable range
                      where X and Y is one of:
                        i         All rules in chapter i
                        i.j       Rule i.j
    --misrac_verbose
                    Enable verbose MISRA C messages
    --nonportable_path_warnings
                    Enable warning for non-matching case in paths
    --no_alignment_reduction
                    Disable alignment reduction of simple thumb functions
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --no_call_frame_info
                    Suppress output of call frame information
    --no_clustering Disable static clustering for static and global variables
    --no_code_motion
                    Disable code motion
    --no_const_align
                    Turn off the alignment optimization for constants
    --no_cse        Disable common sub-expression elimination
    --no_exceptions Disable C++ exception support
    --no_fragments  Do not generate section fragments
    --no_inline     Disable function inlining
    --no_literal_pool
                    Generate code that does not issue read request to .text
    --no_loop_align Disable alignment of labels in loops (Thumb2)
    --no_mem_idioms Disable idiom recognition for memcpy/memset/memclr
    --no_path_in_file_macros
                    Strip path from __FILE__ and __BASE_FILE__ macros
    --no_rtti       Disable C++ runtime type information support
    --no_rw_dynamic_init
                    Don't allow C-object to be initialized at runtime
    --no_scheduling Disable instruction scheduling
    --no_size_constraints
                    Remove limits for code expansion
    --no_static_destruction
                    Do not emit code to destroy C++ static variables
    --no_system_include
                    Do not search in the default system header directory
    --no_tbaa       Disable type based alias analysis
    --no_typedefs_in_diagnostics
                    Do not use typedefs when printing types
    --no_unaligned_access
                    Don't generate unaligned accesses
    --no_uniform_attribute_syntax
                    Use old meaning for IAR type attributes before initial type
    --no_unroll     Disable loop unrolling
    --no_var_align  Turn off the alignment optimization for variables
    --no_warnings   Disable generation of warnings
    --no_wrap_diagnostics
                    Don't wrap long lines in diagnostic messages
    -O[n|l|m|h|hs|hz]
                    Select level of optimization:
                       n   No optimizations
                       l   Low optimizations (default)
                       m   Medium optimizations
                       h   High optimizations
                       hz  High optimizations, tuned for small code size
                       hs  High optimizations, tuned for high speed
                           (-O without argument) The same setting as -Oh
    --only_stdout   Use stdout only (no console output on stderr)
    --output file|path
    -o file|path    Specify object file
    --pending_instantiations limit
                    Maximum number of instantiations of a given template in
                    progress at a time (0 -> no limit)
    --predef_macros file|directory
                    Output predefined macros
    --preinclude filename
                    Include file before normal source
    --preprocess=[c][n][s] file|directory
                    Preprocessor output
                       c     Include comments
                       n     Preprocess only
                       s     Suppress #line directives
    --public_equ symbol[=value]
                    Define public assembler symbol (EQU)
    --relaxed_fp    Enable floating point optimizations that may affect the result
    --remarks       Enable generation of remarks
    --require_prototypes
                    Require prototypes for all called or public functions
    --ropi          Generate read-only position independent code
    --runtime_checking check,check,...
                    Instrument code to do runtime checks for the selected problems:
                       bounds              Check pointer bounds
                       bounds_no_checks    Track pointer bounds, but emit no checks
                       div_by_zero         Check division by zero
                       implicit_integer_conversion
                                           Check only implicit integer conversion
                       integer_conversion  Check any integer conversion
                       signed_overflow     Check for signed integer overflow
                       signed_shift        Check for overflow in signed shift
                       switch              Check for unhandled cases in switch
                                           statements
                       unsigned_overflow   Check for unsigned integer overflow
                       unsigned_shift      Check for overflow in unsigned shift
    --rwpi          Generate read-write position independent code
    --rwpi_near     Generate read-write position independent code
    --section section-name=new section-name
                    Rename section
    --silent        Silent operation
    --source_encoding {locale|utf8}
                    Encoding to use for source files with no BOM
    --stack_protection
                    Insert stack smash protection
    --strict        Strict C/C++ standard language rules
    --system_include_dir directory
                    Set system header directory
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --thumb         Generate code in thumb mode, same as --cpu_mode thumb
    --uniform_attribute_syntax
                    Same syntax for IAR type attributes as for const/volatile
    --use_c++_inline
                    Use C++ inline semantics in C mode
    --use_paths_as_written
                    Use paths as written in debug information
                    (normally absolute paths are used)
    --use_unix_directory_separators
                    Use forward slashes in paths in debug information
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --vectorize     Perform autovectorization
    --version       Output version information and exit
    --vla           Allow variable length arrays
    --warnings_affect_exit_code
                    Warnings affect exit code
    --warnings_are_errors
                    All warnings are errors
    --warn_about_c_style_casts
                    Warn about uses of C-style casts in EC++/C++
    

    IDE中有两个工具可将应用程序源文件转换为中间文件目标文件。 IAR C / C ++编译器和IAR汇编器。 两者都产生行业标准格式ELF中的可重定位目标文件,包括DWARF调试信息的格式。下图显示了编译过程:
    在这里插入图片描述

    ilinkarm.exe

      这个是 IAR 的连接器。官方文档是这么介绍的:The IAR ILINK Linker for Arm is a powerful, flexible software tool for use in the development of embedded controller applications. It is equally well suited for linking small, single-file, absolute assembler programs as it is for linking large, relocatable input, multi-module, C/C++, or mixed C/C++ and assembler programs. 大意就是:IAR ILINK Linker for Arm是一款功能强大,灵活的软件工具,可用于嵌入式控制器应用程序的开发。 它同样适用于链接小型,单文件,绝对汇编程序,因为它用于链接大型可重定位输入,多模块,C / C ++或混合C / C ++和汇编程序。
      ilinkarm 使用并生成行业标准的ELF和DWARF作为对象格式文件。在.\arm\config目录下,包含了针对各平台的连接器使用的配置文件。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>ilinkarm
    
       IAR ELF Linker V8.32.3.193/W32 for ARM
       Copyright 2007-2019 IAR Systems AB.
    
    Available command line options:
    --advanced_heap Use an advanced heap manager.
    --basic_heap    Use a basic heap manager
    --BE32          Use old type big-endian mode.
    --BE8           Use byte invariant mode.
    --bounds_table_size number_of_records[:number_of_buckets]|(number_of_bytes)
                    Specify size of bounds checking tables
    --call_graph file|directory
                    Produce an XML call graph file
    --config file   Read linker configuration from file
    --config_def symbol=value
                    Define a config symbol
    --config_search directory
                    Look for config files in directory
    --cpp_init_routine symbol
                    Specify C++ dynamic init routine name
    --cpu core      Specify target core
                    Valid options are core names such as Cortex-M3
                    and architecture names such as 7M
                    default is extracted from objects
    --debug_heap    Use heap with runtime checks
    --default_to_complex_ranges
                    Make "complex ranges" the default in initialize directives
    --define_symbol symbol=value
                    Define absolute symbol
    --dependencies=[i|m|n][s][lw][b] file|directory|+
                    List file dependencies
                       i     Include filename only (default)
                       m     Makefile style (multiple rules)
                       n     Makefile style (one rule)
                       s     Don't include system file dependencies
                       l     Use locale encoding instead of UTF-8
                       w     Use little endian UTF-16 instead of UTF-8
                       b     Use a Byte Order Mark in UTF-8 output
                    (+: output same as -o, only with .d extension)
    --diagnostics_tables file|directory
                    Dump diagnostic message tables to file
    --diag_error tag,tag,...
                    Treat the list of tags as error diagnostics
    --diag_remark tag,tag,...
                    Treat the list of tags as remark diagnostics
    --diag_suppress tag,tag,...
                    Suppress the list of tags as diagnostics
    --diag_warning tag,tag,...
                    Treat the list of tags as warning diagnostics
    --do_segment_pad
                    Pad segments to 4 byte alignment
    --enable_hardware_workaround waid[,waid[...]]
                    Generate hardware workaround for specified problem
    --enable_stack_usage
                    Enable stack usage analysis
    --entry symbol  Set program entry point
    --error_limit limit
                    Stop after this many errors (0 = no limit)
    --exception_tables action
                    Generate exception tables for modules lacking them
                      nocreate    Do not generate entries (default)
                      unwind      Generate unwind entries
                      cantunwind  Generate nounwind entries
    --export_builtin_config file|directory
                    Export the builtin configuration
    --extra_init routine
                    Call extra init routine if defined
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --force_exceptions
                    Always include exception code
    --force_output  Produce an output file in spite of errors
    --fpu {VFPv1|VFPv2|VFPv3{_D16}{_FP16}|VFP9-S|none}
                    Specify target FPU coprocessor support
                    Default is extracted from objects.
    --ignore_uninstrumented_pointers
                    Disable checking of accesses via pointers in memory with
                    no bounds
    --image_input file[,symbol[,section[,alignment]]]
                    Put image file in section
    --import_cmse_lib_in file
                    Read previous version of import library for building non-secure image
    --import_cmse_lib_out file|directory
                    Produce import library for building non-secure image
    --inline        Try to inline small functions.
    --keep symbol   Require global symbol
    --log topic,topic,...
                    Do log output for the selected topics
                       call_graph        Call graph with stack usage
                       crt_routine_selection
                                         CRT routine implementation selection
                       demangle          Demangle symbols in log output
                       fragment_info     Supplementary info for --log sections
                       initialization    Initialization decisions
                       inlining          Small function inlining
                       libraries         Automatic library selection
                       merging           Results of --merge_duplicate_sections
                       modules           Module selection
                       redirects         Redirected symbols
                       sections          Section fragment selection
                       unused_fragments  Unused section fragments
                       veneers           Veneer statistics
    --log_file file Specify file for log output
    --mangled_names_in_messages
                    Include mangled symbol names in diagnostics
    --manual_dynamic_initialization
                    Don't perform dynamic initialization during startup
    --map file|directory
                    Produce a linker list file
    --merge_duplicate_sections
                    Merge equivalent read-only sections
    --misrac1998[=arg,arg,...]
                    Enable MISRA-C 1998 diagnostics
                        all       Enable all rules
                        required  Enable all required rules
                        i         Enable rule i
                        i-j       Enable rule i through j
                        ~i        Disable rule i
                        ~i-j      Disable rule i through j
    --misrac2004[=arg,arg,...]
                    Enable MISRA-C 2004 diagnostics
                        all       Enable all rules
                        required  Enable all required rules
                        X         Enable rule or chapter
                        X-Y       Enable range
                        ~X        Disable rule or chapter
                        ~X-Y      Disable range
                      where X and Y is one of:
                        i         All rules in chapter i
                        i.j       Rule i.j
    --misrac_verbose
                    Enable verbose MISRA C messages
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --no_dynamic_rtti_elimination
                    Disable dynamic rtti elimination
    --no_entry      This program has no entry point
    --no_exceptions Signal an error if exceptions are used
    --no_fragments  Always link entire sections
    --no_free_heap  Use a heap manager with no 'free'
    --no_inline func,func,...
                    Do not inline any of the specified functions
    --no_library_search
                    Disable automatic runtime library search
    --no_literal_pool
                    Don't generate literal pool in code memory
    --no_locals     Do not include local symbols in output symbol table
    --no_range_reservations
                    Do not reserve address ranges for absolute symbols
    --no_remove     Do not remove unused sections
    --no_vfe        Disable Virtual Fuction Elimination
    --no_warnings   Disable generation of warnings
    --no_wrap_diagnostics
                    Don't wrap long lines in diagnostic messages
    --only_stdout   Use stdout only (no console output on stderr)
    --output file
    -o file         Specify output file
    --pi_veneers    Generate position independent veneers.
    --place_holder symbol[,size[,section[,alignment]]]
                    Reserve a place in ROM for later use
    --preconfig file
                    Read before normal linker configuration file
    --printf_multibytes
                    Enable multibyte support in printf & friends
    --redirect orig=replacement
                    Redirect symbol refs to replacement symbol
    --remarks       Enable generation of remarks
    --scanf_multibytes
                    Enable multibyte support in scanf & friends
    --search directory
    -L directory    Look for object and library files in directory
    --semihosting[=iar_breakpoint]
                    Link with debug interface.
                    Specify interface to override default.
    --silent        Silent operation
    --stack_usage_control file
                    Read stack usage control file
    --strip         Do not include debug information
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --threaded_lib  Configure runtime library for use with threads
    --timezone_lib  Enable timezone and daylight savings support
    --treat_rvct_modules_as_softfp
                    link softfp versions of math function for modules
                    compiled with RVCT even though they are built with
                    vfp calling-convention
    --use_full_std_template_names
                    Don't use short names for standard C++ templates
    --use_optimized_variants no|auto|small|fast
                    Use optimized variants of DLIB library functions
                      no     Do not use redirects to use optimized variants
                      auto   Use redirects based on attributes in object files
                             (default)
                      small  Always use a small variant if available
                      fast   Always use a fast variant if available
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --version       Output version information and exit
    --vfe=[forced]  Perform Virtual Function Elimination
                      forced      Force the use of VFE for all modules
                                  with VFE information.
    --warnings_affect_exit_code
                    Warnings affect exit code
    --warnings_are_errors
                    All warnings are errors
    --whole_archive archive
                    Link all modules in archive
    

    IAR ILINK链接器(ilinkarm.exe)用于构建最终应用程序。通常,链接器需要以下信息作为输入:

    • 几个目标文件,可能还有某些库
    • 程序开始标签(默认设置)
    • 链接器配置文件,用于描述目标系统内存中代码和数据的放置

    下图显示了链接过程:
    在这里插入图片描述
    IAR ILINK链接器生成ELF格式的绝对目标文件,其中包含可执行镜像。 链接后,可以使用生成的绝对可执行映像

    • 加载到IAR C-SPY调试器或任何其他兼容的外部调试器读取ELF和DWARF。
    • 使用flash / PROM编程器对flash / PROM进行编程。 在此之前可能必须使用ielftool将镜像中的实际字节转换为标准的Motorola 32-bit S-record 格式或Intel Hex-32格式。

    iarchive.exe

    档案管理工具,类似于 ARM 的 armar 和 GCC 的 ar。用于创建和操作几个ELF目标文件的库(存档)。库文件包含多个可重定位的ELF对象模块,每个模块都可以由链接器独立使用。 与直接指定给链接器的对象模块相比,只有在需要时才包含库中的每个模块。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iarchive
    
       IAR Archive Tool V10.4.14.1149
       Copyright 2008-2019 IAR Systems AB.
    
    Usage:          iarchive [command] archive obj1 ... objN
                    iarchive [command] obj1 ... objN -o archive
                    iarchive [command] archive
    
    Available command line options:
    --create        Create new archive
    --delete
    -d              Delete module(s) from archive
    --extract
    -x              Extract module(s) from archive
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --output archive
    -o archive      Name of archive file
    --replace
    -r              Replace or add module(s) to archive
    --symbols       List symbol table of archive
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --toc
    -t              List archive table of content
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --verbose
    -V              verbose operation
    --version       Output version information and exit
    --vtoc          List archive table of content (verbose)
    

    使用示例:

    1. 使用源对象文件module1.omodule.2.omodule3.o 创建了一个名为mylibrary.a的库文件:iarchive mylibrary.a module1.o module2.o module3.o
    2. 列出 mylibrary.a中的内容:iarchive --toc mylibrary.a
    3. This example replaces module3.o in the library with the content in the module3.o file and appends module4.o to mylibrary.a:iarchive --replace mylibrary.a module3.o module4.o

    ielftool.exe

    ARM ELF文件工具,类似于 ARM 的 fromelf 和 GCC 的 elfedit。对ELF可执行映像执行各种转换(例如,填充,校验和,格式转换等)。安装目录.\arm \ src\elfutils下提供了 ielftool 源代码(Microsoft VisualStudio项目)。 如果对如何生成校验和或格式转换要求有特定要求,则可以相应地修改源代码。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iarchive
    
       IAR Archive Tool V10.4.14.1149
       Copyright 2008-2019 IAR Systems AB.
    
    Usage:          iarchive [command] archive obj1 ... objN
                    iarchive [command] obj1 ... objN -o archive
                    iarchive [command] archive
    
    Available command line options:
    --create        Create new archive
    --delete
    -d              Delete module(s) from archive
    --extract
    -x              Extract module(s) from archive
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --output archive
    -o archive      Name of archive file
    --replace
    -r              Replace or add module(s) to archive
    --symbols       List symbol table of archive
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --toc
    -t              List archive table of content
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --verbose
    -V              verbose operation
    --version       Output version information and exit
    --vtoc          List archive table of content (verbose)
    
    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>ielftool
    
       IAR ELF Tool V10.4.14.1149 [BUILT at IAR]
       Copyright 2007-2019 IAR Systems AB.
    
    Usage:       ielftool input_file output_file
    
    Available command line options:
    --bin           Save as raw binary
    --checksum sym:size,algo[:[1|2][a|m|z][r][R][o][x][i|p][W|L]][,start]
               ;range[;range...]
                    Generate checksum
                       sym       Checksum symbol
                       size      Length of the symbol in bytes
                       algo      Algorithm: sum, sum8wide, sum32, crc16, crc32
                                 crc64iso, crc64ecma or crc=poly
                       1|2       Complement: 1 or 2
                       a|m|z     Reverse the bit order for:
                                   input bytes only: a
                                   input bytes and final checksum: m
                                   final checksum only: z
                       o         Output the Rocksoft model specification
                       r         Reverse the byte order within each word
                       R         Traverse the range(s) in reverse order
                       x         Toggle the endianess of the checksum
                       i|p       Use initial value normally: i
                                 Prefix input data with the start value: p
                       W|L       Use a checksum unit length of 2 bytes: W
                                 Use a checksum unit length of 4 bytes: L
                       start     Initial checksum value (defaults to 0)
                       range     Do checksum of bytes in range
    --fill [v;]pattern;range[;range...]
                    Specify fill
                       v         Virtual fill, do not generate actual filler bytes.
                                 This can be used for checksums and parities.
                       pattern   Sequence of filler bytes
                       range     Fill range
    --front_headers Move program and section headers to the front of the ELF file.
    --ihex          Save as 32-bit linear Intel Extended hex
    --offset [-]offset
                    Add (subtract if - is used) offset to all address records.
                    This only works for the output formats: Motorola S-records,
                    Intel Hex, Simple-Code and TI-TXT
    --parity sym:size,algo:flashbase[:[r][[B|W|L]];range[;range...]
                    Generate parity bits
                       sym       Parity symbol
                       size      Length of the symbol in bytes
                       algo      Parity algorithm: odd, even
                       flashbase Ignore bytes before this address
                       r         Traverse the range(s) in reverse order
                       B         Use a parity unit length of 1 byte
                       W         Use a parity unit length of 2 bytes
                       L         Use a parity unit length of 4 bytes
                       range     Perform parity on bytes in this range
    --self_reloc relocator[,jtc]
                    Create self-relocating image with relocator
                       jtc       Number of jump table entries
    --silent        Silent operation
    --simple        Save as Simple-code
    --simple-ne     Save as Simple-code without entry record
    --srec          Save as Motorola S-records
    --srec-len length
                    Restrict the length of S-records
    --srec-s3only   Restrict the type of S-records to S3 (and S7)
    --strip         Remove all section headers and non-program sections
    --titxt         Save as Texas Instruments TI-TXT
    --verbose       Print all performed operations
    --version       Output tool version
    

    使用示例:

    1. This example fills a memory range with 0xFF and then calculates a checksum on the same range:ielftool my_input.out my_output.out --fill 0xFF;0–0xFF --checksum __checksum:4,crc32;0–0xFF

    ielfdumparm.exe

    针对 ARM ELF 格式的文件的 Dumper工具。类似于 GCC 的 objdump,用于创建ELF可重定位或可执行映像内容的文本表示。主要用于以下三个方面:

    • To produce a listing of the general properties of the input file and the ELF segments and ELF sections it contains. This is the default behavior when no command line options are used.生成输入文件的常规属性列表以及它包含的ELF段和ELF节。 当没有使用命令行选项时,这是默认行为。
    • To also include a textual representation of the contents of each ELF section in the input file. To specify this behavior, use the command line option --all .还包括输入文件中每个ELF部分内容的文本表示。 要指定此行为,请使用命令行选项–all。
    • To produce a textual representation of selected ELF sections from the input file. To specify this behavior, use the command line option --section 从输入文件生成所选ELF节的文本表示。 要指定此行为,请使用命令行选项–section
    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>ielfdumparm
    
       IAR ELF Dumper V8.32.3.193 for ARM
       Copyright 2007-2019 IAR Systems AB.
    
    Usage:          IElfDump input_file [output_file]
    
    Available command line options:
    -a              All sections, except strtab sections
    --aarch64       Disassemble in Aarch64 mode if mode cannot be deduced by the image.
    --all           Dump all sections
    --arm           Disassemble in Arm mode if mode cannot be deduced by the image.
    --code          Dump only code sections
    --disasm_data   Use disassembly format for data sections
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --no_header     Do not produce a list header
    --no_rel_sections
                    Do not output associated .rel sections
    --no_strtab     Do not include strtab sections
    --no_utf8_in    Non-IAR input files are by default assumed to use UTF-8
                    encoding unless this option is used.
    --output file
    -o file         Name of text file to create
    --range A-B     Disassemble only addresses in the specified range
                    (from A to B).
    --raw           Use raw text format
    --section #|name[,...]
    -s #|name[,...] Dump only section(s) with given numbers/names
    --source        Include source in disassembled code in executables
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --thumb         Disassemble in thumb mode if mode cannot be deduced by the image.
    --use_full_std_template_names
                    Don't use short names for standard C++ templates
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --version       Output version information and exit
    

    iobjmanip.exe

    针对 ARM ELF 格式的 Object 文件的操作工具。用于执行ELF目标文件的低级操作。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iobjmanip
    
    
       IAR Object File Manipulator V10.4.14.1149
       Copyright 2009-2019 IAR Systems AB.
    
    Usage:          iobjmanip <op1>[,...<opN>] <src> <dest>
    
    Available command line options:
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --remove_file_path
                    remove path information from file symbol
    --remove_section #|name
                    remove matching section(s)
    --rename_section (#|name)=name
                    rename matching section(s)
    --rename_symbol name=name
                    rename matching symbol
    --strip         strip debug information
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --version       Output version information and exit
    

    使用示例:

    1. This example renames the section .example in input.o to .example2 and stores the result in output.o:iobjmanip --rename_section .example=.example2 input.o output.o

    isymexport.exe

    绝对符号导出器。 从ROM映像文件中导出绝对符号,以便在链接附加应用程序时使用它们。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>isymexport
    
       IAR Absolute Symbol Exporter V10.4.14.1149
       Copyright 2008-2019 IAR Systems AB.
    
    Usage:          ISymExport input_file output_file
    
    Available command line options:
    --edit steering_file
                    Show/hide/rename symbols
    --export_locals[=symbol_prefix]
                    Export local variable and function symbols
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --generate_vfe_header
                    Generate vfe header section
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --ram_reserve_ranges[=symbol_prefix]
                    Generate symbols to reserve all occupied RAM ranges
    --reserve_ranges[=symbol_prefix]
                    Generate symbols to reserve all occupied ranges
    --show_entry_as[=name]
                    Export the entry point of the program as name
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --version       Output version information and exit
    

    iexe2obj.exe

    IAR ELF可重定位对象创建器。从可执行的ELF目标文件创建可重定位的ELF目标文件。

    E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iexe2obj
    
       IAR ELF Exe to Object Tool V10.4.14.1149
       Copyright 2008-2019 IAR Systems AB.
    
    Usage:          IExe2Obj input_file output_file
    
    Available command line options:
    -f file         Read command line options from file
    --f file        Read command line options from file and report dependency
    --hide_symbols  Hide all symbols in the image
    --keep_mode_symbols
                    Keep mode symbols in the image
    --no_bom        Don't use a Byte Order Mark in Unicode output
    --prefix prefix Set section/symbol name prefix
    --text_out encoding
                    Encoding to use for text output files
                       utf8                UTF-8
                       utf16le             Little-endian UTF-16
                       utf16be             Big-endian UTF-16
                       locale              Locale specific encoding
    --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
    --version       Output version information and exit
    --wrap function Create wrapper for function
    

    GCC for ARM

      GCC 全称为 GNU Compiler Collection。 GCC 是几种主要编程语言的编译器的集成分发。 这些语言目前包括 C,C ++,Objective-C,Objective-C ++,Fortran,Ada,Go 和 BRIG(HSAIL)。
      GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。 更名之后,原来的针对于 C 语言的编译器名字还叫 gcc,针对 C++ 的编译器叫做 g++ 。
      GCC for ARM 则是基于 GCC 开发的,用来编译生成 ARM 内核可执行文件的编译套件,俗称 ARM 交叉编译套件。 相比于以上两个巨贵的编译器,GCC for ARM 因为是基于开源的 GCC 的,因此是免费的。目前主要由三大主流工具商提供,第一是 ARM,第二是 Codesourcery,第三是 Linora。目前我们用的针对 ARM 芯片的集成开发环境(IDE),除了 IAR 和 ARM 自己的 Keil、DS 等都是使用 GCC for ARM 的编译器!

    首先,看看 ARM 交叉编译工具链的命名规则:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]

    • arch: 体系架构,如 ARM,MIPS
    • vendor: 工具链提供商,没有 vendor 时,用 none 代替;
    • os: 目标操作系统,没有 os 支持时,也用 none 代替
    • eabi: 嵌入式应用二进制接口(Embedded Application Binary Interface)

    如果同时没有 vendor 和 os 支持,则只用一个 none 代替。例如 arm-none-eabi 中的 none 表示既没有 vendor 也没有 os 支持。 前面说过,GCC for ARM 则是基于 GCC 开发的。因此,其和 GCC 一样是一套命令行工具的集合,理论上可以将它集成到其他任何集成开发环境中,从而不直接使用命令行。GCC for ARM 中的各命令行工具与 GCC 中的各命令行工具都是对应的,功能基本一致,仅仅是名字有些改变!

    Codesourcery Toolchain

      Codesourcery推出的产品叫 Sourcery G++ Lite Edition,其中基于 command-line 的编译器是免费的,在官网上可以下载,而其中包含的 IDE 和 debug 工具是收费的。Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的ARM交叉编译工具。可用于交叉编译 ARM MCU 芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。
      目前 CodeSourcery 已经由明导国际(Mentor Graphics)收购,所以原本的网站风格已经全部变为 Mentor 样式,这货被收之后,不知道怎么下载其编译工具链。。。

    • arm-none-linux-gnueabi-gcc: 用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
    • arm-none-elf-gcc: 用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。

    Linaro Toolchain

       Linaro 是在 2010 年台北国际计算机展( COMPUTEX )期间,ARM、Freescale、Samsung ,ST-Ericsson、德州仪器(TI)与IBM等6家大厂,宣布合资成立的非赢利 Linux 基础架构软件研发商。其基于 GCC 推出的 ARM 交叉编译工具如下图所示:
    在这里插入图片描述
    下载地址为:https://www.linaro.org/downloads/ 。从上图不难看出,Linaro 提供的交叉编译环境,仅针对于Cortex-A 内核,其他 ARM 内核则需要去 ARM 官网下载!

    • aarch64-linux-gnu: 针对于目标平台是 Linux 系统,用于交叉编译 ARMv8 64位目标中的裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。
    • arm-linux-gnueabihf: 针对于目标平台是 Linux 系统,用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和 App 应用程序。
    • arm-eabi-gcc: 用于编译 ARM 架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application
    • aarch64-elf: 用于编译 ARM v8 64位 架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application

      正如官网的说明,官方发布的编译好二进制可执行编译器文件,仅在 Linux 系统( Ubuntu LTS)进行了测试。 目前,官方没有提供其他平台的可执行程序!

    ARM Toolchain

      ARM 除了有自己的专用编译器之外,还维护了一套基于 GCC 的交叉编译工具链。估计是为了能更有效的占有市场吧!绝大多数第三方的 IDE 都是使用这一套交叉编译工具链。

    arm-none-eabi

      用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),所以不支持那些跟操作系统关系密切的函数,比如fork,它使用的是 newlib 这个专用于嵌入式系统的C库。
      作为维持和增强 GCC 编译器支持 ARM 架构的持续承诺的一部分,ARM 正在维护一个 GNU 工具链,其 GCC 源分支针对嵌入式 ARM 处理器,即 Cortex-R / Cortex-M处理器系列,覆盖 Cortex-M0 ,Cortex-M3,Cortex-M4,Cortex-M0 +,Cortex-M7,Armv8-M基线和主线,Cortex-R4,Cortex-R5,Cortex-R7和Cortex-R8。
      作为其中的一部分,ARM 定期发布来自 ARM 嵌入式分支的预构建和测试二进制文件。 这些改进可以免费集成到第三方工具链中,也可以由最终用户直接下载。整套工具链包含以下组件:

    • gcc : gcc-8-branch revision 267074
      svn://gcc.gnu.org/svn/gcc/branches/gcc-8-branch
    • binutils : 2.31 with mainline backports
      git://sourceware.org/git/binutils-gdb.git commit fe554d200d1befdc3bddc9e14f8593ea3446c351
    • newlib and newlib-nano :
      git://sourceware.org/git/newlib-cygwin.git commit df6915f029ac9acd2b479ea898388cbd7dda4974
    • gdb : 8.2 without target sim support
      git://sourceware.org/git/binutils-gdb.git commit fe554d200d1befdc3bddc9e14f8593ea3446c351

       目前由 ARM 来维护开发。使用 launchpad 来维护该项目源码。但是根据之前的公告,launchpad 上不发布编译好的程序和源码包(“As previously announced all new binary and source packages will not be released on Launchpad henceforth, they can be found on:
    https://developer.arm.com/open-source/gnu-toolchain/gnu-rm.”),只能从 ARM 官网:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads 进行下载。下面是,版本发布时间线
    在这里插入图片描述
    这是目前,我们编写 ARM 裸机程序时,使用最多的交采编译工具链! 安装/解压 之后,目录如下图所示:
    在这里插入图片描述
    编译器工具中的各工具,与标准的GCC没有太多区别,主要就是针对的平台变了。各工具的功能是一样的!比如:arm-none-eabi-gcc.exe 是C 语言编译器、arm-none-eabi-g++.exe 是 C++ 编译器、arm-none-eabi-ld.exe 是连接器、arm-none-eabi-gdb.exe 是调试器等等。

    Cortex-A 专用

      以上交叉编译工具链只支持 ARM Cortex-M/R等系列的核,ARM 官网还提供了针对于 ARM Cortex-A 系列内核的交叉编译工具链,可以从以下地址下载
    https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads。 具体如下所示:
    在这里插入图片描述
    需要注意的是,上图中红框全称的就是编译工具链的名字。以 gcc-arm-8.3-2019.03-i686-mingw32-arm-eabi 为例,解压后如下图所示:
    在这里插入图片描述
    各命令行工具与标准 GCC 也没啥区别!
      再一个需要注意的是,上图中的 i686-mingw32 host 指定是运行平台为 Windows 7 32/64 bits or later;x86_64 host 指定是运行平台为 Ubuntu 14.04 LTS x86_64 or later or RHEL 6 x86_64。也就是说,仅支持 Windows 和 Linux 平台! 整套工具包含以下组件:
    在这里插入图片描述
    再再一个需要注意的是,编译器的目标平台。

    • AArch32 bare-metal target:32位纯裸机平台
    • AArch64 ELF bare-metal target:64位纯裸机平台
    • AArch64 ELF bare-metal, big-endian target:64位纯裸机平台(大端模式)
    • AArch64 GNU/Linux target:64位 Linux 平台
    • AArch64 GNU/Linux big-endian target:64位 Linux 平台(大端模式)
    • AArch32 target with soft float:32位带软件模式浮点运算
    • AArch32 target with hard float:32位带硬件模式浮点运算

    参考

    1. https://www.veryarm.com/
    展开全文
  • IAR For ARM 7.4 破解

    千次下载 热门讨论 2015-03-14 16:25:30
    IAR For ARM 破解工具,亲测7.4、7.3、7.2和7.1能用
  • ARM裸机全集》是朱老师物联网大讲堂嵌入式物联网核心课程中推出的第一环节,正在持续录制中。本课程是全套课程的第1部ARM裸机全集的第一个课程,目的是讲解嵌入式和ARM的一些基本概念,为之后的学习扫清障碍。
  • ARM V7 和 ARM V8的区别

    万次阅读 2018-11-14 17:27:00
    ARM V7版架构 Cortex-A系列: 面向高端的基于虚拟内存的操作系统和用户应用。 Cortex-R系列:针对实时系统。 Cortex-M系列:对微控制器和低成本应用提供优化 ARM V8版架构 ARM V8是ARM公司的第一款64位处理器...
  • ARM学习之图解ARM

    千次阅读 2016-11-29 23:15:05
    arm developer’s guide图:嵌入式arm的基本架构 图:应用软件运行在arm硬件上的抽象图 图:arm memory remap 图: arm内容数据流模型 图:arm在用户模式下可用的寄存器 图:图解状态寄存器 图:完整的...
  • ARM单片机与ARM内核

    千次阅读 2017-10-19 09:44:55
    人们常常把ARM架构和ARM单片机混淆,其实使用ARM内核的单片机有很多,比如ST公司的STM32F103,它就是使用ARM-Cortext M3内核,那么究竟什么是ARM内核呢? MCU(Microcontrol Unit)俗称单片机,它有CPU,ROM,RAM,I/O,...
  • ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版本,不过大多的arm7都不带,而大多的arm9...
  • ARM7、ARM9、ARM11区别

    千次阅读 2014-10-29 20:31:22
    ARM9采用5级流水线的哈佛结构,ARM11为8级流水线哈弗结构(从arm9开始都采用了哈弗结构)。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内...
  • .一. ARM 芯片类型1....-- ARM 核类型 : arm11, arm9, CortexA9;-- 指令架构 : armv7, armv6;芯片 和 核关系 : 芯片包含核; -- 2440 芯片 : 包含 arm9 核; -- 6410 芯片 : 包含 arm11 核; -- 210 芯片 :
  • ARM7、ARM9和ARM11的区别

    千次阅读 2015-10-24 17:57:32
    ARM9采用5级流水线的哈佛结构,ARM11为8级流水线哈弗结构(从arm9开始都采用了哈弗结构)。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内...
  • 1.备份系统之前的源 cp /etc/apt/sources.list/etc/apt/sources.list.bak ...(1)阿里源(arm64,速度快,推荐) deb http://mirrors.aliyun.com/ubuntu-ports/ xenial main deb-src http://mi..
  • ARM学习之ARM体系结构

    千次阅读 2018-08-19 19:35:05
    本文主要针对ARM cortex-A9处理器的研究。 ARM采用的是32位的RISC架构 数据类型: Byte 字节 8bit Halfword 半字 16bit(v4以上版本) Word 字 32bit ARM内核只提供FIQ和IRQ两种中断向量。 ARM支持大端模式和小...
  • 本期课程让大家进一步学到ARM的关键知识:启动方式、内存映射、指令集、寄存器接口等。目标是为下阶段开始使用开发板,自己写ARM裸机程序打好基础。
  • 一文看懂arm架构和x86架构有什么区别

    万次阅读 多人点赞 2019-05-11 20:28:30
    本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能、扩展能力、操作系统的兼容性、软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了arm架构和x86...
  • 1.修改apt数据源 ... 2.开始安装 apt-get install mysql-...https://launchpad.net/ubuntu/bionic/arm64/mysql-server/5.7.30-0ubuntu0.18.04.1 如果安装过程出错,如下: 如下解决: apt --fix-b...
  • 详谈ARM架构与ARM内核发展史

    千次阅读 2020-01-15 09:21:03
    戳蓝字“CSDN云计算”关注我们哦!作者 |架构师技术联盟责编 | 阿秃1、ARM架构与ARM内核1.1ARM架构与内核简述目前为止,ARM总共发布8种架构:ARMv1、ARMv2、...
  • arm寄存器介绍

    千次阅读 2020-07-25 22:55:53
    从事嵌入式arm开发,还是有必要了解下arm的寄存器。虽然现在不要求会写汇编,但是作为一个资深工程师,我们还是需要有读懂汇编代码的能力。 分析内核代码,也少不了与汇编打交道,而汇编语言和平台架构紧密结合,...
  • ARM全解析 ARM8/ARM7/A9/A15等区别

    万次阅读 2017-12-21 13:04:35
    泡泡网CPU频道12月19日 前不久ARM正式宣布推出新款ARMv8架构的Cortex-A50处理器系列产品,以此来扩大ARM在高性能与低功耗领域的领先地位,进一步抢占移动终端市场份额。Cortex-A50是继Cortex-A15之后的又一重量级...
  • Keil(MDK-ARM)介绍、下载、安装与注册

    万次阅读 多人点赞 2016-05-25 21:24:48
    推荐 分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang ...Keil系列教程02_新建基础软件...
  • ARM体系架构总结

    万次阅读 多人点赞 2018-11-30 17:52:21
    一、ARM处理器简介及RISC特点 1、ARM处理器简介:  ARM(Advanced RISC Machines)是一个32位RISC(精简指令集)处理器架构,ARM处理器则是ARM架构下 的微处理器。ARM处理器广泛的使用在许多嵌入式系统。ARM...
  • ARM架构和ARM核区别和联系

    千次阅读 2017-10-28 21:09:30
     到目前为止,随着ARM公司64位处理器如Cortex A15的出现,ARM家族的架构或指令集已经发展到V8版本,下面简要列出了 ARMV1到ARMV8的发展以及处理器的典型代表。图中Architecture就是ARM架构,而Cores就是ARM核。...
  • 1、什么是armarm公司:是英国一家电子公司的名字,该公司成立于1990年11月,是苹果电脑,Acorn电脑集团和VLSI Technology的合资企业。Acorn曾在1985年推出世界上首个商用单芯片RISC(Reduced Instruction Set ...
  • ARM汇编基础之内核寄存器详解

    万次阅读 多人点赞 2020-05-20 21:23:39
    一文教你搞清楚ARM cortex-m3内核的寄存器
  • ARM汇编】第二章:ARM微处理器

    千次阅读 2020-04-25 01:57:22
    文章目录嵌入式系统概述基本概念嵌入式系统的发展发展历史发展趋势组成结构设备驱动层硬件抽象层HAL板级支持包BSP...ARM处理器ARM概述计算机体系结构的分类冯洛伊曼结构哈弗结构ARM技术的发展过程ARM内核的特点RISC...
  • armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它. arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。 armeabi: 第5代、第6代的ARM处理器,早期...
  • arm与powerpc两种处理器跟x86不同,arm与powerpc一样,它们的外设I/O端口是统一编址的,即与物理内存等外设统一编址在4GB的地址空间中(32为处理器)。而x86是将内存单独编址在一个地址空间,外设I/O端口在另外的...
  • ARM 指令集版本和ARM 版本

    千次阅读 2018-01-02 16:38:30
    转载地址:... ...   常常能看到ARM7,ARM9,ARM11,以及armv6k等不同的表达。且在GCC编译中,常常要用到 -march,-mcpu等。他们分别表达什么涵义呢?Sam自己也不很清楚,只是大概有个模糊的概念。今天就仔...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,728
精华内容 67,891
关键字:

arm