1.Introduction
ARM处理器无处不在。到2008年底,基于ARM处理器的设备已制造超过100亿台。到2013年底,ARM处理器的出货量已超过520亿台。读者很可能至少拥有一款包含ARM处理器的产品——例如手机、平板电脑、个人电脑、电视,甚至是汽车。对于那些习惯于个人电脑的程序员来说,可能会惊讶地发现,虽然x86架构非常成功,但它在微处理器总出货量中所占的份额要小得多,约为30亿台设备。
自1985年首次推出ARM1芯片以来,ARM架构已经取得了长足的发展。ARM现已推出了一整个家族的处理器,这些处理器共享通用的指令集和编程模型,并在一定程度上具有向后兼容性。
现在,让我们先简要回顾一下ARM的发展历史。
1.1 History
第一款ARM处理器——ARM1由Acorn Computers有限公司的团队设计,团队由Sophie Wilson和Steve Furber领导,首款芯片于1985年4月生产(并且一次性成功!)。ARM1很快被ARM2取代,ARM2增加了乘法器硬件,并被用于实际系统中,包括Acorn Archimedes个人电脑。
ARM作为一家独立公司于1990年11月在英国剑桥成立,名为Advanced RISC Machines Ltd。它是由苹果电脑(Apple Computers)、Acorn Computers和VLSI Technology共同成立的合资企业,并且已经比其中两家母公司存续的时间更长。最初的12名员工主要来自Acorn Computers内部的团队。将ARM剥离为一家独立公司的一个原因是,该处理器已被苹果电脑选中用于其Newton产品。
新公司迅速决定,推动其技术的最佳方式是授权其知识产权(IP)。他们不再自己设计、制造和销售芯片,而是将设计权出售给半导体公司。这些公司将ARM处理器设计集成到自己的产品中,采用合作伙伴模式。这种IP授权业务是ARM今天继续运营的方式。ARM能够签约多个许可证持有者,其中夏普(Sharp)、德州仪器(Texas Instruments)和三星(Samsung)等是首批客户的知名名称。1998年,ARM在伦敦证券交易所和纳斯达克上市。在撰写本文时,ARM拥有超过2000名员工,并在其原本的处理器设计范围之外有所扩展。ARM还授权物理IP——单元库(如NAND门、RAM等)、图形和视频加速器,以及诸如编译器、调试器和开发板等软件开发产品。
1.2 System-on-Chip (SoC)
如今,设计人员可以组装包含十亿个或更多晶体管的计算机芯片。设计和验证如此复杂的电路已成为一项极其困难的任务。所有这些系统的部件由单一公司设计的情况越来越少。对此,ARM和其他半导体IP公司设计和验证组件(即所谓的IP模块或处理器)。这些组件由半导体公司授权使用,这些公司在自己的设计中使用这些模块,涵盖微处理器、数字信号处理器(DSP)、3D图形和视频控制器,以及许多其他功能。
半导体公司将这些模块与许多其他部件结合在一起,创建一个完整的芯片系统,形成系统级芯片(SoC)。架构师必须选择适当的核心、内存控制器、片上内存、外围设备、总线互连和其他逻辑(可能包括模拟或射频组件),以便生成系统。
应用特定集成电路(ASIC)是我们在书中使用的另一个术语。这是一种针对特定应用设计的集成电路。ASIC可能包含ARM核心、内存和其他组件。显然,ASIC与SoC之间存在很大的重叠。SoC通常指的是具有更高集成度的设备,包括许多系统部件在一个设备中,可能还包括模拟、混合信号或射频电路。
投资数千万美元创建这些设备的半导体公司,通常还会在其平台上投入大量软件开发。制作一个复杂系统并配备强大处理器,而没有至少移植一个或多个操作系统并为外围设备编写驱动程序,这种情况是不常见的。
当然,像Linux这样的操作系统在运行时需要大量内存,这在单个硅器件上通常是难以实现的。因此,系统级芯片(SoC)这个术语并不总是完全准确,因为SoC并不总包含整个系统。除了硅面积的问题外,许多系统中非常有用的部分通常需要专门的硅制造工艺,这使得它们无法放置在同一个芯片上。
1.3 Embedded systems
嵌入式系统通常被定义为运行专门设计软件以执行特定任务的计算机硬件。这类系统的例子包括电视机顶盒、智能卡、路由器、磁盘驱动器、打印机、汽车引擎管理系统、MP3播放器或复印机。这些与通常被认为的计算机系统形成对比,后者运行各种通用软件,并拥有输入和输出设备,例如键盘和某种类型的图形显示器。
这种区分正变得越来越模糊。以手机为例,基本款手机可能仅具备拨打电话的功能,但现代智能手机可以运行复杂的操作系统,提供数以千计的可供下载的应用程序。
嵌入式系统可以包含非常简单的8位微处理器,如Intel 8051或PIC微控制器,也可以使用更复杂的32位或64位处理器,如本书中描述的ARM系列处理器。它们需要RAM和某种形式的非易失性存储,以容纳系统要执行的程序。这些系统几乎总是会有与设备实际功能相关的附加外围设备——通常包括UART、中断控制器、定时器、GPIO控制器,也可能包括相当复杂的模块,如GPU或DMA控制器。
运行在这些系统上的软件通常分为两个部分:操作系统(OS)和在OS上运行的应用程序。本书主要集中在Linux的实例上。Linux的源代码可以轻松获取供读者查看,并且许多程序员可能对此已经很熟悉。然而,从Linux中学到的经验同样适用于其他操作系统。
嵌入式系统
在许多系统中,为了降低成本(和功耗),内存大小可能受到限制。您可能需要考虑程序的大小以及如何在运行时减少内存使用。
实时行为
某些系统的一个特征是需要在外部事件发生时快速响应。这可能是一个“硬性”要求(例如,汽车刹车系统必须在特定时间内响应)或“软性”要求(例如,音频处理必须在一定时间框架内完成,以避免糟糕的用户体验——但在极少数情况下未能做到这一点可能并不会使系统失效)。
能量
在许多嵌入式系统中,电源通常是电池,程序员和硬件设计师必须非常小心,以最大程度地减少系统的总能耗。例如,可以通过降低时钟频率、降低供电电压或在没有工作时关闭核心来实现这一目标。
成本
降低物料成本对系统设计是一个显著的约束。
上市时间
在竞争激烈的市场中,开发出一款可用产品的时间会对产品的成功产生重大影响。