嵌入式Linux系统开发教程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-31 16:55:09

点击下载

作者:华清远见嵌入式学院

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

嵌入式Linux系统开发教程

嵌入式Linux系统开发教程试读:

前言

随着嵌入式及物联网技术的快速发展,ARM处理器已经广泛地应用到了工业控制、智能仪表、汽车电子、医疗电子、军工电子、网络设备、消费类电子、智能终端等领域。而较新的ARM Cortex-A9架构的四核处理器,更是由于其优越的性能被广泛应用在中高端的电子产品市场。比如基于ARM Cortex-A9的三星Exynos 4412处理器就被应用在三星GALAXY Note II智能手机上。

另一方面,Linux内核由于其高度的稳定性和可裁剪性等特点,被广泛地应用到嵌入式系统中,其中Android系统就是一个典型的例子。这样,ARM处理器和Linux操作系统紧密地联系在一起。所以,基于ARM和Linux的嵌入式系统得到了快速的发展。

目前,针对上述两方面完整涵盖的书籍较少,或者就是相对较老的ARM体系结构及较低版本的Linux内核。为了能够跟上嵌入式Linux技术发展的步伐,促进嵌入式技术的推广,华清远见研发中心自主研发了一套基于Exynos 4412处理器的开发板FS4412,并组织编写了本书。本书注重实践、实用,本着从解决问题的角度出发,既给出了解决问题的方法,又给出了如何逐步解决问题的过程。

本书将ARM处理器和嵌入式Linux系统融为一体,形成了一套较完整的嵌入式Linux系统开发教程。全书共11章,循序渐进地讲解了嵌入式Linux系统开发所涉及的核心技术和一些经验、方法。本书主要分四个部分,第一部分(第1章和第2章)介绍了嵌入式系统和ARM处理器的概况;第二部分(第3章和第4章)介绍Linux下的软件开发;第三部分(第5章)介绍U-Boot的移植;第四部分(第6~11章)介绍Linux内核、驱动的移植,根文件系统的制作及Qt的移植。各章节的主要内容如下。

第1章对嵌入式系统有一个整体的概述,主要介绍当前比较流行的嵌入式操作系统,并着重介绍嵌入式Linux系统。

第2章介绍ARM处理器的整体情况,主要介绍ARM处理器的家族系列、常用的指令、寻址方式和常见的基于ARM的SoC,重点介绍Exynos 4412处理器及FS4412开发板。

第3章讲解常用的Linux命令、Shell脚本、正则表达式、Makefile、GNU工具集和Linux编程库。

第4章讲解交叉开发环境,包括交叉编译工具链的安装、串口终端的安装和使用、TFTP和NFS服务器的安装和配置、根文件系统挂载、交叉调试和FS4412开发板的开发环境的搭建实例。

第5章讲解常见的Bootloader、U-Boot常用命令、U-Boot的启动过程及U-Boot的移植过程。

第6章讲解Linux内核的配置及编译,包括Linux内核源码下载、配置、Makefile、Kconfig、配置选项、编译等内容。

第7章讲解Linux内核的移植基础内容,包括内核移植的基本工作、Linux设备树、Linux启动过程的详细讲解。

第8章讲解FS4412开发板上Linux内核的移植实例,包括内核的基础移植、网卡驱动移植、SD/eMMC驱动移植、USB主机控制器驱动移植和LCD驱动移植的详细讲解。

第9章讲解Linux内核的调试技术,包括常用调试方法的介绍、调试相关的配置选项、内核打印函数分析、系统请求键、proc和sys接口、oops及panic信息分析、KGDB源码级内核调试等。

第10章讲解根文件系统的制作和固化,包括根文件系统目录结构、init系统初始化过程、利用Busybox制作根文件系统的过程和根文件系统的固化等。

第11章讲解Qt的移植,包括Qt的下载、配置、编译、安装和在根文件系统中的添加,Qt集成开发环境的安装,在集成开发环境中加入ARM平台的构建环境,Qt应用程序的编译和在开发板上的运行测试等。

本书由华清远见成都中心的姜先刚和袁祖刚编写,其中第1~5章由袁祖刚编写,第6~11章由姜先刚编写,北京中心的刘洪涛完成本书的统稿及审校工作。本书的内容是华清远见嵌入式培训中心所有老师心血的结晶,是多年教学成果的积累。他们认真阅读了书稿,提出了大量的建议,并纠正了书稿中的很多错误,在此表示感谢。

由于作者水平有限,书中不妥之处在所难免,恳请读者批评、指正。对于本书的批评和建议,可以发表到www.farsight.com.cn技术论坛。编者2016年1月第1章嵌入式系统概述1.1嵌入式系统

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。

嵌入式系统与通用计算机系统的本质区别在于系统应用不同。嵌入式系统是将一个计算机系统嵌入到对象系统中。这个对象既可能是庞大的机器,也可能是小巧的手持设备,用户并不关心这个计算机系统的存在。

嵌入式系统一般包含嵌入式微处理器、外围硬件设备、嵌入式操作系统和应用程序4个部分。嵌入式领域已经有丰富的软硬件资源可以选择,涵盖了通信、网络、工业控制、消费电子、汽车电子等各种行业。

嵌入式计算机系统与通用计算机系统相比具有以下特点。(1)嵌入式系统是面向特定系统应用的。嵌入式处理器大多数是专门为特定应用设计的,具有低功耗、体积小、集成度高等特点,一般是包含各种外围设备接口的片上系统。(2)嵌入式系统涉及计算机技术、微电子技术、电子技术、通信和软件等行业。它是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。(3)嵌入式系统的硬件和软件都必须具备高度可定制性。只有这样才能适用嵌入式系统应用的需要,在产品价格性能等方面具备竞争力。(4)嵌入式系统的生命周期相当长。当嵌入式系统应用到产品以后,还可以进行软件升级,它的生命周期与产品的生命周期几乎一样长。(5)嵌入式系统不具备本地系统开发能力,通常需要有一套专门的开发工具和环境。

在计算机后PC技术时代,嵌入式系统已拥有较大的市场。计算机和网络已经全面渗透到日常生活的每一个角落。各种各样的新型嵌入式系统设备在应用数量上已经远远超过通用计算机,任何一个普通人可能拥有各种使用嵌入式技术的电子产品,小到MP3、PDA等微型数字化产品,大到网络家电、智能家电、车载电子设备等。而在工业和服务领域中,使用嵌入式技术的数字机床、智能工具、工业机器人、服务机器人也将逐渐改变传统的工业和服务方式。

美国著名的未来学家尼葛洛庞帝在1999年访华时曾预言,四五年后嵌入式系统将是继PC和Internet之后最伟大的发明之一。这个预言已经成为现实,现在的嵌入式系统正处于高速发展阶段。

目前BAT(百度、阿里巴巴、腾讯)等在移动互联上激烈拼杀。现实中的穿戴设备、智能手机、物联网和云互联等也广泛运用起来,嵌入式设备、移动端APP等技术开发浪潮正汹涌而来。1.2嵌入式操作系统

嵌入式操作系统的一个重要特性是实时性。所谓实时性,就是在确定的时间范围内响应某个事件的特性。操作系统的实时性在某些领域是至关重要的,比如工业控制、航空航天等领域。想象飞机正在空中飞行,如果嵌入式系统不能及时响应飞行员的控制指令,那么极有可能导致空难事故。有些嵌入式系统应用并不需要绝对的实时性,比如PDA播放音乐,个别音频数据丢失并不影响效果。这可以使用软实时的概念来衡量。

随着越来越多的智能硬件产品的流行,各大企业也纷纷加入到智能产品的开发浪潮中,如阿里巴巴成立智能生活事业部,腾讯推出TOS+开放平台,百度推出BaiduInside计划,京东、小米、360等公司智能硬件相关业务也在不断完善。从穿戴设备到无人机的流行,再到无人汽车的发展,可以说嵌入式技术的发展迎来新的高潮,目前市场上对于嵌入式开发人才的需求十分火爆。

炙手可热的“智能硬件”是移动互联网与传统制造业的结合产品,目前应用主要集中在智能家居、可穿戴设备、医疗健康以及车联网四大类。对于这个市场,除了大佬之外,互联网创业者们更是趋之若鹜。一大批创客涌现出来,众多创业孵化基地纷纷成立,加上政策的利好,可以预见嵌入式开发前景将是一片光明,未来的生活将会越来越智能。

据调查,目前全世界的嵌入式操作系统已经有两百多种。从20世纪80年代开始,出现了一些商用嵌入式操作系统,它们大部分都是为专有系统而开发的。随着嵌入式领域的发展,各种各样嵌入式操作系统相继问世。有许多商业的嵌入式操作系统,也有大量开放源码的嵌入式操作系统。其中著名的嵌入式操作系统有μC/OS、VxWorks、Neculeus、Linux和Windows CE等。下面介绍一些主流的嵌入式操作系统。(1)Linux:在所有的操作系统中,Linux是一个发展快、应用广泛的操作系统。Linux本身的种种特性使其成为嵌入式开发中的首选。在进入市场的头两年中,嵌入式Linux设计通过广泛应用获得了巨大的成功。随着嵌入式Linux的成熟,提供更小的尺寸和更多类型的处理器支持,并从早期的试用阶段迈进到嵌入式的主流,它抓住了电子消费类设备开发者们的想象力。随着芯片处理能力的逐步提升,智能手机、平板电脑等设备的广泛运用,Linux系统成为了嵌入式开发的主流操作系统。

嵌入式Linux版本还有多种变体。例如:RTLinux通过改造内核实现了实时的Linux;RTAI、Kurt和Linux/RK也提供了实时能力;还有μCLinux去掉了Linux的MMU(内存管理单元),能够支持没有MMU的处理器等。(2)μC/OS:μC/OS是一个典型的实时操作系统。该系统从1992年开始发展,目前流行的是第2个版本,即μC/OS II。它的特点是公开源代码、代码结构清晰、注释详尽、组织有条理、可移植性好;可裁剪、可固化;抢占式内核,最多可以管理60个任务。自从清华大学邵贝贝教授将Jean J.Labrosse的μC/OS-Ⅱ:the Real Time Kernel翻译后,在国内掀起μC/OS II的热潮,特别是在教育研究领域。该系统短小精悍,是研究和学习实时操作系统的首选。(3)Windows CE:Windows CE是微软的产品,它是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。Windows CE采用模块化设计,并允许它对于从掌上电脑到专用的工控电子设备进行定制。操作系统的基本内核需要至少200KB的ROM。从SEGA的DreamCast游戏机到现在大部分的高端掌上电脑都采用了Windows CE。

随着嵌入式操作系统领域日益激烈的竞争,微软不得不应付来自Linux等免费系统的冲击。微软在Windows CE.Net 4.2版中,将增加一项授权价仅3美元的精简版本WinCE.Net Core。WinCE.Net Core具有基本的功能,包括实时OS核心(Real Time OS Kernel)、档案系统;IPv4、IPv6、WLAN、蓝牙等联网功能;Windows Media Codec;.Net开发框架以及SQL Server.ce。微软推出低价版本WinCE.Net,主要是看好语音电话、WLAN的无线桥接器和个性化视听设备的成长潜力。(4)VxWorks:VxWorks是WindRiver公司专门为实时嵌入式系统设计开发的操作系统软件,为程序员提供了高效的实时任务调度、中断管理,实时的系统资源以及实时的任务间通信。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。该系统主要应用在单板机,数据网络(如以太网交换机、路由器)和通信方面等多方面。其核心功能主要有以下几个。

● 微内核wind。

● 任务间通信机制。

● 网络支持。

● 文件系统和I/O管理。

● POSIX标准实时扩展。

● C++以及其他标准支持。

这些核心功能可以与WindRiver系统的其他附件和Tornado合作伙伴的产品结合在一起使用。谁都不能否认这是一个非常优秀的实时系统,但其昂贵的价格使不少厂商望而却步。(5)QNX:这也是一款实时操作系统,由加拿大QNX软件系统有限公司开发,广泛应用于自动化、控制、机器人科学、电信、数据通信、航空航天、计算机网络系统、医疗仪器设备、交通运输、安全防卫系统、POS机、零售机等任务关键型应用领域。20世纪90年代后期,QNX系统在高速增长的因特网终端设备、信息家电及掌上电脑等领域也得到了广泛应用。

QNX的体系结构决定了它具有非常好的伸缩性,用户可以把应用程序代码和QNX内核直接编译在一起,使之为简单的嵌入式应用生成一个单一的多线程映像。它也是世界上第一个遵循POSIX1003.1标准从零设计的微内核,因此具有非常好的可移植性。嵌入式操作系统的选择是前期设计过程的一项重要工作,这将影响到工程后期的发布以及软件的维护。首先,不管选用什么样的系统,都应该考虑操作系统对硬件的支持。如果选择的系统不支持将来要使用的硬件平台,那么这个系统是不合适的。其次,考虑开发调试用的工具,特别是对于开销敏感和技术水平不强的企业来说,开发工具往往在开发过程中起决定性作用;第三,考虑该系统能否满足应用需求。如果一个操作系统提供出来的API很少,那么无论这个系统有多么稳定,应用层很难进行二次开发,这显然也不是开发人员希望看到的。由此可见,选择一款既能满足应用需求,性价比又可达到最佳的实时操作系统,对开发工作的顺利开展意义非常重大。1.3嵌入式Linux历史

所谓嵌入式Linux,是指Linux在嵌入式系统中应用,而不是什么嵌入式功能。实际上,嵌入式Linux和Linux是同一件事。

我们了解一下Linux的发展历史。

Linux起源于1991年,由芬兰的Linus Torvalds开发,随后按照GPL原则发布。Linux 1.0正式发行于1994年3月,仅支持386的单处理器系统。

Linux1.2发行于1995年3月,它是第一个包含多平台(如Alpha、Sparc、Mips等)支持的官方版本。

Linux2.0发行于1996年6月,包含很多新的平台支持。最重要的是,它是第一个支持SMP(对称多处理器)体系的内核版本。

Linux2.2于1999年1月发布,它带来了SMP系统上性能的极大提升,同时支持更多的硬件。

Linux2.4于2001年1月发布,它进一步提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性,如USB、PC卡(PCMCIA)的支持,内置的即插即用等。

Linux 2.6于2003年12月发布,它的多种内核机制都有了重大改进,无论对大系统还是小系统(PDA等)的支持都有很大提高。

Linux 3.14 版本开始,ARM正式引入了设备树机制,内核的易维护性得到很大提升。

最新的Linux内核版本可以从官方站点获取。

Linux是一种类UNIX操作系统。从绝对意义上讲,Linux是Linus Torvalds维护的内核。现在的Linux操作系统已经包括内核和大量应用程序,这些软件大部分来源于GNU软件工程。因此,Linux又叫做GNU/Linux。

目前Linux操作系统的发行版已经有很多,例如:Redhat Linux、Suse Linux、Turbo Linux等台式机或者服务器版本,还有各种嵌入式Linux版本。不同的Linux版本之间总会有些差异。鉴于UNIX技术历史的教训,LSB(Linux Standard Base)为Linux系统制定了规范。LSB规范定义了几种模块,并且为应用程序定义系统接口和基本配置,为大量的应用程序提供了统一的行业标准。读者可从以下站点可以获取LSB的文档。

ELC(Embedded Linux Consortium,嵌入式Linux联盟)是一个非营利性的、中立的行业协会。它的目标是在嵌入式应用和设备计算市场做Linux的改进、推广和标准化工作。ELC成员贡献会费,并且参与管理、推广、实现和平台规范工作组的维护,谋求不断增长的市场机遇。ELC成员为了API的互用性积极推广了一套平台标准,消除分割并且发布更加具有竞争力的商业方案。

OSDL(Open Source Development Labs,开放源码开发实验室)支持围绕Linux开发和指导的各种活动。它为OSDL协会免费提供硬件资源。OSDL发起了电信Linux(Carrier Grade Linux)和数据中心Linux(Data Center Linux)工作组。这些工作组包含OSDL成员和有兴趣的个人,他们致力于创建特点列表和规范,并且参与开源工程为电信和数据中心进一步开发Linux。OSDL还积极参与内核测试,提供了开放的测试环境(Scalable Test Platform),并且贡献给开发状态的内核测试。

CELF(Consumer Electronics Linux Forum,消费电子Linux论坛)是加州的一个非营利性公司,它致力于把Linux改进成消费电子设备的开放平台。

越来越多的个人、社团和公司已经或正在参与Linux社区的工作,他们为Linux系统开发、测试以及应用作出了大量贡献。这使得嵌入式Linux系统成为标准化的操作系统,功能日趋完善,应用更加广泛。1.4嵌入式Linux开发环境

通用计算机可以直接安装发行版的Linux操作系统,使用编辑器、编译器等工具为本机开发软件,甚至可以完成整个Linux系统的升级。

嵌入式系统的硬件一般有很大的局限性,或者处理器频率很低,或者存储空间很小,或者没有键盘、鼠标设备。这样的硬件平台无法胜任(或者不便于)庞大的Linux系统开发任务。因此,开发者提出了交叉开发环境模型。

交叉开发环境是由开发主机和目标板两套计算机系统构成的。目标板Linux软件是在开发主机上编辑、编译,然后加载到目标板上运行的。为了方便Linux内核和应用程序软件的开发,还要借助各种连接手段。第4章将详细介绍如何建立交叉开发环境。

大量的开源软件和商业的Linux软件共同出现在Linux操作系统上,半导体公司、Linux操作系统公司、第三方软件公司等已经形成庞大的Linux生态系统。任何一家公司都不可能对Linux系统做全面的维护和技术支持。

嵌入式Linux系统的开发工具绝大多数是命令行方式的,这使得学习Linux开发比Windows开发难度更大。商业公司在嵌入式Linux产品开发的时候,希望有更方便、更快捷的开发工具可以使用。因此,嵌入式Linux集成开发环境具有市场需求。

目前,Eclipse已经成为集成开发环境的标准平台。Eclipse是开放的、跨平台的、高度可配置的集成开发环境,它已经被众多嵌入式操作系统厂商定制成自己的集成开发环境。例如:MontaVista公司的DevRocket、TimeSys公司的TimeStorm、Wind River公司的Workbench。

MontaVista DevRocket集成开发环境如图1.1所示。图1.1 MontaVista DevRocket集成开发环境

这些集成开发环境不但能够支持应用程序开发和调试,而且专门提供了内核、文件系统的工程。另外可以集成各种测试工具和版本控制等功能,大大方便了嵌入式Linux开发。1.5嵌入式Linux系统开发要点

嵌入式Linux系统开发就是构建一个Linux系统,这需要熟悉Linux系统组成部分和Linux开发工具,还要熟悉Linux编程。

嵌入式Linux系统包含Bootloader(引导程序)、内核和文件系统3部分。对于嵌入式Linux系统来说,这3个部分是必不可少的。本书将详细分析这3个部分的相关软件开发。

总之,在启动一个嵌入式Linux系统项目之前,必须仔细考虑以下几个要点。(1)选择嵌入式Linux系统发行版。

商业的Linux系统发行版是作为产品开发维护的,须经过严格的测试验证,并且可以得到厂家的技术支持。它为开发者提供了可靠的软件和完整的开发工具包。(2)熟悉开发环境和工具。

交叉开发环境是嵌入式Linux系统开发的基本模型。Linux环境配置、GNU工具链、测试工具,甚至集成开发环境都是开发嵌入式Linux开发的利器。(3)熟悉Linux内核。

因为嵌入式Linux开发一般需要重新定制Linux内核,所以熟悉内核配置、编译和移植也很重要。(4)熟悉目标板引导方式。

开发板的Bootloader负责硬件平台的最基本的初始化,并且具备引导Linux内核启动的功能。由于硬件平台是专门定制的,一般需要修改编译Bootloader。(5)熟悉Linux根文件系统。

Linux离不开文件系统,程序和文件都存放在文件系统中。系统启动必需的程序和文件都必须放在根文件系统中。Linux内核命令行参数可以指定要挂接的根文件系统。(6)理解Linux内存模型。

Linux是保护模式的操作系统。内核和应用程序分别运行在完全分离的虚拟地址空间,物理地址必须映射到虚拟地址才能访问。只有理解Linux内存模型,才能最大程度地优化系统性能。(7)理解Linux调度机制和进程线程编程。

Linux调度机制影响到任务的实时性,理解调度机制可以更好地运用任务优先级。进程和线程编程则是应用程序开发所必需的。

本章描述了ARM体系结构和ARM Linux的发展,介绍了几种应用Linux的典型ARM处理器和开发板。学完本章,读者可以了解嵌入式Linux系统硬件平台的基础知识。第2章ARM处理2.1ARM处理器简介

ARM(Advanced RISC Machines)既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。ARM处理器是一种低功耗、高性能的32位RISC处理器,其应用非常广泛。ARM公司自身并不制造微处理器,而是由ARM的合作伙伴来制造。

采用RISC架构的ARM微处理器一般具有如下特点。

● 体积小、低功耗、低成本、高性能。

● 支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8位/16位器件。

ARM微处理器支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%及以上的存储空间,同时具备32位代码的所有优点。

● 大量使用寄存器,指令执行速度更快。

ARM处理器共有37个寄存器,被分为若干个组(BANK),分别如下。

■31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。

■6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位。概括地讲,ARM体系结构中各寄存器的使用方式可以归纳如表2.1所示。表2.1 ARM寄存器使用方式

● 大多数数据操作都在寄存器中完成。

● 寻址方式灵活简单,执行效率高。

● 指令长度固定。

为了保证ARM处理器具有高性能的同时,进一步减少芯片的体积和功耗,ARM处理器采用了以下一些比较特别的技术。

● 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。

● 可用加载/存储指令批量传输数据,以提高数据的传输效率。

● 可在一条数据处理指令中同时完成逻辑处理和移位处理。

● 在循环处理中使用地址的自动增减来提高运行效率。

ARM微处理器有以下7种运行模式。

● 用户模式(usr):ARM处理器正常的程序执行状态。

● 快速中断模式(fiq):用于高速数据传输或通道处理。

● 外部中断模式(irq):用于通常的中断处理。

● 管理模式(svc):操作系统使用的保护模式。

● 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。

● 系统模式(sys):运行具有特权的操作系统任务。

● 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

ARM微处理器的运行模式既可以通过软件来改变,也可以通过外部中断或异常处理来改变。大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。除用户模式以外,其余的所有6种模式称为非用户模式,或特权模式(Privileged Modes);其中除用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。2.1.1 ARM公司简介

1991年ARM公司(Advanced RISC Machine Limited)成立于英国剑桥,最早由Arcon、Apple和VLSI合资成立,主要出售芯片设计技术的授权。1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生(由美国VLSI公司制造)。目前,ARM架构处理器已在高性能、低功耗、低成本的嵌入式应用领域中占据了领先地位。

ARM公司最初只有12人,经过二十多年的发展,ARM公司已拥有近千名员工,在许多国家都设立了分公司,包括ARM公司在中国上海成立的分公司。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。基于ARM技术的微处理器应用占据了32位RISC微处理器80%以上的市场份额,其中,在手机市场,ARM占有绝对的垄断地位。可以说,ARM技术正在逐步渗入到人们生活中的各个方面,而且随着32位CPU价格的不断下降和开发环境的不断成熟,ARM技术会应用得越来越广泛。

ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为嵌入式RISC处理器的知识产权(IP)供应商,公司本身并不直接从事芯片生产,而是靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。利用这种合伙关系,ARM很快成为了许多全球性RISC标准的缔造者。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,其中包括Intel、IBM、Samsung、LG半导体、NEC、SONY、PHILIP等公司,这也使得ARM技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场并被消费者所接受,更具有市场竞争力。2.1.2 ARM处理器体系结构

处理器的体系结构定义了指令集(ISA)和基于这一体系结构下处理器的程序员模型。ARM体系结构为嵌入系统发展商提供了很高的系统性能,同时保持了优异的功耗和面积效率。每一次ARM体系结构的重大修改,都会添加一些非常关键的技术。

目前,ARM体系结构共定义了6个版本。从版本1到版本6,ARM体系的指令集功能不断扩大,不同系列的ARM处理器性能差别很大,应用范围和对象也不尽相同。但是,如果是相同的ARM体系结构,那么基于它们的应用软件是兼容的。

1.V1结构(版本1)

V1版本的ARM处理器并没有实现商品化,采用的地址空间是26位,寻址空间是64MB,在目前的版本中已不再使用这种结构。

2.V2结构

与V1结构的ARM处理器相比,V2结构的ARM处理器的指令结构要有所完善,比如增加了乘法指令并且支持协处理器指令。该版本的处理器仍然是26位的地址空间。

3.V3结构

从V3结构开始,ARM处理器的体系结构有了很大的改变,实现了32位的地址空间,指令结构相对前面的两种结构也所完善。

4.V4结构

V4结构的ARM处理器增加了半字指令的读取和写入操作,增加了处理器系统模式,并且有了T变种-V4T,在Thumb状态下所支持的是16位的Thumb指令集。属于V4T(支持Thumb指令)体系结构的处理器(核)有ARM7TDMI、ARM7TDMI-S(ARM7TDMI可综合版本)、ARM710T(ARM7TDMI核的处理器)、ARM720T(ARM7TDMI核的处理器)、ARM740T(ARM7TDMI核的处理器)、ARM9TDMI、ARM910T(ARM9TDMI核的处理器)、ARM920T(ARM9TDMI核的处理器)、ARM940T(ARM9TDMI核的处理器)和StrongARM(Intel公司的产品)。

5.V5结构

V5结构的ARM处理器提升了ARM和Thumb两种指令的交互工作能力,同时有了DSP指令-V5E结构、Java指令-V5J结构的支持。

属于V5T(支持Thumb指令)体系结构的处理器(核)有ARM10TDMI和ARM1020T(ARM10TDMI核处理器)。

属于V5TE(支持Thumb,DSP指令)体系结构的处理器(核)有ARM9E、ARM9E-S(ARM9E可综合版本)、ARM946(ARM9E核的处理器)、ARM966(ARM9E核的处理器)、ARM10E、ARM1020E(ARM10E核处理器)、ARM1022E(ARM10E核的处理器)和Xscale(Intel公司产品)。

属于V5TEJ(支持Thumb,DSP指令,Java指令)体系结构的处理器(核)有ARM9EJ、ARM9EJ-S(ARM9EJ可综合版本)、ARM926EJ(ARM9EJ核的处理器)和ARM10EJ。

6.V6结构

V6结构是在2001年发布的。在该版本中增加了媒体指令,属于V6体系结构的处理器核有ARM11(2002年发布)。V6体系结构包含ARM体系结构中所有的4种特殊指令集:Thumb指令(T)、DSP指令(E)、Java指令(J)和Media指令。

目前,基于ARM核结构的微处理器目前包括下面几个系列。(1)ARM7系列:ARM7系列包括ARM7TDMI、ARM720T、ARM7TDMI-S和ARM7EJ。该系列中使用最广泛的是基于ARM7TDMI核的ARM处理器,比如Samsung的S3c4510B、S3c44b0x等。后缀TDMI的含义如下。

● T:表示支持Thumb指令集。

● D:表示支持片上调试(Debug)。

● M:表示内嵌硬件乘法器(Multiplier)。

● I:表示支持片上断点和调试点。(2)ARM9系列:ARM9系列包括ARM920T、ARM922T和ARM940T。ARM9系列处理器采用了5级流水线,指令执行效率较ARM7有较大提高,而且带有MMU功能,这也是与ARM7的重要区别。同时,该系列的处理器支持指令Cache和数据Cache,因而具有更高的数据处理能力,主要应用在无线设备、手持终端、数字照相机等。(3)ARM9E系列:ARM9E系列包括ARM926EJ-S、ARM946E-S、ARM966E-S和ARM968E-S。该系列的处理器是综合类的处理器,它使用单一的处理器核提供了微控制器、DSP、Java应用,因而非常适应于同时使用DSP和微控制器的场合。ARM9E系列处理器采用了5级流水线,支持DSP指令集、32位的高速AMBA总线接口,带有MMU功能,最高主频可达300MIPS。(4)ARM10E系列:ARM10E系列包括ARM1020E、ARM1022E和ARM1026EJ-S。该系列的ARM处理器采用了新的体系结构,同ARM9系列相比有了很大的提高,采用了更高的6级流水线结构,支持DSP指令,适合同时需要高速数字信号处理的场合,支持64位的高速AMBA总线接口、32位的ARM指令集和16位的Thumb指令集。该系列处理器主要应用于下一代的无线设备和数字消费品等。(5)ARM11 系列:ARM11 系列包括 ARM1136J(F)-S、ARM1156T2(F)-S 和ARM1176JZ(F)-S。AMR公司在2003年推出了ARM11架构的核,基于ARM11核结构的处理器具有更高的性能,尤其是在多媒体处理能力方面,采用了先进的0.13μm工艺,最高工作频率可达750MHz。(6)SecurCore系列:SecurCore系列包括SecurCore SC100、SecurCore SC110、SecurCore SC200和SecurCore SC22。SecurCor系列处理器专为安全需要而设计,提供了对于安全方案解决的支持,主要应用在比如电子商务、电子银行、网络认证等对安全性要求很高的场合。(7)Inter的Xscale:Xscale处理器是Intel公司基于ARMV5TE体系结构的解决方案,是一款高性能、低功耗的32位RISC处理器,有PXA25x系列和PXA27x系列,相比较早期的StrongARM处理器,Xscale处理器是Intel公司目前主推的ARM处理器,主要应用在PDA和网络产品等方面。

7.V7结构

基于从ARMv6开始的新设计理念,ARM进一步扩展了它的CPU设计,成果就是ARMv7架构的闪亮登场。在这个版本中,内核架构首次从单一款式变成3种款式。

图2.1为ARM三大款式。

● 款式A:设计用于高性能的“开放应用平台”——越来越接近计算机了。

● 款式 R:用于高端的嵌入式系统,尤其是那些带有实时要求的——又要快又要实时。

● 款式M:用于深度嵌入的,单片机风格的系统中。图2.1 ARM三大款式

下面再进一步讲解这3种款式。(1)款式A(ARMv7-A):需要运行复杂应用程序的“应用处理器”支持大型嵌入式操作系统(不一定实时),比如Symbian(诺基亚智能手机使用)、Linux,以及微软的WindowsCE和智能手机操作系统WindowsMobile。这些应用需要优良的处理性能,并且需要硬件MMU实现完整而强大的虚拟内存机制,还基本上会配有Java支持,有时还要求一个安全程序执行环境(用于电子商务)。典型的产品包括高端手机和手持仪器、电子钱包以及金融事务处理机,如Cortex-A8(应用处理器)和Cortex-A9。(2)款式R(ARMv7-R):硬实时且高性能的处理器,主要面对的是高端实时市场。例如,高档轿车的组件、大型发电机控制器和机器手臂控制器等。它们使用的处理器不但要很好、很强大,还要极其可靠,对事件的反应也要极其敏捷,如Cortex-R4(实时处理器)。(3)款式M(ARMv7-M):认准了旧世代单片机的应用而量身定制。在这些应用中,尤其是对于实时控制系统,低成本、低功耗、极速中断反应以及高处理效率,都是至关重要的。Cortex系列是v7架构的第一次亮相,其中Cortex-M3就是按款式M设计的。到了架构7时代,ARM改革了一度使用的,冗长的、需要“解码”的数字命名法,转到另一种看起来比较整齐的命名法。比如,ARMv7的3个款式都以Cortex作为主名。

● Cortex-A8系列:ARM Cortex-A8处理器是第1款基于ARMv7架构的应用处理器,是有史以来ARM开发的性能最高、功率效率最高的处理器。Cortex-A8处理器的速率在600MHz~1GHz范围内,甚至高于1GHz,能够满足那些工作在300mW以下的功耗优化的移动设备和2000 Dhrystone MIPS的性能优化的消费类应用的要求。

● Cortex-A9系列:Cortex-A9处理器能与其他Cortex系列处理器以及广受欢迎的ARM MPCore 技术兼容,因此能够很好地延用包括操作系统/实时操作系统(OS/RTOS)、中间件及应用在内的丰富生态系统,从而减少采用全新处理器所需的成本。通过首次利用关键微体系架构方面的改进,Cortex-A9 处理器提供了具有高扩展性和高功耗效率的解决方案。利用动态长度、八级超标量结构、多事件管道及推断性乱序执行(speculative out-of-order execution),它能在频率超过1GHz的设备中,在每个循环中执行多达4条指令,同时还能减少目前主流八级处理器的成本并提高效率

● Cortex-R系列:ARM Cortex-R 系列是一系列用于实时系统的嵌入式处理器。这些处理器支持 ARM、Thumb 和 Thumb-2 指令集。目前,此系列包含Cortex-R4和Cortex-R4F 处理器。

ARM Cortex-R4 处理器是一个中端实时处理器,用于深层嵌入式系统。

ARM Cortex-R4F 处理器是一个带有浮点运算单元(Floating-Point Unit,FPU)的 Cortex-R4 处理器,主要用于对实时性要求比较高的中端产品,如汽车电子等。

● Cortex-M 系列:ARM Cortex-M 系列的 CPU 处理器内核,包括 ARM Cortex-M0、ARM Cortex-M1和ARM Cortex-M3 处理器。

ARM Cortex-M 系列是一系列针对成本敏感的应用程序进行优化的深层嵌入式处理器。这些处理器仅支持 Thumb-2 指令集。此系列包含 Cortex-m4、Cortex-M3、Cortex-M1 FPGA 和 Cortex-M0 处理器。

ARM Cortex-M4 处理器是一个低能耗处理器,其特点是门数低、中断延迟短且调试成本低。Cortex-M4F 处理器与 Cortex-M4 具有相同的功能,且包括浮点运算功能。这些处理器专用于要求使用数字信号处理功能的应用程序。

ARM Cortex-M3 处理器是一个低能耗处理器,其特点是门数低、中断延迟短且调试成本低。它专用于要求快速中断响应的深层嵌入式应用程序,包括微控制器、汽车和工业控制系统。

ARM Cortex-M1 FPGA 处理器专用于要求使用集成到 FPGA 中的小型处理器的深层嵌入式应用程序。

ARM Cortex-M0 处理器是一个门数非常低、能效非常高的处理器,专用于微控制器和要求使用面积优化处理器的深层嵌入式应用程序。

8.V8结构

新款ARM V8架构ARMCortex-A50处理器系列产品,进一步扩大ARM在高性能与低功耗领域的领先地位。该系列率先推出的是Cortex-A53与Cortex-A57处理器以及最新节能64位处理技术与现有32位处理技术的扩展升级。该处理器系列的可扩展性使ARM的合作伙伴能够针对智能手机、高性能服务器等各类不同市场需求开发系统级芯片(SoC)。(1)ARMCortex-A50处理器系列:提供Cortex-A57与Cortex-A53两款处理器,可选配密码编译加速器,为验证软件提高10倍的运行速度与ARMMali图形处理器系列互用,适用于图形处理器计算应用具有AMBA系统一致性,与CCI-400、CCN-504等ARMCoreLink缓存一致性结构组件达成多核心缓存一致性。(2)ARMCortex-A57处理器:最先进、单线程性能最高的ARM应用处理器能提升,以满足供智能手机从内容消费设备转型为内容生产设备的需求,并在相同功耗下实现最高可达现有超级手机3倍的性能计算能力,可相当于传统PC,但仅需移动设备的功耗成本即可运行,无论企业用户或普通消费者均可享受低成本与低耗能,针对高性能企业应用提高了产品可靠度与可扩展性。(3)ARMCortex-A53处理器:史上效率最高的ARM应用处理器,使用体验相当于当前的超级手机,但功耗仅需其1/4;结合可靠性特点,可扩展数据平面(dataplane)应用可将每毫瓦及每平方毫米性能发挥到极致;针对个别线程计算应用程序进行了传输处理优化;Cortex-A53处理器结合Cortex-A57及ARM的big.LITTLE处理技术,能使平台拥有最大的性能范围,同时大幅减少功耗。2.1.3 Linux与ARM处理器

在32位RISC处理器领域,基于ARM的结构体系在嵌入式系统中发挥了重要作用,ARM处理器和嵌入式Linux的结合也正变得越来越紧密,并在嵌入式领域得到了广阔的应用。早在1994年,Linux就可在ARM架构上运行,但那时Linux并没有在嵌入式系统中得到太多应用。目前,上述状况已经出现巨大变化,包括便携式消费类电子产品、网络、无线设备、汽车、医疗和存储产品在内,都可以看到ARM与Linux相结合的身影。Linux之所以能在嵌入式市场上取得如此辉煌的成就,与其自身的优秀特性是分不开的。

Linux具有诸多内在优点,非常适合于嵌入式操作系统。

● Linux 的内核精简而高效。针对不同的实际需求,可将内核功能进行适当地剪裁,Linux内核可以小到100KB以下,减少了对硬件资源的消耗。

● Linux诞生之日就与网络密不可分,它本身就是一款优秀的网络操作系统。Linux具有完善的网络性能,并且具有多种网络服务程序,而操作系统具备网络特性是很重要的。

● Linux 的可移植性强,方便移植到许多硬件平台,其模块化的特点也便于开发人员进行删减和修改。同时,Linux还具有一系列优秀的开发工具,嵌入式Linux为开发者提供了一整套的工具链(Tool Chain),能够很方便地实现从操作系统内核到用户态应用软件各个级别的调试。

● Linux源码开放,软件资源丰富,目前可以支持多种硬件平台,如X86、ARM、MIPS等。目前已经成功移植到数十种硬件平台之上,几乎包括所有流行的CPU架构,同时Linux下面有着非常完善的驱动资源,支持各种主流硬件设备,所有这些都促进了Linux在嵌入式领域广泛的应用。

不同特征的Linux都是在某一个CPU架构体系上运行的,而ARM结构体系历经多年的发展产生出很多版本,Linux对于已在ARM规划蓝图中获定义的新特征也有相应的支持。ARM体系的处理器按照不同的目标应用分类有着不同的特点和发展方向,基于与操作系统结合的特点考虑,可以根据有无MMU(Memory Management Unit)把CPU分成两类,即带MMU功能的处理器和不带MMU功能的处理器。

Linux作为一种基于x86平台发展过来的操作系统,是典型的应用操作系统,在硬件上需要MMU的支持,所以只有在包含MMU的ARM处理器上才能运行Linux,如典型的ARM720T、ARM920/922T和ARM926EJ。另外一些常用的ARM处理器,如ARM7TDMI系列,因为没有MMU,所以不支持标准的Linux。不带MMU的处理器由于特别适合于深度嵌入的特点(如快速实时响应、实地址编程等),在嵌入式系统中的应用非常广泛。为了适应这种需求,uClinux应运而生。uClinux是开放源码的嵌入式Linux的一个经典之作,它设计的目标平台是那些没有内存管理单元(MMU)的微处理器芯片。为了满足嵌入式系统的需求,uClinux还改写和裁减了大量Linux内核代码,因此,uClinux内核远小于标准Linux的内核,但仍然保持了Linux操作系统的绝大部分特性,包括稳定强大的网络功能及出色的文件系统支持等。

在2003年末推出的Linux内核2.6版本加强了对无MMU处理器的支持。Linux2.6内核扩展多嵌入式平台支持的一个主要途径就是把uCLinux的大部分并入主流内核功能中,这无疑为Linux在嵌入式领域的广泛应用加重了砝码,也使得ARM与Linux的关系更加紧密。Linux 3.14 版本中ARM正式引入了设备树机制。Linux 4.0版本最值得关注的特性是内核补丁无需重启系统,该技术原理基于Ksplice实现。Linux 4.0的发布让用户可以不需要重启操作系统。在大多数的服务器或者数据中心里,喜欢用Linux的一个原因是用户不需要频繁地进行重启操作。诚然,某些关键性的补丁必须要进行重启,但你也可以等到数月后再做此操作。现在,得益于Linux 4.0内核的发布,用户也许可以数年间都不用重启。2.2ARM指令集2.2.1 ARM微处理器的指令集概述

ARM微处理器的指令集主要有以下6大类。

● 跳转指令。

● 数据处理指令。

● 程序状态寄存器(PSR)处理指令。

● 加载/存储指令。

● 协处理器指令。

● 异常产生指令。

具体的指令及功能如表2.2所示(表中指令为基本ARM指令,不包括派生的ARM指令)。表2.2 ARM指令及其功能描述续表2.2.2 ARM指令寻址方式

1.立即数寻址

ARM指令的立即数寻址是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数。

在以上两条指令中,第2个源操作数即为立即数,实际使用时以“#”符号为前缀。

2.寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数。这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。

以上指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

3.寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。

在第1条指令中,以寄存器R2的内容作为操作数的地址,然后与寄存器R1相加,其结果存入寄存器R0中。

第2条指令将以R1的值为地址的存储器中的内容送到寄存器R0中。

4.基址变址寻址

基址变址的寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。

在第1条指令中,将寄存器R1的内容加上0x0A形成操作数的有效地址,将该地址处的操作数送到寄存器R0中。

在第2条指令中,将寄存器R1的内容加上0x0A形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增0x0A个字节。

5.多寄存器寻址

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。比如下面的指令。

该指令的后缀IA表示在每次执行完加载/存储操作后,寄存器R0按字长度增加,因此,指令可将连续存储单元的值传送到寄存器R1~R4。

6.相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。比如下面的程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式。

7.堆栈寻址

堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

根据堆栈的生成方式,堆栈又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack)。当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有4种类型的堆栈工作方式,ARM微处理器支持以下4种类型的堆栈工作方式。(1)满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。(2)满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。(3)空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。(4)空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。2.2.3 Thumb指令

作为32位的嵌入式处理器,ARM具有32位数据总线宽度,但是为了更好地兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。Thumb指令集是ARM指令集的一个子集,允许指令编码为16位的长度。与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,可以在很大程度上节省系统的存储空间。当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态;当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作状态。

所有的Thumb指令都有对应的ARM指令,而且Thumb的编程模型也对应于ARM的编程模型,在应用程序的编写过程中,只要遵循一定调用的规则,Thumb子程序和ARM子程序就可以互相调用,二者结合应用可以充分发挥各自的特点,取得较好的效果。2.2.4 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)和条件执行等功能。2.2.5 ThumbEE指令

ThumbEE指令也就是所谓的Thumb-2EE,业界称为Jazelle RCT技术,于2005年发表,首见于Cortex-A8处理器。ThumbEE提供从Thumb-2而来的一些扩充性,在所处的执行环境(Execution Environment)下,使得指令集能特别适用于执行阶段(Runtime)的编码产生(例如即时编译)。Thumb-2EE是专为一些语言,如Limbo、Java、C#、Perl和Python,并能让即时编译器能够输出更小的编译码却不会影响到效能。

ThumbEE所提供的新功能,包括在每次存取指令时自动检查是否有无效指标,以及一种可以执行阵列范围检查的指令,并能够分支到分类器(handlers),其包含一小部分经常呼叫的编码,通常用于高阶语言功能的实作,例如对一个新物件做内存配置。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载