104
科学出版社 职教技术出版中心 www.abook.cn

LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

学出版社

职教技术出版中心

www.abook.cn

Page 2: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

普通高等教育 “十二五” 规划教材

信息与电子技术类系列教材

嵌入式系统设计与开发———基于 ARM 和 μC/OS唱 Ⅱ

(第二版)

马文华  主编邓耀华  汤秀春  副主编

北  京

Page 3: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

内  容  简  介

   本书以目前流行的 ARM 处理器和易于学习的 μC/OS唱II操作系统为核心 ,系统介绍了嵌入式系统的概念 、原理 、基本开发流程和方法 。其内容包括嵌入式系统概述 、 ARM 及其编程模型 、 ARM 指令集 、嵌入式程序设计 、嵌入式最小系统设计 、嵌入式系统通用接口设计 、 μC/OS唱II实时操作系统 、基于 μC/OS唱II的程序设计 、 ADS集成开发环境使用等 。读者可从中系统地学习嵌入式系统的有关知识 ,并通过实例完成嵌入式系统设计的基础训练 。

本书可以作为高等学校嵌入式系统教学的教材 ,也可作为有关工程技术人员的学习参考书 。

  图书在版编目(CIP)数据

 嵌入式系统设计与开发/马文华主编 . — 2 版 . —北京 :科学出版社 ,2011畅6  ISBN 978唱7唱03唱031125唱2

  Ⅰ畅 ①嵌 …   Ⅱ畅 ①马 …   Ⅲ畅 ①程序设计   Ⅳ畅 ① TP311畅1 中国版本图书馆 CIP数据核字 (2011) 第 091695号

责任编辑 :隽青龙/责任校对 :刘玉靖责任印制 :吕春珉/封面设计 :东方人华平面设计部

出版北京东黄城根北街 16 号

邮政编码 : 100717

h t tp :// w w w .sciencep .com中国科学院印刷厂 印刷

科学出版社发行     各地新华书店经销

2011 年 6 月第   二   版2011 年 6 月第一次印刷印数 : 1 — 3 000

   开本 : 787 × 1092   1/16印张 : 22 3/4字数 : 525 000

定价 : 38畅00元(如有印装质量问题 ,我社负责调换)

销售部电话 010唱62134988   编辑部电话 010唱62135517唱2037

版权所有 ,侵权必究举报电话 : 010唱64030229 ; 010唱64034315 ; 13501151303

学出版社

职教技术出版中心

www.abook.cn

Page 4: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

前    言

嵌入式计算机系统起源于微型机时代 ,其低端应用以 8位 MCS唱51为代表 , 至今仍在大量使用 。近几年 ,网络 、通信 、多媒体和计算控制技术的发展为嵌入式系统应用开辟了广阔的天地 ,使嵌入式系统成为继 PC 、 Internet 后 I T 界新的技术热点 。 但在这些高端应用中 , 8位处理器已不能满足应用的需求 ,取而代之的是 32 位微处理器 。 目前 ,32位的 ARM 处理器以其优良的性能 , 占据了低功耗 、 低成本和高性能的嵌入式系统应用领域的领先地位 。 ARM7TDMI是 ARM 公司的经典内核 ,三星公司以此内核为基础生产的 SC344B0X芯片得到了广泛应用 ,拥有许多的用户 。对于用户来说 ,将该芯片作为嵌入式系统的入门是个很好的选择 。 32 位微处理器面向嵌入式系统的高端应用 ,由于其速度快 、资源丰富等特点 ,加上应用本身的复杂性 、可靠性等要求 ,软件的开发一般选择操作系统平台支持 。 常见的嵌入式操作系统有很多 , 如 VxWorks 、 WindowsCE 、嵌入式 Linux 、 QNX 、 Nucleus和 μC/OS唱II 等 , 从中选择一个能体现操作系统机理 、有实用价值而门槛又较低的操作系统是一项很重要的工作 。 μC/OS唱II 是一个源代码公开的实时多任务操作系统 ,拥有很多产品的成功应用案例并且得到美国有关方面的认证 ,用户可以很容易地通过阅读源代码领会操作系统的精髓 ,使操作系统的学习不再如 “空中楼阁” 。

本书以 SC344B0X和 μC/OS唱II为平台来介绍嵌入式系统的设计和开发技术 。 由于ARM 体系结构的一致性 、外围电路的通用性及操作系统机理的一致性 , 本书对设计其他 ARM 内核芯片的应用系统也具有很好的参考价值 。其编写思路符合嵌入式系统注重实践的学习规律 ,力求通俗 、 易懂 , 适合作为电信类和计算机学科本科生及研究生教材 ,也可作为课程设计 、毕业设计和从事嵌入式系统开发工程技术人员的参考资料 。

嵌入式系统的应用几乎涉及现代生活的各个方面 , 如手机 、 电视机 、 DVD 、 数码照相机 、游戏机 、微波炉和汽车等 ,即使我们通用的个人计算机 ,其外围电路中也包含众多的嵌入式处理器 。社会对嵌入式系统设计人才需求旺盛 ,目前 ,嵌入式系统方面高端人才严重缺乏 。很多高校也在进行课程改革 ,并且增加嵌入式系统方面的课程 ,这将为社会培养专业人才 、为我国在这一领域赶超世界先进水平打下坚实的人才基础 。

本书各章节安排如下 :第 1章介绍嵌入式系统的概念 、发展历史 、应用范围 ,嵌入式系统的硬件和软件组

成及嵌入式系统开发的相关技术 。第 2章介绍精简指令集计算机 RISC 和复杂指令集计算机 CISC , 在此基础上 , 介

绍了 ARM 体系结构版本及 ARM 的编程模型 ,为 ARM 体系结构的学习打下基础 , 对ARM7TDMI做了较详细的说明 。

Page 5: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

ii    嵌入式系统设计与开发 (第二版) 

第 3章详细介绍 ARM 体系的指令系统和寻址方式 。 Thumb指令集是 ARM 指令集的子集 ,本章对 Thumb指令集及其与 ARM 指令集的区别也做了简要介绍 。

第 4章介绍 ARM 的嵌入式程序设计 ,包括 ARM 汇编语言程序设计 、嵌入式 C 语言程序设计以及 C语言和汇编混合编程 。

第 5章介绍基于 S3C44B0X 最小系统的设计步骤和方法以及 BootLoader 的设计 。在嵌入式系统中 , BootLoader 是操作系统内核运行之前运行的一小段程序 ,通过 Boot唱Loader 可以完成对系统板上的主要部件进行初始化 , 从而将系统的软硬件环境带到一个合适的状态 。

第 6章详细介绍 S3C44B0X主要部件的工作原理与开发实例 ,内容包括通用 I/O 端口 、串行通信接口 、 定时器 、 LCD 控制器 。 通过本章的学习 , 可以建立起基于S3C44B0X开发嵌入式系统硬件的基础 。

第 7章介绍嵌入式实时操作系统 μC/OS唱II的内核结构 、 原理和特点 , μC/OS唱II 操作系统的多任务机制 、任务的管理以及对任务之间的通信与同步 。

第 8章介绍 μC/OS唱II嵌入式操作系统的移植 、基于 μC/OS唱II的应用程序设计方法和实例以及 μC/OS唱II的扩展 。由于 μC/OS唱II仅是一个实时多任务内核 , 移植 μC/OS唱II到处理器平台后 ,和实际应用还有一段距离 ,因此要建立一个实用的实时操作系统必须对 μC/OS唱II进行必要的扩展 。

第 9 章介绍集成开发工具 ARM Developer Suite (ADS) 的组成 、 安装与使用说明 。

全书由马文华任主编 ,邓耀华 、汤秀春任副主编 。其中 ,第 1章 ~第 4章由马文华编写 ;第 5章 ~第 8章由邓耀华编写 ;第 9章由汤秀春编写 。廖庆富参与第 9章实例编写及测试 ,韩威参与第 4 ~ 6章实验程序测试与排版 , 高世平参与第 7 、 第 8 章实验测试与排版工作 。

吴黎明教授 、王桂棠教授对本书的编写提出许多建设性意见 ,并审阅了全书 ,在此表示衷心感谢 。

在编写本书的过程中 ,得到深圳英蓓特信息技术公司 、 深圳旋极科技公司 、 ARM公司上海办事处 、上海祥佑数码科技公司的大力支持 ,在此谨向他们深表感谢 。

由于作者水平有限及嵌入式系统领域的发展变化较快 ,书中难免存在不当之处 ,恳请读者批评指正 。

科学出版社

职教技术出版中心

www.abook.cn

Page 6: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

目    录

第 1章  概述 1…………………………………………………………………………………

    1畅 1  嵌入式系统 1………………………………………………………………………

        1畅1畅1  嵌入式系统的定义 1……………………………………………………………

        1畅1畅2  嵌入式系统的发展历史 1………………………………………………………

        1畅1畅3  嵌入式计算机系统与通用计算机系统 2…………………………………………

    1畅 2  嵌入式系统的组成 3………………………………………………………………

        1畅2畅1  嵌入式系统的硬件组成 3………………………………………………………

        1畅2畅2  嵌入式系统的软件组成 5………………………………………………………

    1畅 3  嵌入式系统的主要应用领域 6……………………………………………………

    1畅 4  嵌入式处理器 7……………………………………………………………………

        1畅4畅1  嵌入式处理器分类 7……………………………………………………………

        1畅4畅2  嵌入式处理器现状及发展趋势 9………………………………………………

    1畅 5  嵌入式操作系统 11…………………………………………………………………

        1畅5畅1  嵌入式操作系统分类 11………………………………………………………

        1畅5畅2  实时操作系统 12………………………………………………………………

        1畅5畅3  嵌入式操作系统的特点 14………………………………………………………

        1畅5畅4  目前市场上流行的嵌入式操作系统 15…………………………………………

    1畅 6  嵌入式系统的开发 18………………………………………………………………

        1畅6畅1  嵌入式系统设计流程 18………………………………………………………

        1畅6畅2  嵌入式系统开发中的一些问题 20………………………………………………

   本章要点 28………………………………………………………………………………

   习题 28……………………………………………………………………………………

第 2章   ARM及其编程模型 29………………………………………………………………

    2畅 1   ARM 简介 29………………………………………………………………………

    2畅 2   RISC 体系结构 30…………………………………………………………………

    2畅 3   ARM 体系结构 30…………………………………………………………………

        2畅3畅1   ARM体系结构的版本 30………………………………………………………

        2畅3畅2   ARM体系结构的变种及版本命名格式 32………………………………………

        2畅3畅3   ARM处理器系列 34……………………………………………………………

    2畅 4   ARM 微处理器的编程模型 38……………………………………………………

        2畅4畅1   ARM处理器支持的数据类型 38………………………………………………

Page 7: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

iv    嵌入式系统设计与开发 (第二版) 

        2畅4畅2   ARM处理器的工作状态 39……………………………………………………

        2畅4畅3   ARM处理器的工作模式 40……………………………………………………

        2畅4畅4   ARM状态下的寄存器组织 40…………………………………………………

    2畅 5   ARM 的异常中断 44………………………………………………………………

        2畅5畅1   ARM体系结构所支持的异常类型 45……………………………………………

        2畅5畅2  异常的响应及返回 45…………………………………………………………

        2畅5畅3  各类异常及返回 47……………………………………………………………

    2畅 6   ARM7TDMI处理器内核简介 50…………………………………………………

        2畅6畅1   ARM7TDMI介绍 51……………………………………………………………

        2畅6畅2   ARM7TDMI处理器核的硬件接口 53…………………………………………

   本章要点 57………………………………………………………………………………

   习题 58……………………………………………………………………………………

第 3章   ARM指令集 59………………………………………………………………………

    3畅 1   ARM 指令集概述 59………………………………………………………………

        3畅1畅1   ARM指令的编码格式 59………………………………………………………

        3畅1畅2   ARM指令的条件码域 60………………………………………………………

        3畅1畅3  指令流水线 60…………………………………………………………………

    3畅 2   ARM 寻址方式 61…………………………………………………………………

    3畅 3   ARM 指令分类介绍 64……………………………………………………………

        3畅3畅1  数据处理指令 64………………………………………………………………

        3畅3畅2  分支指令 71……………………………………………………………………

        3畅3畅3  存储器访问指令 73……………………………………………………………

        3畅3畅4  程序状态寄存器与通用寄存器之间的传送指令 78………………………………

        3畅3畅5  协处理器指令 79………………………………………………………………

        3畅3畅6  异常中断产生指令 81…………………………………………………………

    3畅 4   Thumb指令集 82…………………………………………………………………

        3畅4畅1   Thumb指令集概述 82…………………………………………………………

        3畅4畅2   Thumb寄存器和 ARM寄存器之间的关系 83…………………………………

        3畅4畅3   Thumb指令分类介绍 84………………………………………………………

   本章要点 94………………………………………………………………………………

   习题 94……………………………………………………………………………………

第 4章  嵌入式程序设计 95…………………………………………………………………

    4畅 1  汇编语言程序结构 95………………………………………………………………

        4畅1畅1   ARM编译模式与开发环境 95…………………………………………………

        4畅1畅2   ARM汇编语言的伪操作 、伪指令与宏指令 98…………………………………

        4畅1畅3   CodeWarrior编译器下的伪操作与伪指令 99……………………………………

    4畅 2   ARM 汇编语言程序设计 106………………………………………………………

        4畅2畅1   ARM汇编中的文件格式 106……………………………………………………

学出版社

职教技术出版中心

www.abook.cn

Page 8: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

目    录                      v  

        4畅2畅2   ARM汇编语法格式 106………………………………………………………

        4畅2畅3   ARM汇编程序设计 110………………………………………………………

        4畅2畅4   ARM与 Thumb之间的状态转换及函数的互相调用 118…………………………

    4畅 3   C语言与汇编语言混合编程 120…………………………………………………

        4畅3畅1   C程序与汇编程序的相互调用规则 120…………………………………………

        4畅3畅2  内嵌汇编程序设计 123…………………………………………………………

        4畅3畅3   C语言函数和 ARM汇编语言函数间互相调用 127………………………………

   本章要点 128………………………………………………………………………………

   习题 128……………………………………………………………………………………

第 5章   ARM7 嵌入式最小系统设计 130……………………………………………………

    5畅 1  系统设计概述 130…………………………………………………………………

    5畅 2   S3C44B0X 嵌入式微处理器 131…………………………………………………

        5畅2畅1   S3C44B0X引脚及信号描述 132…………………………………………………

        5畅2畅2   S3C44B0X特性 135……………………………………………………………

        5畅2畅3   ARM7嵌入式存储器体系 139…………………………………………………

        5畅2畅4   S3C44B0X的存储控制器 141…………………………………………………

    5畅 3   S3C44B0X嵌入式最小系统硬件电路 148………………………………………

        5畅3畅1  电源 、复位 、时钟电路和 JTAG接口 148………………………………………

        5畅3畅2   Flash存储器接口电路 149………………………………………………………

        5畅3畅3   SDRAM存储器接口电路 150…………………………………………………

    5畅 4   S3C44B0X的存储器接口设计 151………………………………………………

        5畅4畅1   Flash存储器设计 151…………………………………………………………

        5畅4畅2   SDRAM存储器设计 157………………………………………………………

    5畅 5   S3C44B0X的中断控制器介绍与设计 162………………………………………

        5畅5畅1  中断控制器概述 162…………………………………………………………

        5畅5畅2  中断式键盘的软硬件设计 169…………………………………………………

        5畅5畅3  中断式键盘的应用编程 171……………………………………………………

    5畅 6   S3C44B0X嵌入式系统的启动程序 174…………………………………………

        5畅6畅1   BootLoader介绍 174……………………………………………………………

        5畅6畅2  启动程序设计实例 175…………………………………………………………

   本章要点 182………………………………………………………………………………

   习题 182……………………………………………………………………………………

第 6章   S3C44B0X嵌入式系统通用接口设计 183…………………………………………

    6畅 1   S3C44B0X的通用 I/O 端口 183…………………………………………………

        6畅1畅1   S3C44B0X的 I/O端口 183……………………………………………………

        6畅1畅2   S3C44B0X芯片与端口相关的寄存器 185………………………………………

        6畅1畅3  应用实例 186…………………………………………………………………

    6畅 2  串行通信接口 188…………………………………………………………………

Page 9: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

vi    嵌入式系统设计与开发 (第二版) 

        6畅2畅1  概述 188………………………………………………………………………

        6畅2畅2   S3C44B0X的串行通信单元 189………………………………………………

        6畅2畅3   UART操作 189………………………………………………………………

        6畅2畅4   UART寄存器 194……………………………………………………………

        6畅2畅5  串行通信的应用与编程 198……………………………………………………

    6畅 3  定时器 200…………………………………………………………………………

        6畅3畅1  概述 200………………………………………………………………………

        6畅3畅2   S3C44B0X PWM定时器 201……………………………………………………

        6畅3畅3   PWM定时器工作原理 201……………………………………………………

        6畅3畅4   PWM定时器操作 202…………………………………………………………

        6畅3畅5   PWM定时器的特殊功能寄存器 205……………………………………………

        6畅3畅6   PWM定时器的应用编程 209……………………………………………………

    6畅 4   LCD控制器 210……………………………………………………………………

        6畅4畅1  概述 210………………………………………………………………………

        6畅4畅2  液晶显示屏原理 211……………………………………………………………

        6畅4畅3   S3C44B0X LCD控制器 212……………………………………………………

        6畅4畅4  开发实例设计 218………………………………………………………………

        6畅4畅5  参考程序 220…………………………………………………………………

   本章要点 223………………………………………………………………………………

   习题 223……………………………………………………………………………………

第 7章   μC/OS唱II多任务操作系统与开发 224……………………………………………

    7畅 1   μC/OS唱II操作系统内核结构 224…………………………………………………

        7畅1畅1   μC/OS唱II操作系统主要特点 224………………………………………………

        7畅1畅2   μC/OS唱II操作系统的任务与调度 226……………………………………………

        7畅1畅3   μC/OS唱II初始化与启动 238……………………………………………………

    7畅 2   μC/OS唱II操作系统任务管理 240…………………………………………………

        7畅2畅1  创建任务与任务堆栈 240………………………………………………………

        7畅2畅2  任务的操作 251………………………………………………………………

    7畅 3   μC/OS唱II操作系统任务间通信与同步 256………………………………………

        7畅3畅1  任务间的通信与同步概述 256…………………………………………………

        7畅3畅2  基于消息邮箱的任务间通信 256………………………………………………

        7畅3畅3  基于信号量任务间通信 258……………………………………………………

   本章要点 263………………………………………………………………………………

   习题 263……………………………………………………………………………………

第 8章   μC/OS唱II操作系统程序设计与移植 265…………………………………………

    8畅 1   μC/OS唱II操作系统程序设计方法 265……………………………………………

        8畅1畅1   μC/OS唱II操作系统的数据类型 265……………………………………………

        8畅1畅2   μC/OS唱II操作系统程序设计 265………………………………………………

学出版社

职教技术出版中心

www.abook.cn

Page 10: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

目    录                      vii  

    8畅 2   μC/OS唱II操作系统扩展 270………………………………………………………

        8畅2畅1   μC/OS唱II操作系统内核扩展 270………………………………………………

        8畅2畅2  程序设计综合实例 272…………………………………………………………

    8畅 3   μC/OS唱II操作系统的移植 290……………………………………………………

        8畅3畅1   μC/OS唱II操作系统移植规划 290………………………………………………

        8畅3畅2   μC/OS唱II操作系统移植过程 291………………………………………………

    8畅 4   μC/OS唱II操作系统移植测试 297…………………………………………………

   本章要点 299………………………………………………………………………………

   习题 299……………………………………………………………………………………

第 9章   ADS集成开发环境介绍与使用 300…………………………………………………

    9畅 1   ARM Developer Suite 300…………………………………………………………

        9畅1畅1   ADS 和 RVDS介绍 300………………………………………………………

        9畅1畅2   ARM硬件仿真器 302…………………………………………………………

    9畅 2   ADS 集成开发环境使用说明 303…………………………………………………

        9畅2畅1   ADS的命令行与开发工具 303…………………………………………………

        9畅2畅2   ADS 1畅2安装与系统配置 312…………………………………………………

        9畅2畅3   ADS工程项目管理 325…………………………………………………………

        9畅2畅4  代码编译与加载调试 332………………………………………………………

        9畅2畅5   ADS与实验平台的连接 339……………………………………………………

   本章要点 339………………………………………………………………………………

   习题 340……………………………………………………………………………………

附录 A   ARM指令集和 Thumb指令集速查表 341…………………………………………

附录 B  伪操作与伪指令 349…………………………………………………………………

参考文献 354……………………………………………………………………………………

参考网站 354……………………………………………………………………………………

Page 11: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述

1畅1  嵌入式系统1畅1畅1  嵌入式系统的定义

嵌入式系统是一个相对模糊的概念 ,国内一般定义为 :以应用为中心 ,计算机技术为基础 ,软硬件可裁剪 ,以适应应用系统对功能 、可靠性 、成本 、体积 、功耗有严格要求的专用计算机系统 。

由此可以看出嵌入式系统实际上是嵌入式计算机系统 ,不过它是嵌入到更大的 、专用的应用系统中的计算机系统 ,是实际应用系统的一个部件 。因此 ,也有人把嵌入式系统定义为 :嵌入到对象体系中的专用计算机系统 。对象系统是指嵌入式系统所嵌入的宿主系统 。

1畅1畅2  嵌入式系统的发展历史

嵌入式计算机系统起源于微型机时代 ,近几年网络 、通信 、多媒体技术的发展为嵌入式系统应用开辟了广阔的天地 , 使嵌入式系统成为继 PC 和 Internet 之后 I T 界新的技术热点 。

20世纪 70年代发展起来的微型计算机 ,由于体积小 、 功耗低 、 结构简单 、 可靠性高 、使用方便 、性能价格比高等一系列优点 ,得到了广泛的应用和迅速的普及 。这种微型计算机可以作为电子设备的一个部件 ,嵌入在设备中 ,成为整个系统工作的核心控制器件 。这样一来 ,计算机便失去了原来的形态与通用的计算机功能 。为了区别原有的通用计算机系统 ,把嵌入到对象体系中 、实现对象体系智能化控制的计算机 ,称为嵌入式计算机系统 。由此可见 ,嵌入式系统的嵌入性本质是将一个计算机嵌入到一个对象体系中去 。

尽管嵌入式系统起源于微型机时代 ,但微型计算机的体积 、价位和可靠性都无法满足广大对象系统的嵌入式应用要求 ,因此 ,将计算机做在一个芯片上 ,构成单片机系统是嵌入式应用的必然要求 。 1976年 , Intel 公司推出了 MCS唱48 单片机 , 这个只有 1KBROM 和 64B RAM 的简单芯片成为世界上第一个单片机 , 同时也开创了将微处理机系统的各种 CPU 外的资源 (如 ROM 、 RAM 、 定时器 、 并行口 、 串行口及其他各种功能模块) 集成到 CPU 硅片上的时代 。 1980年 , Intel公司对 MCS唱48单片机进行了全面完善 ,推出了 8位 MCS唱51单片机 ,并获得巨大成功 ,奠定了嵌入式系统的单片机应用模式 。至今 , MCS唱51单片机仍在大量使用 。 1984 年 , Intel 公司又推出了 16 位 8096 系列并将其称之为嵌入式微控制器 , 这可能是 “嵌入式” 一词第一次在微处理机领域出现 。

此外 ,为了高速 、 实时地处理数字信号 , 1982 年诞生了首枚数字信号处理芯片

学出版社

职教技术出版中心

www.abook.cn

Page 12: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

2      嵌入式系统设计与开发 (第二版) 

(DSP) , DSP是模拟信号转换成数字信号以后进行高速实时处理的专业处理器 ,其处理速度比当时最快的 CPU 还快 10 ~ 50 倍 。 随着集成电路技术的发展 , DSP 芯片的性能不断提高 ,目前已广泛用于通信 、控制 、计算机等领域 。

在近 30年的历史中 ,各种改进的 、面向具体应用的不同品牌单片机层出不穷 , 得到了广泛应用 ,但这些应用基本上是基于硬件底层的单线程程序 。 20 世纪 90 年代后 ,伴随着网络时代的来临 ,网络 、 通信 、 多媒体技术得以发展 , 8/16 位单片机在速度和内存容量上已经很难满足这些领域的应用需求 。 而由于集成电路技术的发展 , 32 位微处理器价格不断下降 ,综合竞争能力已可以和 8/16位单片机媲美 。 32 位微处理器面向嵌入式系统的高端应用 ,由于速度快 ,资源丰富 ,加上应用本身的复杂性 、可靠性要求等 ,软件的开发一般会需要操作系统平台支持 。近几年 ,嵌入式设备 (内部有嵌入式系统的产品) 大量涌现 , 如手机 、 PDA 、 MP3 、 微波炉 、 数码照相机 、 机顶盒 、 各种网络设备等 。嵌入式系统开发应用需求越来越大 ,使嵌入式系统成为继 PC 和 Internet 之后 IT 技术的最热点 ,而构成嵌入式系统的主流趋势是 32位嵌入式微处理器加实时多任务操作系统 ,目前的嵌入式系统往往指的是包含这种资源的系统 。

1畅1畅3  嵌入式计算机系统与通用计算机系统

嵌入式计算机系统是相对于通用计算机系统而言的 。 市面上的通用计算机 (PC机) ,从外观上看主要由主机 (箱) 、显示器 、键盘 、鼠标等组成 ,其中主机箱内包含主板 (含 CPU 、芯片组 、各种总线插槽等) 、内存 、显卡/声卡/网卡等扩展板 、软驱 、 光驱 、硬盘 、电源等 。它要求满足各种不同的应用需求 ,因而要求有丰富的硬件资源 、完善的操作系统 、高速的运算和海量的存储 ,技术发展方向是总线速度的无限提升以及存储容量的无限扩大 。而嵌入式计算机系统则是面向具体应用 ,要有针对具体应用的 “量体裁衣” 的软 、硬件 ,操作系统一般采用实时操作系统 ,技术发展方向是与对象系统密切相关的嵌入性能 、控制能力与控制的可靠性 。嵌入式计算机系统同通用计算机系统相比具有以下特点 :

瞯 嵌入式系统通常是面向特定应用的 , 某种应用的目的和功能相对专一 。 应用的多样性决定了硬件平台的多样性 。 嵌入式 CPU 与通用型 CPU 的最大不同就是嵌入式 CPU 大多工作在为特定用户群设计的系统中 ,它通常都具有低功耗 、 体积小 、集成度高等特点 ,能够把通用系统中许多由单独芯片或板卡完成的功能集成在芯片内部 ,从而有利于嵌入式系统设计趋于小型化 、 低功耗 , 移动能力大大增强 ,跟网络的耦合也越来越紧密 。

瞯 大多嵌入式系统都有实时性要求 , 在高端应用中 , 为满足应用需求 、 增强可靠性和便于开发 ,往往要有实时多任务操作系统的支持 。

瞯 嵌入式系统是将先进的计算机技术 、 半导体技术和电子技术与各个行业的具体应用相结合后的产物 。这一点就决定了它必然是一个技术密集 、 资金密集 、 高度分散 、不断创新的知识集成系统 。

瞯 功耗 、成本和可靠性对嵌入式系统有特别重要的意义 。瞯 嵌入式系统和具体应用有机地结合在一起 , 它的升级换代也是和具体产品同步

Page 13: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                3      

进行的 ,因此嵌入式系统产品进入市场后具有较长的生命周期 。瞯 嵌入式系统本身不具备自主开发能力 ,即使设计完成以后 , 用户通常也不能对其中的程序功能进行修改 ,必须有一套交叉开发工具和环境才能进行开发 。

瞯 嵌入式系统工业是不可垄断的高度分散的工业 , 充满了竞争 、 机遇与创新 , 是一个可以大有作为的行业 。

1畅2  嵌入式系统的组成

嵌入式系统由硬件和软件组成 ,两类不同的嵌入式系统结构模型见图 1畅1 。 硬件是整个嵌入式操作系统和应用程序运行的平台 ,不同的应用通常有不同的硬件环境 。嵌入式系统的硬件部分包括处理器/微处理器 、存储器 、 I/O 接口及输入/输出设备 。 嵌入式系统的软件由嵌入式操作系统和应用程序组成 。嵌入式操作系统完成嵌入式应用的任务调度和控制等核心功能 ,嵌入式应用程序运行于操作系统之上 (对于一些简单的嵌入式应用系统 ,应用程序可以不需要操作系统的支持 , 直接运行在底层 , 见图 1畅1 (a)) ,利用操作系统提供的机制完成特定功能的嵌入式应用 。

由于嵌入式系统的灵活性和多样性 ,图 1畅1中各个层次之间缺乏统一的标准 ,几乎每一个独立的系统都不一样 ,这样就给上层的软件设计人员开发应用程序带来了极大的困难 。

图 1畅1  两类不同的嵌入式系统结构模型

1畅2畅1  嵌入式系统的硬件组成

嵌入式系统的硬件组成见图 1畅2 。

1畅 嵌入式处理器

嵌入式系统的核心是各种类型的嵌入式处理器 ,嵌入式处理器的体系结构经历了从CISC (复杂指令集) 到 RISC (精简指令集) 和 Compact RISC的转变 ,位数则由 4位 、8位 、 16位 、 32位逐步发展到 64位 。现在常用的嵌入式处理器可分为低端的嵌入式微控制器 (microcontroller unit , MCU) 、 中高端的嵌入式微处理器 (embedded micro唱

学出版社

职教技术出版中心

www.abook.cn

Page 14: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

4      嵌入式系统设计与开发 (第二版) 

processor unit , EMPU ) 、 嵌入式 DSP 处理器 ( embedded digital signal processor ,EDSP) 和高度集成的嵌入式片上系统 (system on a chip , SoC) 。目前几乎每个半导体制造商都生产嵌入式处理器 ,并且越来越多的公司开始拥有自主的处理器设计部门 。

图 1畅2  嵌入式系统的硬件组成

2畅 存储器

嵌入式系统有别于一般的通用计算机系统 , 它不具备像硬盘那样大容量的存储介质 ,而用静态易失型存储器 (RAM 、 SRAM) 、动态存储器 (DRAM) 和非易失型存储器 (ROM 、 EPROM 、 EEPROM 、 Flash) 作为存储介质 , 其中 Flash 凭借其可擦写次数多 、存储速度快 、存储容量大 、价格低廉等优点 ,在嵌入式领域内得到了广泛应用 。

3畅 I/O 接口I/O 接口是处理器与 I/O 设备连接的桥梁 , 与通用型 CPU 不同的是嵌入式处理器

芯片将通用计算机中许多由单独芯片或板卡完成的接口功能集成到芯片内部 ,从而有利于嵌入式系统在设计时趋于小型化 ,同时还具有很高的效率和可靠性 。

4畅 输入/输出设备

为使嵌入式系统具有友好的界面 ,方便人机交互 ,嵌入式系统中需配置输入 、输出设备 ,常用的输入/输出设备有液晶显示器 (LCD) 、触摸板 、键盘等 。

嵌入式系统开发的硬件平台选择主要是嵌入式处理器的选择 。 在具体应用中处理器的选择决定了其市场竞争力 。 在一个系统中使用什么样的嵌入式处理器主要取决于应用领域 、 用户的需求 、 成本 、 开发的难易程度等因素 。 在开发过程中 , 选择最适用的硬件平台是一项很复杂的工作 , 包括要考虑其他工程的影响以及缺乏完整或准确的信息等 。

Page 15: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                5      

1畅2畅2  嵌入式系统的软件组成

1畅 嵌入式操作系统

嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件 ,它是嵌入式系统 (包括硬 、软件系统) 极为重要的组成部分 ,通常包括与硬件相关的底层驱动软件 、系统内核 、设备驱动接口 、通信协议 、图形界面 、标准化浏览器等 。嵌入式操作系统具有通用操作系统的基本特点 ,如能够有效管理越来越复杂的系统资源 ;能够把硬件虚拟化 、使得开发人员从烦琐的驱动程序移植和维护中解脱出来 ;能够提供库函数 、驱动程序 、工具集以及应用程序 。与通用操作系统相比较 ,嵌入式操作系统在系统的实时高效性 、硬件的相关依赖性 、软件固态化以及应用的专用性等方面具有较为突出的特点 。

2畅 嵌入式应用软件

嵌入式应用软件是针对特定应用领域 ,基于某一固定的硬件平台 ,用来达到用户预期目标的计算机软件 。由于用户任务可能有时间和精度上的要求 ,因此有些嵌入式应用软件需要特定嵌入式操作系统的支持 。嵌入式应用软件和普通应用软件有一定的区别 ,它不仅要求其准确性 、安全性和稳定性等方面能够满足实际应用的需要 ,而且还要尽可能地进行优化 ,以减少对系统资源的消耗 ,降低硬件成本 。

3畅 硬件抽象层

硬件抽象层 (hardware abstraction layer , HAL) 是位于操作系统内核与硬件电路之间的接口层 ,其目的在于将硬件抽象化 。 也就是说 , 可通过程序来控制所有硬件电路 ,如 CPU 、 I/O 、存储器等的操作 。 这样就使得系统的设备驱动程序与硬件设备无关 ,从而大大提高了系统的可移植性 。

4畅 板级支持包

板级支持包 (board support package , BSP) 是 HAL 的一种实现 , 是介于主板硬件和操作系统中驱动层程序之间的一层 ,一般认为它属于操作系统的一部分 ,主要是实现对操作系统的支持 ,为上层的驱动程序提供访问硬件设备寄存器的函数包 ,使之能够更好地运行于硬件主板 。

5畅 设备驱动程序

计算机系统中安装设备后 ,只有在安装相应的设备驱动程序之后才能使用 ,驱动程序为上层软件提供设备的操作接口 。上层软件只需调用驱动程序提供的接口 ,而不用理会设备的具体内部操作 。

6畅 操作系统的应用程序接口

操作系统的应用程序接口 (application programming interface , API) 是一系列复

学出版社

职教技术出版中心

www.abook.cn

Page 16: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

6      嵌入式系统设计与开发 (第二版) 

杂的函数 、消息和结构的集合体 。 嵌入式操作系统下的 API 和一般操作系统下的 API在功能 、含义及知识体系上完全一致 。

嵌入式应用软件是实现嵌入式系统功能的关键 ,对嵌入式系统软件和应用软件的要求也和通用计算机有所不同 。嵌入式软件主要有以下一些特点 。

瞯 软件要求固化存储 。为了提高执行速度和系统可靠性 ,嵌入式系统中的软件一般都固化在存储器芯片或嵌入式微处理器本身中 ,而不是存储于磁盘等载体中 。

瞯 软件代码要求高质量 、高可靠性 。 尽管半导体技术的发展使处理器速度不断提高 、片上存储器容量不断增加 , 但在大多数应用中 , 存储空间仍然是宝贵的 ,还存在实时性的要求 。为此 , 要求程序编写和编译工具的质量要高 , 以减小程序二进制代码长度 、提高执行速度 。

瞯 系统软件 (OS) 的高实时性是基本要求 。 在多任务嵌入式系统中 , 对重要性各不相同的任务进行统筹兼顾的合理调度是保证每个任务及时执行的关键 , 单纯通过提高处理器速度是无法完成和没有效率的 , 这种任务调度只能由优化编写的系统软件来完成 ,因此 ,系统软件的高实时性是基本要求 。

瞯 嵌入式系统软件需要实时多任务操作系统开发平台 (RTOS) 。 为满足实时性应用需求 、充分利用硬件资源 、 增强可靠性和便于开发 , 实时多任务操作系统成为嵌入式软件必需的系统软件 。

瞯 在嵌入式系统的软件开发过程中 ,采用 C语言将是最佳的选择 。

1畅3  嵌入式系统的主要应用领域

嵌入式系统目前已在国防 、 国民经济及社会生活各领域普及应用 , 用于企业 、 军队 、办公室 、实验室以及个人家庭等各种场所 ,见图 1畅 3 。

图 1畅3  嵌入式系统的应用领域

瞯 军用 。各种武器控制 (火炮控制 、 导弹控制 、 智能炸弹制导引爆装置) 、 坦克 、舰艇 、轰炸机等陆海空各种军用电子装备 , 雷达 、 电子对抗军事通信装备 , 野

Page 17: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                7      

战指挥作战用各种专用设备等 。瞯 消费电子 。 我国各种信息家电产品 , 如数字电视机 、 机顶盒 、 数码照相机 、VCD 、 DVD 、音响设备 、可视电话 、家庭网络设备 、 洗衣机 、 电冰箱 、 智能玩具等 ,广泛采用微处理器/微控制器及嵌入式软件 。随着市场需求的拓展和技术进步 ,传统手机逐渐发展成为融合了 PDA 、 电子商务和娱乐等特性的智能手机 ,我国移动通信市场潜力巨大 ,发展前景看好 。

瞯 工业控制 。各种智能测量仪表 、 数控装置 、 可编程控制器 、 控制机 、 分布式控制系统 、现场总线仪表及控制系统 、 工业机器人 、 机电一体化机械设备 、 汽车电子设备等 ,广泛采用微处理器/控制器芯片级 、标准总线的模板级及系统嵌入式计算机 。

瞯 网络应用 。 Internet 的发展 ,产生了大量网络基础设施 、接入设备 、终端设备的市场需求 ,这些设备中大量使用嵌入式系统 。

瞯 其他 。各类收款机 、 POS 系统 、 电子秤 、 条形码阅读机 、 商用终端 、 银行点钞机 、 IC 卡输入设备 、取款机 、自动柜员机 、 自动服务终端 、 防盗系统 、 各种银行专业外围设备以及各种医疗电子仪器 , 无一不用到嵌入式系统 。 嵌入式系统可以说无处不在 ,无所不在 ,有着广阔的发展前景 ,也充满了机遇和挑战 。

1畅4  嵌入式处理器1畅4畅1  嵌入式处理器分类

嵌入式系统的硬件核心是嵌入式处理器 。 区分嵌入式处理器的一个重要指标就是“位数” ,即处理器处理二进制数据的宽度 。 我们常说某处理器是 8 位或 16 位 , 指的就是这一参数 。

嵌入式处理器已从最初的 4位 、 8位发展到了今天的 16位 、 32位以至 64位 。嵌入式系统的发展是如此迅猛 ,以致没有人能说清世界上到底有多少种嵌入式处理器 。据不完全统计 ,全世界嵌入式处理器的品种总量已经超过 1000 种 , 仅流行的体系结构就有30种以上 ,其中包括大家熟悉的 8位 MCS唱51系列和现在流行的 32位 ARM 系列 。

除了按位数来划分外 ,要对嵌入式处理器进行准确分类是一件困难的事情 ,很难找到公认的统一的标准 。不管如何划分 ,总是存在争议 ,目前业界有关嵌入式处理器的分类主要有 MPU 、 MCU 、 DSP和 SoC 。

1畅 嵌入式微处理器

嵌入式微处理器 (microprocessor unit , MPU) 由通用计算机的 CPU 演化而来 。由于嵌入式系统通常应用于比较恶劣的环境中 ,因而嵌入式处理器在工作温度 、电磁兼容性以及可靠性方面的要求较通用的标准微处理器高 。为满足这些特殊要求 ,就需要对处理器进行 “增强” 处理 。嵌入式微处理器具有体积小 、质量轻 、成本低 、可靠性高的优点 。 嵌入式处理器目前主要有 Am186/88 、 386EX 、 SC唱400 、 PowerPC 、 68000 、MIPS 和 ARM 系列等 。

学出版社

职教技术出版中心

www.abook.cn

Page 18: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

8      嵌入式系统设计与开发 (第二版) 

2畅 嵌入式微控制器

嵌入式微控制器 (MCU) 又称 “单片机” 。顾名思义 ,单片机就是将整个计算机系统集成到一块芯片中 。 MCU 一般将处理器内核 (CPU) 、 ROM/Flash 、 RAM 、 总线 、定时/计数器 、把关定时器 (俗称看门狗) 、 并行口 、 串行口 、 脉宽调制输出 、 A/D 及D/A 等各种必要的功能和外设集成到一块芯片中 。 为适应不同的应用需求 , 一个系列的单片机往往具有多种衍生产品 ,每种衍生产品的处理器内核都是一样的 ,不同的是存储器的大小 、外围设备 (简称外设) 的多少以及封装的不同 。这样可以使单片机最大限度地匹配于实际需要 ,从而降低成本和功耗 。

和 MPU 相比 , MCU 的最大特点是单片化 , 体积大大减小 , 可靠性提高 。 MCU片上外设资源一般比较丰富 ,适合于控制 ,因此称为微控制器 。通常 ,嵌入式微控制器可分为通用和半通用两类 , 比较有代表性的通用系列包括 8051 、 P51XA 、 MCS唱251 、MCS唱96/196/296 、 C166/167 、 MC68HC05/11/12/16 、 68300 、 H8 等 。 而比较有代表性的半通用系列 , 如支持 USB 接口的 MCU 8XC930/931 、 C540 、 C541 , 支持 I2 C 、CAN 总线 、 LCD等的众多专用 MCU 和兼容系列 。

特别值得注意的是近年来提供 x86微处理器的著名厂商 AMD公司 ,将 Am186CC/CH/CU 等嵌入式处理器称为 Microcontroller , Motorola 公司把以 PowerPC 为基础的PPC505和 PPC555亦列入 MCU 行列 。 TI 公司亦将其 TMS320C2XXX 系列 DSP 作为MCU 进行推广 。这一做法使得嵌入式处理器的分类更加模糊 。

3畅 嵌入式数字信号处理器

嵌入式数字信号处理器 (DSP) 是一种特殊的微处理器 。 它对 CPU 的系统结构和指令进行了特殊设计 ,编译效率较高 ,指令执行速度也较快 ,使其能够实时地完成各种数字信号处理算法 。理论上这些算法也可由普通嵌入式处理器完成 ,但实时性往往达不到要求 。在数字滤波 、 FFT 以及频谱分析等方面 , DSP算法正在大量进入嵌入式领域 。

嵌入式 DSP处理器有两个发展方向 , 一是 DSP 处理器经过单片化 、 EMC 改造 、增加片上外设成为嵌入式 DSP 处理器 , TI 的 TMS320C2000/C5000 等属于此范畴 ; 二是在通用 MCU 或 SoC 中增加 DSP 协处理器 , 例如 Intel 的 MCS唱296 和 Infineon 的TriCore等 。另外 ,在有关智能方面的应用中 ,也需要嵌入式 DSP处理器 ,例如各种带有智能逻辑的消费类产品 ,指纹识别 、 实时图像/语音解压系统等 。 这类智能化算法一般运算量大 ,实时性要求高 ,特别适合 DSP处理 。

4畅 嵌入式片上系统

随着半导体设计技术和半导体生产工艺的迅速发展 ,在一个硅片上实现一个复杂系统的时代已来临 , 这就是嵌入式片上系统 (SoC) 。 SoC 真正发展也就是近年来的事 ,但发展势头非常迅猛 。这主要得益于 EDA (电子设计自动化) 的推广和 VLSI (超大规模集成电路) 设计的普及化及工艺的突破 。 SoC 的设计并不复杂 ,将通用处理器内核作为 SoC 设计公司的标准库 ,和许多其他嵌入式系统外设一样 , 用标准的 VHDL 等语言

Page 19: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                9      

进行描述 ,成为 VLSI设计器件库中一种标准器件 。 用户只需使用 EDA 工具定义出其整个应用系统 ,仿真通过后就可以将设计图交给半导体工厂制作样品 。这样除个别无法集成的器件以外 ,整个嵌入式系统大部分均可集成到一块或几块芯片中去 ,应用系统电路板将变得很简洁 ,对于减小体积和功耗 、提高可靠性非常有利 。

SoC 可以分为通用和专用两类 。 通用系列包括 Infineon 的 TriCore 、 Motorola 的M唱Core 、大多数 ARM 处理器芯片 、 Echelon 和 Motorola 联合研制的 Neuron 芯片等 。专用 SoC 一般专用于某个或某类系统中 , 不为一般用户所知 。 一个有代表性的产品是Philips的 Smart XA ,还有专为 CDMA 或 3G 手机设计的 ARM 芯片等 。

TI公司曾有个生动的比喻 : DSP 是跑车 , 追求的是速度 ; MPU 是轿车 , 追求的是经济性与速度的折中 ; MCU 是满足特殊用途的汽车 。 依此类推 , SoC 就是设备齐全的豪华轿车了 。现在 ,随着处理速度的要求越来越高 ,同时处理的数据更加复杂 ,出现了双核与多核处理器 , 通常为 DSP + RISC 内核 , 如手机中就有许多 ARM + DSP 。 随着一些大量应用市场的崛起 ,又出现了一些新名词 ,例如用于网络 、通信设备上的通信处理器 ,用于数码相机 、数码摄像机等视频 、音频流所需的媒体处理器 ,用于智能手机上的应用处理器等 。

其实我们不必拘泥于处理器的分类 ,重要的是要了解 、掌握基于嵌入式处理器的设计与编程 。

1畅4畅2  嵌入式处理器现状及发展趋势

嵌入式世界是一个多姿多彩的世界 。如同生物的多样性一样 ,嵌入式处理器也充满了多样化 ,尤其是信息化 、数字化的今天 ,嵌入式处理器遍及人们能够想象到的各个角落 ,因此 ,每种处理器都有存在的理由 ,都有可伸展的方向 。 20 世纪 80 年代中期 , 4/8位单片机进入了战国时代 ,群雄并举 , Intel公司的 MCS唱51最具代表性 ,发展延续至今 。 20世纪 90年代以后 , 16 位 、 32 位乃至 64 位微处理器及各种 DSP (数字信号处理) 处理器闪亮登场 ,迅速抢占各自的优势领地 。

嵌入式系统发展到今天 , 处理器林林总总 , 千差万别 。 但就其主流来看 , 51 系列单片机仍为广大嵌入式工程师所喜爱 ,成为许多低端控制领域的宠儿 ,同时也是嵌入式爱好者的入门首选 ; Motorola的 PowerPC系列在通信领域占据着主导地位 , 是通信产品当仁不让的核心 ; TI的 TMS320 系列 DSP 处理器几乎独霸了嵌入式 DSP 市场 ; 而信息终端 、手持设备及许多消费类产品则是 ARM 处理器的天下 ,而且其应用正迅速渗透到 I T 产业的各个领域 。

为什么嵌入式处理器有如此飞快的发展 ? 原因是嵌入式产品的更新换代越来越快 ,无论是工业控制 、通信 、汽车 、医疗设备 ,还是银行证券 、家用电器 ,其智能化程度越来越高 ,对微处理器的性能 、功能要求也越来越高 。 以往的 8 位 、 16 位单片机已经很难满足现在用户的需求了 ,采用 32位甚至 64位芯片的嵌入式系统已经是业界的必然选择 。同时技术的进步也使嵌入式系统不再高不可攀 ,其成本在不断下降 ,有些系统使用32位机其整体成本甚至比用 8 位机还要低 , 原来人们担心的技术和成本因素不再成为障碍 ,这也为嵌入式系统应用 、普及和发展提供了有利条件 。

学出版社

职教技术出版中心

www.abook.cn

Page 20: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

10     嵌入式系统设计与开发 (第二版) 

那么 ,在可预见的将来 ,嵌入式处理器会有什么样的发展趋势呢 ?

1畅 32位处理器在兴起

市场的发展加速了观念的变化 ,观念的变化又促进了市场的发展 。 8 位 MCU 市场已逐步趋向稳定 , 32位 MPU 和 SoC代表着嵌入式技术的发展方向 。 32 位处理器应用范围扩大的驱动因素主要有以下两个方面 。

1) 手机 、数码照相机 、 MP3播放器 、 PDA 、游戏机等手持设备以及各种信息家电等有更高性能要求的多媒体和通信设备的推出 , 促进了 32 位处理器的应用 。 在这些应用中 ,庞大的多媒体数据必然需要更大的存储空间 ,目前许多 32 位微控制器都可以使用同步 SDRAM ,因此可极大地降低使用更大容量数据存储器的成本 。而 8 位微控制器一般只能使用成本较高的 SRAM 作为数据存储器 。 此外除了处理应用控制功能之外 ,还有需要支持 Internet 接入的应用 。 在 MCU 运行 TCP/IP 或其他通信协议的情况下 ,要求系统建立在 RTOS 上就必然成为一种现实需求 , 而 8 位单片机难以胜任 。 另外 ,有越来越多的像电视机 、 汽车音响及电子玩具等传统应用也与时俱进地提出数字化和“硬件软化” 的需求 ,它们对计算性能的要求及存储器容量的需求超出绝大多数 8 位微控制器能提供的范围 。

2) 由于 IT 技术发展的推动 ,随着高端 32位嵌入式处理器价格的不断下降和开发环境的成熟 ,促使其日益挤压原先由 8位微控制器主导的应用空间 。 随着 32 位处理器在全球范围的流行 , 32位的 RISC嵌入式处理器已经开始成为高中端嵌入式应用和设计的主流 。此外 ,随着第三方的开发工具支持的不断增加 , 开发工具的价格在逐步降低 ,另一方面技术供应商在不断提高开发工具的灵活性和智能化程度 , 使得开发环境不断改善 。

2畅 处理器 IP (知识产权)

为了满足多内核与 SoC设计的需要 , 有一些厂家专门供应处理器内核的 IP (也包括外设的 IP) ,主要有 16位 、 32位和 64 位 ,有软核与硬核之分 。 这一方面 , ARM 公司是一个非常成功的例子 。多内核处理器和 SoC 市场发展前景广阔 , 我们有理由相信会有越来越多的公司提供处理器 IP ,也会有越来越多的组织选用这些 IP 。

3畅 可编程处理器

可编程也是处理器的一个发展方向 。许多传统的单片机公司利用片内 Flash 来实现现场可编程 ,如 Atmel 、 Microchip等公司最先推出这类产品 , 现在几乎所有的 8 位单片机公司都推出了这种可现场编程的单片机 。但这里所说的可编程是指对处理器本身的定制 ,即通过编程的办法现场 “制造” 出用户所需要的处理器 。

可编程主要有 CPU + FPGA 和 PSOC (programmable system on a chip) 。前者 FP唱GA 厂商大显身手 , Altera 公司推出了 SOPC (system on programmable chip) 概念 ,Xilinx 公司也有类似产品 ,途径是通过 FPGA 进行编程 , 但 FPGA 厂商面临的问题是成本与功耗的问题 。后者由 Cypress公司提出 ,该产品被美国 EDN 杂志评为 2003年度

Page 21: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                11     

“热门产品” 。 PSOC 的方法是大马拉小车 ,首先做出一个功能齐全的 SoC , 用户可根据需要选择用哪些外设和精度 ,例如 A/D还是 D/A ,精度是 8位还是 12位 。处理器的可编程将引起一个有趣的现象 :在开发嵌入式系统软件之前要先把处理器定制好 。

1畅5  嵌入式操作系统

计算机系统由硬件和软件组成 ,在发展初期没有操作系统这个概念 ,用户使用监控程序来使用计算机 。随着计算机技术的发展 ,计算机系统的硬件 、软件资源也越来越丰富 ,监控程序已不能适应计算机应用的要求 。于是在 20世纪 60年代中期监控程序又进一步发展形成了操作系统 (Operating System) 。 目前广泛使用的有 3 种操作系统 , 即多道批处理操作系统 、分时操作系统以及实时操作系统 。

嵌入式操作系统 EOS (embedded operating system) 负责嵌入式系统的全部软 、硬件资源的分配 、调度 、控制 、协调并发活动 ,它必须体现其所在系统的特征 ,能够通过装卸某些模块来达到系统所要求的功能 。嵌入式操作系统伴随着嵌入式系统的发展经历了 4个比较明显的阶段 :第一阶段是无操作系统的嵌入算法阶段 ;第二阶段是以嵌入式CPU 为基础 、以简单操作系统为核心的嵌入式系统阶段 (专用实时操作系统) ; 第三阶段是通用的嵌入式实时操作系统阶段 ,是以嵌入式操作系统为核心的嵌入式系统 ,这是目前广泛应用的操作系统 ;第四阶段是基于 Internet 的嵌入式系统阶段 ,这是一个正在迅速发展的阶段 。

在嵌入式实时操作系统环境下开发实时应用程序使程序的设计和扩展变得容易 ,不需要大的改动就可以增加新的功能 。 通过将应用程序分割成若干独立的任务模块 ,使应用程序的设计过程大为简化 , 而且对实时性要求苛刻的事件都得到了快速 、 可靠的处理 。 通过有效的系统服务 , 嵌入式实时操作系统使得系统资源得到更好的利用 。 但是 , 使用嵌入式实时操作系统还需要额外的 ROM/RAM 开销及 2 % ~ 5 % 的CPU 额外负荷 。

目前嵌入式系统的功能越来越复杂 ,嵌入式硬件所提供的条件越来越好 ,因此 ,选择嵌入式操作系统也就越来越有必要了 。而在嵌入式高端产品的研发中 ,采用嵌入式操作系统是最经济可行的方案 。

1畅5畅1  嵌入式操作系统分类

早期的嵌入式系统中没有操作系统的概念 ,程序员编写嵌入式程序通常直接面对裸机及裸设备 。在这种情况下 ,通常把嵌入式程序分成两部分 , 即前台程序和后台程序 。应用程序是一个无限的循环 ,循环中调用相应的函数完成相应的操作 ,这部分可以看成后台行为 。中断服务程序处理异步事件 ,这部分可以看成前台行为 。

后台也可以叫做任务级程序 ,前台也叫做中断级程序 。例如 ,很多基于微处理器的产品采用前后台系统设计 ,如微波炉 、电话机 、智能玩具等 。从省电的角度出发 ,平时微处理器处在停机状态 ,所有工作都靠中断服务来完成 。

实际上 ,前后台系统的实时性比预计的要差 。这是因为前后台系统认为所有的任务

学出版社

职教技术出版中心

www.abook.cn

Page 22: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

12     嵌入式系统设计与开发 (第二版) 

具有相同的优先级别 ,即是平等的 ,而且任务的执行又是通过 FIFO 队列排队 , 因而对那些实时性要求高的任务不可能立刻得到处理 。但由于这类系统结构简单 ,几乎不需要RAM/ROM 的额外开销 ,因而在简单的嵌入式应用中被广泛使用 。 没有操作系统支持的嵌入式系统应用软件的另一种结构是循环轮转程序结构 。

目前的嵌入式系统一般会选用嵌入式操作系统 ,这些嵌入式操作系统一般可以分为两类 ,一类是面向控制 、通信等领域的实时操作系统 ,如 WindRiver公司的 VxWorks 、原 ATI公司的 Nucleus 、 QNX系统软件公司的 QNX 、 ISI 公司的 pSOS 等 ; 另一类是面向消费电子产品的非实时操作系统 ,如 WinCE 、 Linux 等 。

1畅5畅2  实时操作系统

有些嵌入式系统对时间的要求较高 , 我们称之为实时系统 。 有两种类型的实时系统 :硬实时系统和软实时系统 。软实时系统并不要求限定某一任务必须在一定的时间内完成 ,只要求各任务运行得越快越好 ;硬实时系统对系统响应时间有严格要求 ,一旦系统响应时间不能满足 ,就可能会引起系统崩溃或致命的错误 ,一般在工业控制中应用较多 。在实时多任务系统中 , 内核负责管理各个任务 , 或者说为每个任务分配 CPU 时间 ,并且负责任务之间的通信 。内核提供的基本服务是任务切换 。使用实时内核可以将应用分成若干个任务 ,由实时内核来管理它们 ,从而简化应用系统的设计 。但内核本身也增加了内存的用量 ,占用一部分 CPU 的时间 (一般在 2 % ~ 5 %之间) 。

多数实时内核是基于优先级调度算法的 。每个任务根据其重要程度的不同被赋予一定的优先级 。基于优先级的调度算法是指 : CPU 总是让处在就绪状态的优先级最高的任务先运行 。然而 ,究竟何时让高优先级任务掌握 CPU 的使用权 ,由使用的内核的类型确定 。基于优先级的内核有两种类型 :不可剥夺型的和可剥夺型内核 。

1畅 不可剥夺型内核

不可剥夺型内核 (非占先式 , non唱preemptive) 要求每个任务自我放弃 CPU 的所有权 。不可剥夺型调度法也称作合作型多任务 , 各个任务彼此合作共享一个 CPU 。 异步事件还是由中断服务来处理 。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态 。但中断服务以后控制权还是回到原来被中断了的那个任务 ,直到该任务主动放弃 CPU 的使用权时 ,那个高优先级的任务才能获得 CPU 的使用权 。

不可剥夺型内核的一个优点是响应中断快 。在任务级 ,不可剥夺型内核允许使用不可重入函数 。每个任务都可以调用不可重入型函数 ,而不必担心其他任务可能正在使用该函数 ,从而造成数据的破坏 。 因为每个任务要运行到完成时才释放 CPU 的控制权 。使用不可剥夺型内核时 ,任务级响应时间比前后台系统快得多 ,此时的任务级响应时间取决于最长的任务执行时间 。

不可剥夺型内核的另一个优点是 ,几乎不需要使用信号量保护共享数据 。运行中的任务占有 CPU ,而不必担心被别的任务抢占 。 但这也不是绝对的 , 在某种情况下还是需要使用信号量 。处理共享 I/O 设备时仍需要使用互斥型信号量 。 例如 ,在打印机的使用上 ,仍需要满足互斥条件 。图 1畅4显示了不可剥夺型内核的运行情况 ,任务在运行

Page 23: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                13     

过程中 ,中断 [ (1)] 来了 ,如果此时中断是开放的 , CPU 由中断向量 [ (2)] 进入中断服务子程序 ,中断服务子程序做事件处理 [(3)] ,使一个有更高优先级的任务进入就绪状态 。中断服务完成以后 ,中断返回 [ (4)] ,使 CPU 回到原来被中断的任务 ,接着执行该任务的代码 [ (5)] 直到该任务完成 ,调用一个内核服务函数以释放 CPU 控制权 ,由内核将控制权交给那个优先级更高的 、并已进入就绪状态的任务 [(6)] ,这个优先级更高的任务才开始处理中断服务程序标识的事件 [ (7)] 。

图 1畅4  不可剥夺型内核

不可剥夺型内核的最大缺陷在于其响应时间 。高优先级的任务已经进入就绪状态 ,但还不能运行 ,也许要等很长时间 ,直到当前运行着的任务释放 CPU 。

与前后台系统一样 ,不可剥夺型内核的任务级响应时间是不确定的 ,最高优先级的任务什么时候才能拿到 CPU 的控制权 ,完全取决于应用程序什么时候释放 CPU 。

总之 ,不可剥夺型内核允许每个任务运行 , 直到该任务自愿放弃 CPU 的控制权 。中断可以中断运行中的任务 。 中断服务完成以后将 CPU 控制权还给被中断了的任务 。任务级响应时间要大大低于前后台系统 ,但仍是不可知的 ,商业软件几乎没有不可剥夺型内核 。

2畅 可剥夺型内核

当系统响应时间很重要时 ,要使用可剥夺型内核 (占先式 , preemptive) 。 μC/OS唱Ⅱ 以及绝大多数商业软件的实时内核都是可剥夺型内核 。 最高优先级的任务一旦就绪 ,总能得到 CPU 的控制权 。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态 ,当前任务的 CPU 使用权就被剥夺了 ,或者说被挂起了 , 那个高优先级的任务立刻得到了 CPU 的控制权 。 如果是中断服务子程序使一个高优先级的任务进入就绪状

学出版社

职教技术出版中心

www.abook.cn

Page 24: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

14     嵌入式系统设计与开发 (第二版) 

图 1畅5  可剥夺型内核

态 ,中断完成后 , 中断了的任务被挂起 , 优先级高的那个任务开始运行 ,如图 1畅 5所示 。

使用可剥夺型内核 , 最高优先级的任务什么时候可以执行是可知的 , 任务级响应时间得以最优化 。但使用可剥夺型内核时 , 应用程序不应直接使用不可重入型函数 。 综上所述 , 可剥夺型内核总是让就绪状态的高优先级任务先运行 , 中断服务程序可以抢占 CPU , 中断服务完成时 , 内核让此时优先级最高的任务运行 (不一定是那个被中断了的任务) 。任务级系统响应时间得到了最优

化 ,而且是可知的 。

1畅5畅3  嵌入式操作系统的特点

嵌入式操作系统除具备一般操作系统最基本的功能 ,如任务调度 、同步机制 、中断处理 、文件处理等外 ,还有下面几个特点 。

1畅 可裁剪

嵌入式操作系统可以根据产品的需求进行裁剪 。也就是说 ,某产品可以只使用很少的几个系统调用 ,而另一个产品则可能使用了几乎所有的系统调用 。这样可以减少操作系统内核所需的存储器空间 (RAM 和 ROM) 。

2畅 强实时性

多数嵌入式操作系统都是硬实时的操作系统 ,抢占式的任务调度机制 。

3畅 统一的接口

针对不同的 CPU ,如 ARM 、 PowerPC 、 x86等 ,嵌入式操作系统都提供了统一接口 。而且很多的嵌入式操作系统还支持 POSIX 规范 , 如 Nucleus 、 VxWorks 、 OSE 、RTlinux 等 ,这样在 Linux 或 UNIX上编写的应用程序可直接移植到目标板上 。

4畅 操作简单 、界面友好

多数嵌入式操作系统操作方便 、简单 ,并提供友好的图形用户界面 (GUI) 。

5畅 提供强大的网络功能

一般商用的嵌入式操作系统都带有网络模块 , 可以支持 TCP/IP 协议及其他协议 ,如 Nucleus Net ,而且这些网络模块都是可裁剪的 ,尺寸小 、性能高 。

6畅 稳定性 ,弱交互性

嵌入式系统一旦开始运行就不需要用户过多的干预 ,这就要求嵌入式操作系统具有

Page 25: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                15     

较强的稳定性 。嵌入式操作系统的用户接口一般不提供操作命令 ,它通过系统的调用命令向用户程序提供服务 。

7畅 固化代码

在嵌入式系统中 ,嵌入式操作系统和应用软件被固化在嵌入式系统的 ROM 中 。 辅助存储器在嵌入式系统中很少使用 。

8畅 良好的移植性

嵌入式操作系统能移植到绝大多数 8位 、 16位 、 32位以至 64位微处理器 、微控制器及数字信号处理器 (DSP) 上运行 。

9畅 微型化

由于嵌入式系统的内存容量通常比较小 ,因此在保证应用功能的前提下 ,操作系统的模型越小越好 。

1畅5畅4  目前市场上流行的嵌入式操作系统

1畅 VxWorksVxWorks是美国 WindRiver 公司于 1983 年设计开发的一种实时嵌入式操作系统

(RTOS) ,是目前使用最广泛 、 市场占有率最高的嵌入式操作系统 。 它支持多种处理器 ,如 x86 、 i960 、 Sun Sparc 、 Motorola MC68xxx 、 MIPS RX000 、 Power PC 等 , 大多数的 VxWorks API是专有的 。

VxWork以其良好的持续发展能力 、高性能的内核 、友好的用户开发环境 、高可靠性和实时性被广泛地应用在通信 、军事 、航空 、航天等高精尖技术及实时性要求极高的领域中 ,如卫星通信 、军事演习 、弹道制导 、飞机导航等 。 在美国的 F唱16 、 F/A唱18 战斗机 , B唱2隐形轰炸机和爱国者导弹上 , 甚至连 1997 年 4 月在火星表面登陆的火星探测器上也使用到了 VxWorks 。

VxWorks 的实时性非常好 , 其系统本身的开销也很小 , 进程调度 、 进程间通信 、中断处理等系统公用程序精练而有效 , 延迟很短 。 VxWorks 提供的多任务机制中对任务的控制采用了占先式 (preemptive priority scheduling) 和轮转调度 ( round唱robinscheduling) 机制 ,充分保证了可靠的实时性 , 使同样的硬件配置能满足更强的实时性要求 ,为应用程序的开发留下了更大的余地 。

由于 VxWorks的高度灵活性 ,用户可以很容易地对这一操作系统进行定制或适当开发 ,来满足自己的实际应用需要 。

2畅 NucleusNucleus实时操作系统是 Accelerater Technology 公司开发的实时嵌入式操作系统 ,

产品只需一次性购买 Licenses 就可以获得操作系统的源码 , 并且免产品版税 。 Nucleus

学出版社

职教技术出版中心

www.abook.cn

Page 26: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

16     嵌入式系统设计与开发 (第二版) 

的另一大好处是程序员不用编写 BSP ,因为操作系统已经开放给程序员 ,不同的目标板在操作系统启动时可以通过修改源码进行不同的配置 。

Nucleus对 CPU 的支持能力比较强 , 支持当前流行的大多数 RISC 、 CISC 、 DSP处理器 ,如 80x86 、 68xxx 、 PowerPC 、 i960 、 MIPS 、 SH 、 ARM 、 ColdFire 等几百种CPU 。 Nucleus内核非常小巧 ,只有 4 ~ 20KB ,稳定性高 。

Nucleus PLUS 采用了软件组件的方法 ,每个组件具有单一而明确的目的 ,通常由几个 C 及汇编语言模块构成 , 提供清晰的外部接口 , 对组件的引用就是通过这些接口完成 。由于采用了软件组件的方法 , Nucleus PLUS 各个组件非常易于替换和复用 。

Nucleus PLUS除提供功能强大的内核操作系统外 ,还提供种类丰富的功能模块 ,例如用于通信系统的局域和广域网络模块 、 支持图形应用的实时化 Windows 模块 、 支持 Internet 的 Web产品模块 、工控机实时 BIOS模块 、图形化用户接口以及应用软件性能分析模块等 ,用户可以根据自己的应用来选择不同的应用模块 。

另外 , Nucleus得到许多第三方工具厂商和方案提供商的支持 , 如 ARM 、 Lauter唱bach 、 TI 、 Infineon 、高通 、 IAR 、 Tasking 等 。 目前 Nucleus 在国内得到广泛的应用 ,特别是在手机制造行业 ,几乎所有的手机厂商都采用了 Nucleus解决方案 。

3畅 Windows CEMicrosoft Windows CE是从整体上为有限资源的平台设计的多线程 、 完整优先权 、

多任务的操作系统 。它的模块化设计允许它对从掌上电脑到专用的工业控制器的用户电子设备进行定制 。

Windows CE操作系统的基本核心需要至少 200KB的 ROM 。它支持 Win32 API的子集 ,支持多种用户界面和硬件 ,同时提供令人熟悉的开发模式和工具 。

Windows CE有 5个主要的模块 。内核模块 :支持如进程 、线程处理及内存管理这样的基本服务 。内核系统接口模块 :允许应用软件访问操作系统提供的服务 。文件系统模块 :支持 DOS 等格式的文件系统 。图形窗口和事件子系统模块 :控制图形和 Windows相关的图形用户界面 。通信模块 :允许同其他的设备进行信息交换 。Windows CE操作系统提供与 PC类似的丰富的图形界面和主要应用程序 , 使熟悉

PC版 Windows系统的用户能很快学会它的使用 。

4畅 嵌入式 Linux自由免费软件 Linux 是一个类似于 UNIX 的操作系统 。 嵌入式 Linux 由于代码开

放及强大的网络功能 ,在嵌入式产品的开发中具有巨大的潜力 。嵌入式 Linux 的优点如下 :瞯 Linux 是由很多体积小且性能高的微内核系统组成 。 在内核代码完全开放的前提下 ,不同领域和不同层次的用户可以根据自己的应用需要方便地对内核进行改造 ,以低成本设计开发出满足自己需要的嵌入式系统 。

Page 27: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                17     

瞯 Linux 诞生于因特网时代并具有 UNIX 的特性 , 强大的网络功能保证了它支持所有标准的 Internet 协议 ,可以利用 Linux 的网络协议栈开发嵌入式的 TCP/IP网络协议栈 。 此外 , Linux 还支持 ext2 、 fat16 、 fat32 、 romfs 等文件系统 , 为开发嵌入式系统打下了很好的基础 。

瞯 Linux 具备一整套工具链 , 容易自行建立嵌入式系统的开发环境和交叉运行环境 ,可以跨越嵌入式系统开发中仿真工具的障碍 。 Linux 也符合 IEEE POSIX畅 1标准 ,使应用程序具有较好的可移植性 。

瞯 传统的嵌入式程序调试和调试工具是用在线仿真器 (ICE) 实现的 。它通过取代目标板的微处理器 ,给目标程序提供一个完整的仿真环境 , 完成监视和调试程序 ,但一般价格比较昂贵 。 使用嵌入式 Linux , 如果软硬件能够支持正常的串口功能 ,即使不用仿真器 ,也可以很好地进行开发和调试工作 , 从而大大节省开发费用 。嵌入式 Linux 为开发者提供了一套完整的工具链 。 它利用 GNU 的gcc做编译器 ,用 gdb 、 kgdb 、 xgdb 做调试工具 , 能够很方便地实现从操作系统到应用软件各个级别的调试 。

瞯 Linux 具有广泛的硬件支持特性 。无论是 RISC还是 CISC 、 32位还是 64位等各种处理器 , Linux 都能运行 。 Linux 支持各种主流硬件设备和最新的硬件技术 ,甚至可以在没有存储管理单元 (MMU) 的处理器上运行 (如 μCLinux) 。 这意味着嵌入式 Linux 将具有更广泛的应用前景 。

嵌入式 Linux 也存在着一些不足 :瞯 实时性是嵌入式操作系统的基本要求 。由于 Linux 还不是一个真正的实时操作系统 ,内核不支持事件优先级和占先实时特性 , 所以在开发嵌入式 Linux 的过程中 ,首要问题是扩展 Linux 的实时性能 。

瞯 Linux 内核的所有部分都集中在一起 , 而且所有部件在一起编译连接 。 这样虽然能使系统的各部分直接沟通 ,有效地缩短任务之间的切换时间 , 提高系统的响应速度和 CPU 的利用率 ,但在系统比较大时体积也比较大 ,与嵌入式系统容量小 、资源有限的特点不符 。

瞯 Linux 需要占用较多存储器 。 虽然这可以通过减少一些不必要的功能来弥补 ,但可能会很浪费时间 ,而且容易带来很大的麻烦 。 许多 Linux 的应用程序都要用到虚拟内存 ,这在许多嵌入式系统中是没有价值的 。

瞯 提供完整的集成开发环境是每一个嵌入式系统开发人员所期待的 。 Linux 在基于图形界面的特定系统定制平台的研究上 ,与 Windows操作系统相比还存在差距 。因此 ,要使嵌入式 Linux 在嵌入式操作系统领域中的优势更加明显 , 整体集成开发环境还有待提高和完善 。

5畅 QNXQNX是加拿大 QNX公司的一个实时的 、 可扩充的操作系统 , 它部分遵循 POSIX

相关标准 ,如 POSIX畅1b的实时扩展 。它提供了一个很小的微内核以及一些可选的配合进程 。其内核仅提供 4种服务 :进程调度 、进程间通信 、底层网络通信和中断处理 ,其

学出版社

职教技术出版中心

www.abook.cn

Page 28: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

18     嵌入式系统设计与开发 (第二版) 

进程在独立的地址空间运行 。 所有其他 OS 服务都实现为协作的用户进程 , 因此 QNX内核非常小巧 (QNX4畅 x 大约为 12KB) , 而且运行速度极快 。 这个灵活的结构可以使用户根据实际需求 ,将系统配置成微小的嵌入式操作系统或包含几百个处理器的超级虚拟机操作系统 。

6畅 μC/OS唱IIμC/OS唱II是一种可移植 、可固化 、 可裁剪 、 可剥夺的多任务实时内核 , 所占内存

空间较小 。本书将以 μC/OS唱II 为例介绍嵌入式操作系统 , 关于 μC/OS唱II 将在以后的章节中做进一步介绍 。

7畅 OSEOSE 主要由 ENEA Data AB 下属的 ENEA OSE Systems AB负责开发和技术服务 ,

广泛用于电信 、数据 、工控 、航空等领域 ,

8畅 eCoseCos是 RedHat 公司开发的源代码开放的嵌入式 RTOS 产品 , 是一个可配置 、 可

移植的嵌入式实时操作系统 , 设计的运行环境为 RedHat 的 GNUPro 和 GNU 开发环境 。 eCOS的所有部分都开放源代码 ,可以按照需要自由修改和添加 。

9畅 uITRONTRON 是指 “实时操作系统内核 (The Real唱time Operating system Nucleux)” ,它

是在 1984年由东京大学的 Sakamura 博士提出的 , 目的是建立一个理想的计算机体系结构 。通过工业界和大学院校的合作 , TRON 方案正被逐步应用到全新概念的计算机体系结构中 。 uITRON 是 TRON 的一个子方案 , 它具有标准的实时内核 , 适用于任何小规模的嵌入式系统 。

10畅 Palm OSPalm OS是 3Com 公司的 Palm Computing部开发的一种 32 位的嵌入式操作系统 ,

主要用于智能手机和 PDA 。

1畅6  嵌入式系统的开发1畅6畅1  嵌入式系统设计流程

嵌入式系统设计流程如图 1畅6所示 ,主要有 6个步骤 。

1畅 需求分析

确定设计任务和目标 ,并制定规格说明文档 , 作为下一步设计的指导和验收标准 。需求分析往往要与用户反复交流 ,以明确系统功能需求 ,性能需求 ,环境 、可靠性 、成

Page 29: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                19     

图 1畅6  嵌入式系统设计流程

本 、功耗 、资源等需求 。

2畅 体系结构设计

体系结构设计是嵌入式系统的总体设计 ,它需要确定嵌入式系统的总体构架 ,从功能上对软硬件进行划分 。 在此基础上 ,确定嵌入式系统的硬件选型 (主要是处理器选型) 、操作系统的选择和开发环境的选择 。

3畅 硬件的设计 、制作及测试

在这一阶段要确定硬件部分的各功能模块及模块之间的关联 ,并在此基础上完成元器件的选择 、原理图绘制 、印刷电路板 (PCB) 设计 、硬件的装配与测试 、 目标硬件最终的确定和测试 。

4畅 软件的设计 、实现及测试

这部分工作与硬件开发并行 、交互进行 。软件设计主要完成引导程序的编制 、操作系统的移植 、驱动程序的开发 、应用软件的编写等工作 。设计完成后 ,软件开发进入实

学出版社

职教技术出版中心

www.abook.cn

Page 30: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

20     嵌入式系统设计与开发 (第二版) 

现阶段 。这一阶段主要是嵌入式软件的生成 (编译 、 链接) 、 调试和固化运行 , 最后完成软件的测试 。

5畅 系统集成

将测试完成的软件系统装入制作好的硬件系统中 ,进行系统综合测试 ,验证系统功能是否能够正确无误地实现 ,最后将正确的软件固化在目标硬件中 。本阶段的工作是整个开发过程中最复杂 、最费时的 ,特别需要相应的辅助工具支持 。

6畅 系统性能测试及可靠性测试

测试最终完成的系统性能是否满足规格说明文档的各项性能指标和要求 。若满足 ,则可将正确无误的软件固化在目标硬件中 ;若不能满足 ,在最坏的情况下 ,则需要回到设计的初始阶段重新进行设计方案的制定 。

1畅6畅2  嵌入式系统开发中的一些问题

嵌入式系统包含硬件和软件两部分 ,嵌入式系统开发的最大特点就是需要软硬件综合开发 ,软件又是嵌入式系统的核心 。 嵌入式系统的硬件架构上以嵌入式处理器为中心 ,配置存储器 、 I/O 设备 、 通信模块等必要的外设 ; 软件部分以软件开发平台为核心 ,向上提供应用编程接口 (API) , 向下屏蔽具体硬件特性的板级支持包 BSP 。 嵌入式系统中 ,软件和硬件紧密配合 ,协调工作 ,共同完成系统预定的功能 。与通用计算机相比 ,嵌入式系统属专用系统 ,资源有限 ,需要借助相应的开发工具才能有效地进行开发 。在嵌入式系统的开发中 ,需要考虑的主要因素有以下几个方面 。

1畅 软硬件协同设计

传统的嵌入式开发 ,硬件和软件分为两个独立的部分 , 这只能改善硬件/软件各自的性能 ,不可能达到整个系统的最优 。在嵌入式系统中 ,软件和硬件是紧密配合 、协调工作的 ,从理论上来说 , 每一个应用系统都存在一个适合该系统的硬件 、 软件最佳组合 。这就产生了一种全新的发展中的设计理论 ——— 软硬件协同设计 。这种方法对软硬件统一表示和功能划分 ,设计时考虑软硬件的实现 ,以取得最好的效果 。软硬件协同设计的过程可归纳为 :

瞯 需求分析 。瞯 软硬件协同设计 。瞯 软硬件实现 。瞯 软硬件协同测试和验证 。这种方法的特点是协同设计 (co唱design) 、 协同测试 (co唱test) 和协同验证 (co唱

verification) 。它充分考虑了软硬件的关系 , 并在设计的每个层面上给予测试验证 , 使得尽早发现和解决问题 ,避免灾难性的错误出现 ,提高开发效率 。

Page 31: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                21     

2畅 嵌入式处理器的选择

在嵌入式系统的硬件中 ,嵌入处理器是整个系统的核心部件 ,其性能的好坏直接决定整个系统的运行效果 。由于应用各不相同 ,嵌入式处理器种类繁多 , 因此选择一款合适的处理器并不是一件容易的事 ,设计者在选择处理器时要考虑的主要因素有三个方面 。

(1) 应用的类型面向应用是嵌入式系统的特色 ,具体的应用需求决定着嵌入式处理器的类型选择 ,

不同的应用领域所需的处理器类型是不同的 。当今嵌入式处理器发展的一个主要趋势是面向不同行业应用的特点进行开发 , 并且多采用 SoC 技术 。 因此 , 根据应用的类型选择合适的处理器不仅是必需的 ,而且也是可能的 。

(2) 性能和技术指标开发人员通过应用需求分析获取了产品的功能性和非功能性指标后 ,分析研究市场

上各大厂商提供的各款嵌入式处理器的性能指标 (如功耗 、 体积 、 成本 、 可靠性 、 速度 、处理能力 、电磁兼容性等) ,以选择满足应用需求的嵌入式处理器 。 嵌入式处理器选择的基本原则是满足具体功能性和非功能性指标需求 ,市场应用反应良好 ,硬件配置最少 。

(3) 其他因素此外 ,还有一些其他因素的考虑 ,如处理器是否有较好的软件开发工具支持 、是否

内置调试工具 、供应商是否提供评估板以及开发人员对此系列处理器的熟悉程度等 。

3畅 操作系统的选择

简单的嵌入式产品开发不需要操作系统的支持 , 但复杂应用就需要实时操作系统(RTOS) 的支持了 。使用 RTOS 可以使复杂问题分而治之 , 减少开发人员的劳动 , 提高产品的可靠性 、缩短产品的上市周期 。

由于具体嵌入式应用的功能需求差异以及众多的 RTOS 间不同的性能指标 , 因此RTOS的选择也有许多因素要考虑 :首先是它们的性能评价指标 ;其次要考虑是选用商用的还是免费的 ;此外 ,还要考虑支持何种处理器硬件平台以及何种 API ,是否支持内存管理单元 MMU ,以及是否具有可移植性 、调试支持 、标准支持等 。如果用于开发网络应用 ,还需要考虑该 RTOS 是否支持 TCP/IP 的网络组件和 I/O 服务等 。 如果用于开发游戏和娱乐应用 ,要着重考察该 RTOS对多媒体的支持能力 。

4畅 嵌入式系统的交叉开发环境

嵌入式系统通常是一个资源受限的系统 ,因此直接在嵌入式系统的硬件平台上编写软件比较困难 , 甚至是不可能的 。 因此 , 需要一个交叉开发环境 (cross developmentenvironment) 。所谓交叉开发是指在通用计算机上 (如通用 PC 机) 编辑 、 编译程序 ,生成目标平台上可以运行的二进制代码格式指令 ,最后再下载到目标平台上运行调试的开发方式 。通用计算机一般称为宿主机 ,目标平台称为目标机 。交叉开发环境一般由运

学出版社

职教技术出版中心

www.abook.cn

Page 32: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

22     嵌入式系统设计与开发 (第二版) 

行于宿主机上的交叉开发软件和系统仿真器组成 ,如图 1畅 7所示 。交叉开发软件一般为一个整合了编辑 、交叉编译/汇编 、链接 、 交叉调试 、 工程管理及函数库等功能模块的集成开发环境 IDE (integrated development environment) 。

图 1畅7  交叉开发环境

交叉编译器用于在宿主机上生成能在目标机上运行的代码 ,而交叉调试器和系统仿真器则用于在宿主机与目标机间完成嵌入式软件的调试 。 在采用宿主机/目标机模式开发嵌入式应用软件时 ,首先利用宿主机上丰富的资源和良好的开发环境开发和仿真调试目标机上的软件 ,然后通过串口或者以太网络将交叉编译生成的目标代码传输并装载到目标机上 ,并在监控程序或者操作系统的支持下利用交叉调试器进行分析和调试 ,最后目标机在特定环境下脱离宿主机单独运行 。

目前常用的交叉开发环境主要有开放和商业两种类型 。开放的交叉开发环境的典型代表是 GNU工具链 ,目前已经能够支持 x86 、 ARM 、 MIPS 、 PowerPC等多种处理器 。商业的交叉开发环境则主要有 Metrowerks CodeWarrior 、 ARM Software Development Toolkit 、SDS Cross Compiler 、 WindRiver Tornado 、 Microsoft Embedded Visual C + + 等 。

(1) 集成开发环境基于 ARM 的集成开发环境有多种 ,如 Multi 、 ADS 、 Embest IDE 和 RVDS等 。1) Multi 2000集成开发环境 。 Multi 2000 是美国 Green Hills 软件公司 (www .ghs .

com) 开发的集成开发环境 ,支持 C/C + + /Embedded C + + /Ada 95/Fortran编程语言的开发和调试 ,可运行于 Windows平台和 UNIX平台 ,并支持各类设备的远程调试 。

Multi 2000支持的编译器除了该公司的各类编译器和其他遵循 EABI (embed唱dedapplication binary interface) 标准的编译器外 ,还支持 16位 、 32位 、 64位的处理器和 DSP , 包括 PowerPC 、 ARM 、 MIPS 、 x86 、 Sparc 、 TriCore 、 SH唱DSP 等 , 并支持多处理器调试 。

Multi 2000包含完成一个软件工程所需要的所有工具 ,这些工具可以单独使用 , 也可集成第三方系统工具 。

2) RVDS集成开发环境 。 Real View Developer Suite 工具是 ARM 公司继 ADS 之后推出的新一代 ARM 集成开发环境 , 是 RealView ARM 新一代开发工具集中的集成开发环境部分 。 RealView ARM 完整的开发工具包括集成开发环境 、 在线调试工具仿

Page 33: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                23     

真器等 。其中的 RVDS集成开发环境支持所有 ARM 处理器 ,并与众多第三方实时操作系统及工具商合作简化开发流程 ,适用于采用多 ARM 内核结构或 ARM 内核加 DSP内核混合结构的系统 ,为开发人员提供一个 “认识操作系统 (OS唱aware)” 的多内核调试器 。新产品是第一个能对多 ARM 和 DSP 内核真正同步进行高集成度调试的调试器 。它通过单一内核程序进行多内核调试 ,并采用了 Mentor Graphics 的嵌入技术 。 支持的操作系统包括 Symbian 、 ThreadX和 Nucleus等 。 RVDS集成开发环境主要包含编译工具 、调试工具和指令集仿真工具 。

3) ARM 的 ADS 。 ADS 即 ARM Developer Suite , 是 ARM 公司推出的新一代ARM 集成开发工具 , 用来取代 ARM 公司在此前推出的开发工具 ARM SDT (ARMsoftware development toolkit) 。本书将在后面的章节中介绍 ADS的使用 。

4) Embest IDE 集成开发环境 。 Embest IDE 的英文全称是 Embest Integrated De唱velopment Environment ,是由深圳市英蓓特信息技术有限公司开发 , 应用于嵌入式软件开发的集成开发环境 。提供嵌入式应用软件开发平台 ,具有一整套完备的面向嵌入式系统的开发和调试工具 ,包括编辑器 、编译器 、链接器 、调试器 、工程管理器和底层调试接口设备 (BDM/JTAG 仿真器) 等 。 图 1畅8 是 Embest IDE 的工具集示意图 , 最上面的是安装在计算机中的集成开发环境 ,通过中间的仿真器同下层的目标板相连 ,从中也可以体会到嵌入式系统开发的交叉编译概念 。 Embest IDE 集成开发环境的界面同Microsoft Visual Studio环境相似 ,可以在其中创建工程 、 打开工程 , 建立 、 打开和编辑文件 ,编译 、链接 、运行 、调试嵌入式应用程序 。

图 1畅8   Embest IDE工具集示意图(2) 仿真器仿真器处于宿主机和开发目标机之间 , JTAG 仿真器是目前 ARM 开发中采用最多

的一种仿真器 。它的一端通过并口 、 串口 、 网口或 USB 接口与宿主机相连 , 另一端通过 ARM 处理器的 JTAG 调试接口与目标机相连 ,实现调试通信 。 JTAG 属于完全非插入式 (即不使用片上资源) 调试 ,它无需目标存储器 ,不占用目标系统的任何端口 ,而这些是驻留监控软件所必需的 。 另外 , 由于 JTAG 调试的目标程序是在目标板上执行的 ,仿真更接近于目标硬件 ,因此许多接口问题 , 如高频操作限制 、 AC 和 DC 参数不匹配与电线长度的限制等均被最小化了 。通过 JTAG 方式可以完成以下功能 。

瞯 读出/写入 CPU 的寄存器 ,访问控制 ARM 处理器内核 。

学出版社

职教技术出版中心

www.abook.cn

Page 34: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

24     嵌入式系统设计与开发 (第二版) 

瞯 读出/写入内存 ,访问系统中的存储器和系统端口 。瞯 访问 ASI C系统 。瞯 访问 I/O 系统 。瞯 控制程序运行 、停止 、单步执行和实时执行程序 、设置程序断点 。瞯 复位目标系统 、下载代码到目标 ARM 。瞯 实时地设置基于指令地址值 、数据值的断点 。目前国内常用的 JTAG 仿真器有 : Multi唱ICE 、 RealView ICE 、 TRACE32唱ICD 、

Embest PowerICE for ARM 等 。1) RealView ICE 。 RealView ICE是 ARM 公司的仿真器 。该产品提供高速下载的

JTAG 仿真 ,在 10MHz JTAG 上速度超过 600KB/s 。 该级别性能可以通过以太网或USB接口与高速主机相连接而实现 。 可选择 RealView Trace 模块插入 RealView ICE单元 ,就会以超过 200 MHz 的数据速度从片上嵌入追踪宏单元 (ETM) 获取信息 。 开发者从获得的踪迹信息中可以识别难以发现的软硬件交互错误和进行性能优化 。这些高性能调试解决方案有助于缩短开发时间和产品上市周期 。其主要特性如下 。

瞯 基于 ARM7 内核的 ARM/THUMBA C 编译器 、 支持 ARM/Thumb 指令集的分别编译/混合编译和混合调试 。

瞯 支持 Windows 2000 、 Windows XP操作系统 。瞯 包含功能强大的图形界面 (GUI) 调试器 。瞯 包含一套硬件仿真工具 ,可进行硬件调试 。瞯 C编译器的代码尺寸优化 、代码性能优化 。瞯 可选择的调试/优化等级 。瞯 全面支持 ARM/Thumb的宏汇编编译器 。瞯 具备命令行选项的快速 GUI操作 。瞯 内部集成编辑器和工程管理器 。瞯 支持命令行接口和语言描述 。2) TRACE32唱ICD 。 TRACE32唱ICD 是德国 Lauterbach 公司开发的基于 BDM 、

JTAG 和 OCDS等调试接口的仿真工具 ,基本功能如下 。瞯 单步 、多步或全速执行程序 。瞯 在汇编和高级语言上设置程序软件或硬件断点 , 在任意地址或地址范围上设置访问断点 、地址描述符断点 、驻留断点 。

瞯 基于地址/数据内容的事件触发 、 基于计时/计数器的事件触发 、 基于各种断点的触发和外部触发输入/输出 。

瞯 程序执行过程的追踪记录 。瞯 程序性能分析 ,计算程序的执行时间 。瞯 程序的覆盖率分析 。瞯 RTOS任务级调试 。瞯 提供的辅助调试手段有在线汇编功能 、 程序运行记时器 、 模拟 Terminal 、 文件输入/输出 、 PRACTICE 脚本语言和 Flash在线编程等 。

Page 35: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                25     

瞯 通过 PODBUS 总线将 TRACE32唱ICD 的各个模块连接在一起 , 使 TRACE32唱ICD具有多处理器并行调试功能 。 一台 TRACE32唱ICD 可以通过级联的方式连接多个调试模块 ,每个调试模块调试一个处理器 , 且处理器可以是异构的 。 例如 ,可以用一台 TRACE32唱ICD调试目标板上的 ARM 和 MPC8260芯片 。

3) Embest PowerICE for ARM 。 Embest PowerICE for ARM 是英蓓特公司开发的实时在线仿真器 ,其主要特性如下 。

瞯 支持 Embest IDE集成开发环境 。瞯 支持 ARM 系列的 CPU 内核 (目前主要是 ARM7和 ARM9系列的 CPU 核) 。瞯 Embest PowerICE for ARM 提供支持 Windows 98/NT/2000 /XP的驱动程序 。瞯 3V/5V 兼容电平接口 。瞯 支持标准的 14/20针 JTAG 接口 。瞯 支持最多两个硬件断点/两个数据断点/不限数目的软件断点 。瞯 支持汇编级调试 ,支持 ARM 、 Thumb及指令集交叉调试 。瞯 支持标准 C语言程序调试 。瞯 非插入式调试 ,不占用板上任何资源 。瞯 支持目标板供电或外接电源 。瞯 LED指示运行状态 。瞯 支持 Flash在线编程 。瞯 采用标准并口技术 , 无须选择 ECP (Extended Capabilities Ports , 扩展功能端口) 、 EPP (Enhanced Parallel Ports ,增强并行口) 。

瞯 下载速度高达 120KB/s 。5畅 嵌入式系统的调试

调试是嵌入式系统开发过程的重要环节 。在嵌入式系统中 ,调试器是运行在宿主机操作系统上的应用程序 ,被调试程序是运行在目标机操作系统上的应用程序 ,两个程序间需要实时通信 。嵌入式系统调试时 ,主机上运行的集成开发调试工具 (调试器) 通过仿真器和目标机相连 ,三者之间的关系见图 1畅7 。仿真器处理宿主机和目标机之间所有的通信 ,这个通信口可以是串口 、 并行口或者高速以太网接口 。 仿真器通过 JTAG 接口或其他接口与目标机相连 。

嵌入式系统开发过程中的调试方式有很多种 ,应根据实际的开发要求和条件进行选择 ,以下是几种常用的调试方式 。

(1) 源程序模拟器源程序模拟器是一种利用宿主机端的软件 ,模拟目标机的环境来执行目标机源程序

的模拟调试方法 ,这样做的好处是在目标机硬件环境还没有建立起来时即可用模拟环境调试程序 。但值得注意的是 ,模拟器毕竟是以一种处理器模拟另一种处理器的运行 ,在指令执行时间 、中断响应 、定时器等方面很可能与实际处理有相当大的差别 ,它无法和ICE一样仿真嵌入式系统在应用系统中的实际执行情况 。 ARM 公司的 ARMulator 是一个源程序模拟器的例子 。

学出版社

职教技术出版中心

www.abook.cn

Page 36: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

26     嵌入式系统设计与开发 (第二版) 

(2) ROM 监控器ROM 监控器是一段运行在目标 ROM 上的可执行程序 , PC机端调试软件可通过并

口 、串口 、网口与之交互 。在使用这种调试方式时 ,被调试程序首先通过 ROM 监控器下载到目标机中 ,然后在 ROM 监控器的监控下完成调试 , 目前使用的绝大部分 ROM监控器能够完成设置断点 、 单步执行 、 查看寄存器 、 修改内存空间等各项调试功能 。ARM 公司的 Angel是 ROM 监控器的一个例子 。

(3) 在线仿真器采用 ICE 方式进行交叉调试时需要使用在线仿真器 (in唱circuit emulator , ICE) 。

在线仿真器使用仿真头代替目标板上的 CPU ,可以完全仿真处理器芯片的行为 , 并且提供了非常丰富的调试功能 ,但结构较复杂 、价格高昂 ,通常用于硬件开发中 。

(4) 在线调试器采用 ICD方式进行交叉调试时需要使用在线调试器 (in唱circuit debugger , ICD) 。

由于 ICE 的价格非常昂贵 ,并且每种 CPU 都需要一种与之对应的 ICE , 使得开发成本非常高 ,一个比较好的解决办法是让 CPU 直接在其内部实现调试功能 , 并通过在开发板上引出的调试端口 ,发送调试命令和接收调试信息 , 完成调试过程 。 目前 Motorola公司提供的开发板上使用的是 BDM (background debug monitor) 调试端口 , 而 ARM公司提供的开发板上使用的则是 JTAG (joint test action group) 调试端口 , 使用合适的软件工具与这些调试端口进行连接 ,可以获得与 ICE 类似的调试效果 。

6畅 JTAG 接口JTAG 是 Joint Test Action Group (联合测试行为组织) 的缩写 ,它是为解决日益

复杂的集成电路的测试问题而制定的边界扫描标准 , 使用 JTAG 边界扫描标准只需 5根引脚就可以测试各种集成电路芯片 。在 ARM 处理器中 ,可以通过 JTAG 接口直接控制 ARM 的内部总线 、 I/O 接口等信息 ,从而达到调试的目的 。

边界扫描机制的主要思想是 :通过在内部逻辑之间 ,即在内部逻辑的边界上增加串行的可读写的边界扫描单元 ,从而提供芯片级 、板级 、系统级的标准测试框架 。边界扫描机制可以实现下列目标 。

瞯 测试不同单元之间的连接 。瞯 测试单个单元的功能 。瞯 应用边界扫描寄存器完成其他测试功能 , 如伪随机测试 、 特征分析和静态测试等 。

边界扫描机制提供了一种完整的 、标准化的可测试性设计方法 。现在使用的开发板和实验箱一般都把芯片上的 JTAG 接口引出 , 在自己进行 ARM

嵌入式系统开发时为了便于系统调试也应引出芯片上的 JTAG 接口 。 现在常用的是 14针或 20针的 JTAG 接口 ,图 1畅9和图 1畅10分别是 20 针的 JTAG 接口信号分布和连接情况 ,它们的主要信号是以下 6个信号 。

1) Test Clock Input (TCK) 。 TCK 为 TAP 的操作提供了一个独立的 、 基本的时钟信号 , TAP的所有操作都是通过这个时钟信号来驱动的 。 TCK 在 IEEE 1149畅1 标准

Page 37: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 1章  概    述                27     

里是强制要求的 。2) Test Mode Selection Input (TMS) 。 TMS 信号用来控制 TAP 状态机的转换 ,

通过 TMS 信号可以控制 TAP在不同的状态间相互转换 。 TMS在 IEEE 1149畅1 标准里是强制要求的 。

3) Test Data Input (TDI) 。 TDI是数据输入接口 。所有要输入到特定寄存器的数据都是通过 TDI接口串行输入的 (由 TCK 驱动) 。 TDI 在 IEEE 1149畅1 标准里是强制要求的 。

4) Test Data Output (TDO) 。 TDO 是数据输出的接口 。 所有要从特定边界扫描链采样的保存在寄存器中的数据都是通过 TDO 接口串行输出的 (由 TCK 驱动) , 在芯片串行测试时 ,将数据传送给下一个芯片 。 TDO 在 IEEE 1149畅1标准里是强制要求的 。

5) Test Reset Input (TRST/nTRST) 。 TRST 可以用来对 TAP Controller 进行复位 (初始化) ,即 JTAG 复位 。该信号接口在 IEEE 1149畅1标准里是可选的 , 因为通过TMS也可以对 TAP Controller 进行复位/初始化 。 为了防止误触发 , 应在该端加适当上拉电阻 。

6) System Reset (nSRST/SRST) 。与目标板上的系统复位信号相连 , 可以直接对目标系统复位 , 同时可以检测目标系统的复位情况 。 该信号接口在 IEEE 1149畅1 标准里是可选的 ,并不是强制要求的 。

图 1畅9   20针 JTAG接口信号

图 1畅10   20针 JTAG接口连接

这里 “强制要求” 的意思是在提供 JTAG 接口时必须提供 , 而 “可选” 的意思就是提供 JTAG 接口时可提供也可不提供 。

除了这 6个信号外常用的还有电源和地信号 。IEEE 1149畅 1规定实际的嵌入式系统中 nTRST 、 TDI和 TMS三个信号要加上适当

的上拉电阻 ,也只有这样整个芯片 IC才能运行在各种相应的调试状态 。 TCK 信号也要

学出版社

职教技术出版中心

www.abook.cn

Page 38: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

28     嵌入式系统设计与开发 (第二版) 

接上一定的上拉电阻 ,使内部电路得到适当的驱动逻辑电平 , 如图 1畅10 所示是一种连接情况 。

本 章 要 点

瞯 嵌入式系统是以应用为中心 、 计算机技术为基础 、 软硬件可裁剪 , 以适应应用系统对功能 、可靠性 、成本 、体积和功耗有严格要求的专用计算机系统 。 嵌入性 、专用性 、计算机系统是嵌入式系统的三要素 。

瞯 嵌入式系统由硬件和软件组成 ,硬件部分包括处理器/微处理器 、 存储器 、 I/O接口及输入/输出设备 。嵌入式系统的软件由嵌入式操作系统和应用程序组成 。

瞯 嵌入式处理器的分类主要有 MPU 、 MCU 、 DSP和 SoC 。瞯 嵌入式操作系统一般可以分为实时操作系统和非实时操作系统 。瞯 嵌入式系统设计主要有需求分析 、 体系结构设计 、 硬件的设计制作及测试 、 软件的设计实现及测试 、系统集成 、系统性能测试及可靠性测试几个步骤 。

瞯 嵌入式系统通常是一个资源受限的系统 ,因此需要一个交叉开发环境 。瞯 嵌入式系统开发过程中常用的调试方式有源程序模拟器 、 ROM 监控器 、 在线仿真器和在线调试器 。

习    题

1畅 什么是嵌入式系统 ?试举出一些生活中常见的嵌入式产品 。2畅 嵌入式系统的特点是什么 ?3畅 什么是交叉开发环境 ?4畅 选择嵌入式微处理器时 ,应考虑哪些因素 ?5畅 什么是可重入代码 ?如何使一个函数具有可重入性 ?6畅 什么是 JTAG ?它有哪些特点 ?7畅 什么是 BSP ?它一般应完成哪些工作 ?8畅ROM Monitor 调试和 ICD调试的主要优缺点分别是什么 ?

Page 39: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型

2畅1   ARM  简  介

ARM (Advanced RISC Machines) 是一家专门从事基于 RISC ( reduced instruc唱tion set computer ,精简指令集) 技术芯片设计开发的公司 , 成立于 1990 年 11 月 , 前身为英国剑桥的 Acorn计算机有限公司 。 ARM 公司是设计公司 , 是知识产权 (IP) 供应商 ,本身不生产芯片 ,靠转让设计许可由合作伙伴来生产各具特色的芯片 。世界各大半导体生产商从 ARM 公司购买其设计的 ARM 微处理器核 , 根据各自不同的应用领域 ,加入适当的外围电路 ,从而形成自己的 ARM 微处理器芯片进入市场 。 ARM 公司商业模式的强大之处在于它在世界范围有超过 100个的合作伙伴 ,从而激发了大量的开发工具和丰富的第三方资源 。 20世纪 90 年代以来 , ARM 32 位嵌入式 RISC 处理器的应用扩展到世界范围 ,占据了低功耗 、低成本和高性能的嵌入式系统应用领域的领先地位 ,形成了 32位 RISC微处理器的实际标准 。因此 , ARM 既可以认为是一个公司的名称 ;也可以认为是对一类微处理器的通称 ,即 ARM 处理器 ;还可以认为是一种技术的名称 ,即 ARM 内核技术 (生产 ARM 系列处理器所采用的技术) 。

ARM 芯片作为 32位 RISC微处理器具有 RISC 体系的一般特点 ,如 :瞯 具有大量的寄存器 ,大多数数据操作都在寄存器中完成 。瞯 寻址方式灵活简单 ,执行效率高 。瞯 通过载入和存储指令访问存储器 。瞯 采用固定长度的指令格式 。除此以外 , ARM 体系也采用了一些别的技术 ,在保证高性能的同时尽量减小芯片

体积 ,降低芯片功耗 。这些技术包括 :瞯 所有的指令都可以条件执行 ,以提高指令执行的效率 。瞯 同一条数据处理指令中包含算术逻辑单元处理和移位处理 。瞯 使用地址自动增加 (减少) 来优化程序中的循环处理 。瞯 载入和存储指令可以批量传输数据 ,从而提高数据传输效率 。ARM 处理器一般都具有体积小 、功耗低 、成本低 、 性能高的优点 , 具有 16 位/32

位双指令集 (ARM 指令集/Thumb指令集) , 微处理器可以在 ARM 和 Thumb 两种工作状态之间切换 ; ARM 支持 7种运行模式 ,提高了处理器的灵活性和工作效率 ; ARM处理器具有协处理器接口 ,能够连接多个协处理器共同工作 ;全球众多的合作伙伴的保证供应 ,使 ARM 在嵌入式系统领域得到了广泛应用 。

学出版社

职教技术出版中心

www.abook.cn

Page 40: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

30     嵌入式系统设计与开发 (第二版) 

2畅2   RISC体系结构说到 ARM 就不得不提到 RISC以及与其相对的 CISC这两个概念 。CISC (complex instruction set computer) 即复杂指令集 , 在 20 世纪 90 年代前被

广泛使用 ,其特点是通过存放在只读存储器中的微码 (microcode) 来控制整个处理器的运行 。

一条指令往往可以完成一串运算的动作 ,但却需要多个时钟周期来执行 。随着需求的不断增加 ,设计的指令集越来越多 ,为支持这些新增的指令 ,计算机的体系结构会越来越复杂 。然而 ,在 CISC指令集的各种指令中 ,其使用频率却相差悬殊 ,大约有 20 %的指令会被反复使用 ,占整个程序代码总量的 80 % 。 而余下的 80 % 的指令却不经常使用 ,只有 20 %的使用概率 ,显然这种结构是不太合理的 。

为改变这种状况 , 1980年 Pat terson和 Ditzel 两位学者完成了一篇题为 枟精简指令集计算机概述枠 的开创性论文 ,全面提出了精简指令集的设计思想 。随后 ,柏克来大学的研究生依照此理论基础 ,设计出了第一颗精简指令集处理器 RISC I , 这颗处理器远比当时已经相当流行的 CISC处理器简单得多 , 在设计上所花费的功夫也降低许多 , 但整体功能上的表现却与 CISC处理器不相上下 。 从此 ,处理器设计便分别向着这两个大的方向发展 。实际上 1980年以来 ,所有新的处理器体系结构都或多或少地采用了 RISC的概念 ,甚至有些典型的 CISC 处理器中也采用了 RISC 设计思想 , 例如 Intel 公司的80486 、 Pentium 系列等 。而 RISC 思想最成功也是第一个商业化的实例就是 ARM , 当然 ,它也放弃了一些 RISC特征而保留了一些 CISC 特征 。

RISC和 CISC在构架上有以下区别 。1) 首先是指令集的设计上 , RISC 构架的指令格式和长度通常是固定的 (如 ARM

是 32位的指令) ,且指令和寻址方式少而简单 ,大多数指令在一个周期内就可以执行完毕 ; CISC构架下的指令长度通常是可变的 , 指令类型也很多 , 一条指令通常要若干周期才可以执行完毕 。由于指令集多少与复杂度上的差异 , 使 RISC 的处理器可以利用简单的硬件电路设计出指令解码 (decode) 功能 , 这样易于流水线的实现 。 相对的 CISC则需要通过只读存储器里的微码来进行解码 , CISC因为指令功能与指令参数变化较大 ,执行流水线作业时有较多的限制 。

2) 其次 , RISC在结构设计上是一个载入/存储 (load/store) 的构架 , 只有载入和存储指令可以访问存储器 ,数据处理指令只对寄存器的内容进行操作 。为了提高程序运算速度 , RISC会设定多组寄存器 ,并且指定特殊用途的寄存器 。 CISC构架则允许数据处理指令对存储器进行操作 ,对寄存器的要求相对不高 。

2畅3   ARM 体系结构2畅3畅1   ARM体系结构的版本

ARM 指令集体系结构 ,从最初开发至今已有了重大改进 ,而且将会不断完善和发

Page 41: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            31     

展 。为了精确表达每个 ARM 实现中所使用的指令集 , 到目前 ARM 体系结构共定义了6个版本 ,以版本号 v1 ~ v6表示 ,各版本特点如下 。

1畅 版本 1 (v1)该版本包括 :瞯 基本数据处理指令 (不包括乘法) 。瞯 字节 、字以及半字加载/存储指令 。瞯 分支 (branch) 指令 , 包括用于子程序调用的分支与链接 (branch唱and唱link)指令 。

瞯 软件中断指令 ,用于进行操作系统调用 。瞯 26位地址总线 。

2畅 版本 2 (v2)与版本 1相比 ,版本 2增加了下列指令 。瞯 乘法指令 (multiply) 和乘加指令 (multiply唱accumulate) 。瞯 支持协处理器 。瞯 原子性 (atomic) 加载/存储指令 SWP和 SWPB (稍后的版本称 v2a) 。瞯 FIQ 中的两个以上的分组寄存器 。

3畅 版本 3 (v3)版本 3较以前的版本发生了较大的变化 ,具体改进如下 。瞯 推出 32位寻址能力 。瞯 分开的 CPSR (current program status register ,当前程序状态寄存器) 和 SPSR

(saved program status register , 备份的程序状态寄存器) , 当异常发生时 ,SPSR用于保存 CPSR的当前值 ,从异常退出时则可由 SPSR来恢复 CPSR 。

瞯 增加了两种异常模式 ,使操作系统代码可方便地使用数据访问中止异常 、 指令预取中止异常和未定义指令异常 。

瞯 增加了 MRS指令和 MSR指令 ,用于完成对 CPSR和 SPSR寄存器的读/写 ;修改了原来的从异常中返回的指令 。

4畅 版本 4 (v4)版本 4在版本 3的基础上增加了如下内容 。瞯 有符号 、无符号的半字和有符号字节的 load和 store指令 。瞯 增加了 T 变种 ,处理器可工作于 Thumb 状态在该状态下 ,指令集是 16 位压缩指令集 (Thumb指令集) 。

瞯 增加了处理器的特权模式 。在该模式下 ,使用的是用户模式下的寄存器 。另外 ,在版本 4中还清楚地指明了哪些指令会引起未定义指令异常 。版本 4不再强

制要求与以前的 26位地址空间兼容 。

学出版社

职教技术出版中心

www.abook.cn

Page 42: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

32     嵌入式系统设计与开发 (第二版) 

5畅 版本 5 (v5)与版本 4相比 ,版本 5增加或修改了下列指令 。瞯 提高了 T 变种中 ARM/Thumb指令混合使用的效率 。瞯 增加了前导零计数 (CLZ) 指令 。瞯 增加了 BKPT (软件断点) 指令 。瞯 为支持协处理器设计提供了更多可选择的指令 。瞯 更加严格地定义了乘法指令对条件标志位的影响 。

6畅 版本 6 (v6)版本 6是 2001年发布的 。该版本在降低能耗的同时 , 还强化了图形处理性能 。 通

过追加有效多媒体处理的 SIMD (single instruction multiple datast ream ,单指令多数据流) 功能 ,将语音及图像的处理功能提高到了原机型的 4 倍 。 ARM 体系版本 6 首先在2002年春季发布的 ARM11处理器中使用 。除此之外 ,该版本还支持多微处理器内核 。表 2畅1给出了 ARM 处理器核使用 ARM 体系结构版本的情况 。

表 2畅1   ARM处理器核使用 ARM体系结构版本的情况ARM 处理器核 体系结构版本

ARM1 v1ARM2 v2ARM2aS 、ARM3 v2aARM6 、ARM600 、ARM610 v3ARM7 、ARM700 、ARM710 v3ARM7 TDM I 、ARM710 T 、ARM720 T 、ARM740 T v4 TSt rong ARM 、ARM8 、ARM810 v4ARM9 TDM I 、ARM920 T 、ARM940 T v4 TARM9E唱S v5 T EARM10 TDMI 、ARM1020E v5 T EARM11 、ARM1156 T2唱S 、ARM1156 T2F唱S 、ARM1176JZF唱S 、ARM11JZF唱S v6

2畅3畅2   ARM体系结构的变种及版本命名格式

1畅 ARM 体系结构的变种通常将某些特定功能称为 ARM 体系的某种变种 , 例如支持 Thumb 指令集称为 T

变种 。到目前 , ARM 定义了下面一些变种 。(1) T 变种T 变种是支持 Thumb 指令集的 ARM 体系 。 Thumb 指令集是将 32 位 ARM 指令

集的一个子集重新编码而形成的一个指令集 。 Thumb 指令的长度是 16 位 。 Thumb 指

Page 43: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            33     

令集可以得到比 ARM 指令集密度更高的代码 ,这对需要严格控制产品成本的设计是非常有意义的 。目前 Thumb 指令集有两个版本 , 即 Thumb唱1 和 Thumb唱2 , Thumb唱1 是ARM 体系结构版本 4的 T 变种 ; Thumb唱2是 ARM 体系结构版本 5的 T 变种 。

(2) M 变种长乘法指令是一种生成 64位相乘结果的乘法指令 。 M 变种增加了两条用于进行长

乘法操作的 ARM 指令 : 一条用于完成 32 位整数乘以 32 位整数生成 64 位整数的长乘法操作 (32 × 32 痴 64) ;另一条用于完成 32位整数乘以 32位整数 ,再加上 64位整数生成 64位整数的长乘加操作 (32 × 32 + 64 痴 64) 。 M 变种首先在 ARM 体系结构版本 3中引入 ,在 ARM 体系结构版本 4及其以后的版本中 , M 变种是系统的标准部分 。对于支持长乘法指令的 ARM 体系结构版本 ,用字符 M 表示 。

(3) E 变种E 变种增加一些附加指令用于增强处理器对一些典型的 DSP 算法的处理性能 , 主

要包括以下指令 。瞯 几条新的实现 16位数据乘法和乘加操作的指令 。瞯 实现饱和的带符号数的加减法操作的指令 。 所谓饱和的带符号数的加减法操作是在加减法操作溢出时 ,结果并不进行卷绕 , 而是使用最大的整数或最小的负数来表示 。

瞯 进行双字数据操作的指令 , 包括双字读取指令 LDRD 、 双字写入指令 STRD 和协处理器的寄存器传输指令 MCRR/MRRC 。

瞯 cache预取指令 PLD 。E变种首先在 ARM 体系结构版本 5T 中使用 , 用字符 E 表示 。在 ARM 体系结构

版本 5以前的版本中 ,以及在非 M 变种和非 T 变种的版本中 , E 变种是无效的 。(4) J变种ARM 的 Jazelle 技术是 Java 语言和先进的 32 位 RISC 芯片完美结合的产物 。 Ja唱

zelle技术使得 Java代码的运行速度比普通的 Java虚拟机提高了 8 倍 ,这是因为 Jazelle技术提供了 Java加速功能 , 大幅度提高了机器的运行性能 , 而功耗反而降低了 80 % 。Jazelle技术使得在一个单独的处理器上同时运行 Java 应用程序 、 已经建立好的操作系统和中间件以及其他应用程序成为可能 。 Jazelle 技术的诞生使得一些必须用到协处理器和双处理器的场合可用单处理器代替 ,这样既保证了机器的性能 ,又降低了功耗和成本 。 ARM 体系结构版本 4TEJ最早包含了 J变种 ,用字符 J表示 。

(5) SIMD变种ARM 媒体功能扩展 (SIMD) 技术极大地提高了嵌入式应用系统的音频和视频处

理能力 。新一代的 Internet 应用产品 、手机和 PDA 等设备终端需要提供高性能的流式媒体处理能力 ,包括音频和视频等 。而且这些设备需要提供更加人性化的界面 ,包括语音输入和手写输入等 。这样 ,就对处理器的数字信号处理能力提出了很高的要求 ,同时还必须保证低功耗 。 ARM 的 SIMD媒体功能扩展为这些应用系统提供了解决方案 , 它为包括音频和视频处理在内的应用系统提供了优化功能 ,其主要特点如下 。

瞯 使处理器的音频和视频处理性能提高了 2 ~ 4倍 。

学出版社

职教技术出版中心

www.abook.cn

Page 44: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

34     嵌入式系统设计与开发 (第二版) 

瞯 可同时进行 2个 16位操作数或者 4个 8位操作数的运算 。瞯 用户可自定义饱和运算的模式 。瞯 可进行 2个 16位操作数的乘加/乘减运算及 32位乘以 32位的小数乘加运算 。瞯 同时 8 /16位选择操作 。

2畅 ARM 体系结构版本的命名格式表示 ARM/Thumb体系结构版本的命名格式由下面几部分组成 。瞯 基本字符串 ARMv 。瞯 基本字符串后为 ARM 指令集版本号 ,目前是 1 ~ 6的数字字符 。瞯 ARM 指令集版本号后为表示所含变种的字符 。 由于在 ARM 体系版本 4 以后 ,M 变种成为系统的标准部件 ,所以字符 M 通常也不单独列出来 。

瞯 最后使用的字符 x 表示排除某种功能 。 例如 , 在早期的一些 E 变种中 , 未包含双字读取指令 LDRD 、 双字写入指令 STRD 、 协处理器的寄存器传输指令MCRR/MRRC以及 cache预取指令 PLD 。这种 E 变种记作 ExP ,其中 x 表示缺少 , P代表上述的几种指令 。

例如 , ARMv5TExP 表示 ARM 体系结构的版本 5 , 含 T 变种 、 M 变种 , 未包含 P 。

ARM/Thumb体系结构版本名称及其含义是在不断发展变化的 , 最新变化请查阅相关资料 。

2畅3畅3   ARM处理器系列

目前 , ARM 所提供的 16/32 位嵌入式 RISC 内核主要有以下几个系列 : ARM7 、ARM9 、 ARM9E 、 ARM10 、 ARM11 、 SecurCore 以及 Cortex 系列 。 进一步的产品来自合作伙伴 , 如 Intel的 StrongARM 和 Xscale等 。 其中每一类又根据其各自包含的功能模块而分成多种构成 。每个系列的产品的设计都尽量遵循高性能 、低功耗的原则 ,以满足用户日益复杂的应用需求 。

1畅 ARM7系列

ARM7系列包括 ARM7TDMI (ARM7TDMI唱S) 处理器内核和在此基础上发展起来的 ARM710T/720T/740T 等带 cache 的内核 。该系列处理器提供 Thumb 16 位压缩指令集和 EmbeddedICE JTAG 软件调试方式 ,适合应用于更大规模的 SoC 设计中 。 其中 ARM 720T 高速缓冲处理宏单元还提供 8KB 缓存 、存储器管理单元 (MMU) 和写缓存 ,是一款高性能处理器 ,可以支持 Linux 、 Windows CE等操作系统 。

ARM7系列微处理器具有如下特点 。瞯 具有嵌入式 ICE — RT 逻辑 ,调试开发方便 。瞯 功耗极低 ,适合对功耗要求较高的应用 ,如便携式产品 。瞯 能够提供 0畅9MIPS/MHz的三级流水线结构 。瞯 代码密度高并兼容 16位的 Thumb指令集 。

Page 45: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            35     

瞯 对操作系统的支持广泛 ,包括 Windows CE 、 Linux 、 Palm OS 等 。瞯 指令系统与 ARM9系列 、 ARM9E 系列和 ARM10E 系列兼容 ,便于用户的产品升级换代 。

瞯 主频最高可达 130MIPS ,较高的运算处理能力能胜任绝大多数的复杂应用 。ARM7系列广泛应用于多媒体和嵌入式设备 , 包括 Internet 设备 、 手机和 PDA 等

设备 。 ARM7系列中 , ARM7TMDI 是目前使用最广泛的 32 位嵌入式 RISC 处理器 ,属低端 ARM 处理器核 。 TDMI的基本含义如下 。

瞯 T ———支持 16位压缩指令集 Thumb 。瞯 D ———支持片上 Debug 。瞯 M ———内嵌硬件乘法器 (Multiplier) 。瞯 I ———嵌入式 ICE ,支持片上断点和调试点 。本书所介绍的 Samsung 公司的 S3C44B0X即属于该系列的处理器 。

2畅 ARM9系列

ARM9 系列有 ARM9TDMI 内核及在此基础上发展起来的 ARM9E 、 ARM920T 、ARM940T 等内核 。所有的 ARM9 系列处理器都带有 Thumb 压缩指令集和基于 Em唱bedded ICE JA TG 的软件调试方式 。 ARM9系列兼容 ARM7系列 , 而且具有比 ARM7更加灵活的设计 。 ARM9 系列微处理器在低功耗基础上提供优异的性能 , 具有以下特点 。

瞯 五级整数流水线 ,指令执行效率更高 。瞯 提供 1畅 1MIPS/MHz的哈弗体系结构 。瞯 支持 32位 ARM 指令集和 16位 Thumb指令集 。瞯 支持 32位的高速 AMBA 总线接口 。瞯 全性能的 MMU ,支持 Windows CE 、 Linux 、 Palm OS 等多种主流嵌入式操作系统 。

瞯 MPU 支持实时操作系统 。瞯 支持数据 cache和指令 cache ,具有更高的指令和数据处理能力 。ARM9采用 ARMv4T (harvard) 体系结构 ,五级流水处理以及分离的 cache结构 ,

平均功耗为 0畅 7mW/MHz 。 时钟频率为 120M ~ 200MHz ,每条指令平均执行 1畅5 个时钟周期 。 与 ARM7 系列相似 , 其中的 ARM920 、 ARM940 和 ARM9E 为含 cache 的CPU 核 。

ARM9系列主要用于引擎管理 、 仪器仪表 、 安全系统 、 机顶盒 、 高端打印机 、PDA 、网络计算机以及支持音频和视频多媒体的智能手机中 。

ARM9E 系列为 ARM9TDMI 的可综合版本 , 包括 ARM926EJ唱S 、 ARM946E唱S 和ARM966E唱S 。该系列强化了数字信号处理 (DSP) 功能 ,可应用于 DSP 与微控制器结合使用的情况 , 将 Thumb 技术和 DSP 都扩展到 ARM 指令集中 , 并具有 EmbeddedICE唱RT 逻辑 (ARM 的基于 Embedded ICE JTAG 软件调试的增强版本) , 更好地适应了实时系统的开发需要 。同时其内核在 ARM9 处理器内核的基础上使用了 Jazelle增强

学出版社

职教技术出版中心

www.abook.cn

Page 46: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

36     嵌入式系统设计与开发 (第二版) 

技术 ,该技术支持一种新的 Java操作状态 ,允许在硬件中执行 Java字节码 。ARM9E 系列微处理器的主要特点如下 :瞯 支持 DSP指令集 ,适合于需要高速数字信号处理的场合 。瞯 五级整数流水线 ,指令执行效率更高 。瞯 支持 32位 ARM 指令集和 16位 Thumb指令集 。瞯 支持 32位的高速 AMBA 总线接口 。瞯 支持 VFP9浮点处理协处理器 。瞯 全性能的 MMU ,支持 Windows CE 、 Linux 、 Palm OS 等多种主流嵌入式操作系统 。

瞯 MPU 支持实时操作系统 。瞯 支持数据 cache和指令 cache ,具有更高的指令和数据处理能力 。瞯 主频最高可达 300MIPS 。ARM9E系列广泛应用于硬盘驱动器和 DVD播放器等海量存储设备 、语音编码器 、

免提链接 、反锁刹车等自动控制解决方案以及调制解调器和语音识别及合成等设备中 。

3畅 ARM10系列

ARM10TDMI 是 ARM 微 处 理 器 内 核 中 的 高 端 型 号 , ARM10E 是 基 于ARM10TDMI设计的处理器内核 , 包含 ARM1020E 、 ARM1022E 和 ARM1026EJ唱S 三种类型 。 ARM10TDMI采用提高时钟频率 、六级流水线 、 转移预测逻辑 、 64 位存储器和无阻塞的存/取逻辑等措施 ,极大地提高了 ARM10TDMI的性能 。

ARM10E 系列微处理器具有高性能 、 低功耗的特点 , 由于采用了新的体系结构 ,与同等的 ARM9系列相比较 ,在同样的时钟频率下 ,性能提高了近 50 % 。 ARM10E 系列微处理器的主要特点如下 。

瞯 支持 DSP指令集 ,适合于需要高速数字信号处理的场合 。瞯 六级整数流水线 ,指令执行效率更高 。瞯 支持 32位 ARM 指令集和 16位 Thumb指令集 。瞯 支持 32位的高速 AMBA 总线接口 。瞯 支持 VFP10浮点处理协处理器 。瞯 全性能的 MMU ,支持 Windows CE 、 Linux 、 Palm OS 等多种主流嵌入式操作系统 。

瞯 支持数据 cache和指令 cache ,具有更高的指令和数据处理能力 。瞯 主频最高可达 400MIPS 。瞯 内嵌并行读/写操作部件 。ARM10E 系列微处理器主要应用于下一代无线设备 、 数字消费品 、 成像设备 、 工

业控制 、通信和信息系统等领域 。

4畅 ARM11系列

ARM11系列微处理器的内核采用哈弗体系结构 , 使用 ARMv6 指令架构 , 内部具

Page 47: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            37     

有八级流水线 ,数据吞吐量比以往的内核高出大约 40 % ,总体工作频率可以达到 500 ~700MHz 。该系列主要有 ARM1136J 、 ARM1156T2 和 ARM1176JZ 三个内核型号 , 分别针对不同的应用领域 。

5畅 Cortex 系列Cortex 系列处理器是基于 ARMv7 架构的 , 内核采用哈弗体系结构 , 分为 Cortex唱

M 、 Cortex唱R和 Cortex唱A 三类 。其中 , ARM Cortex唱A 系列是针对日益增长的 , 运行包括 Linux 、 Window s CE和 Symbian操作系统在内的数字消费品和无线产品设计的 ;ARM Cortex唱R系列针对的是需要运行实时操作系统来进行控制应用的系统 , 包括汽车电子 、网络和影像系统 ; ARM Cortex唱M 系列则是为那些对开发成本非常敏感同时对性能要求小断增加的嵌入式应用 (如微控制器 、汽车车身控制系统和各种大型家电) 所设计的 。

6畅 SecurCore系列SecurCore系列微处理器包含 SecurCore SC100 、 SecurCore SC110 、 SecurCore

SC200和 SecurCore SC210 。 SecurCore系列微处理器专为安全需要而设计 , 提供了完善的 32位 RISC技术的安全解决方案 , 因此 , SecurCore 系列微处理器除了具有 ARM体系结构的低功耗 、高性能的特点外 ,还具有其独特的优势 ,即提供了对安全解决方案的支持 。

SecurCore系列微处理器除了具有 ARM 体系结构的各种主要特点外 , 还在系统安全方面具有如下特点 :

瞯 带有灵活的保护单元 ,以确保操作系统和应用数据的安全 。瞯 采用软内核技术 ,防止外部对其进行扫描探测 。瞯 可集成用户自己的安全特性和其他协处理器 。SecurCore 系列微处理器主要应用于一些对安全性要求较高的应用产品及应用系

统 ,如电子商务 、电子政务 、电子银行业务 、网络和认证系统等领域 。

7畅 Strong ARM 系列Strong ARM 处理器将 Intel处理器技术和 ARM 系统结构融合为一体 , 致力于为

便携式通信和消费电子类设备提供理想的解决方案 。 StrongARM 系列包括 SA唱110 、SA唱1100 、 SA唱1110和 SA唱1111四种处理器 。 StrongARM 处理器采用 ARMv4T 的五级流水结构 。

8畅 Xscale系列Xscale处理器是基于 ARMv5TE 体系结构的解决方案 , 是一款全性能 、 高性价比 、

低功耗的处理器 。它支持 16位的 Thumb 指令和 DSP 指令集 , 已使用在智能手机 、 个人数字助理和网络产品等领域 。

Xscale微处理器架构经过专门设计 , 核心采用了 Intel 公司先进的 0畅18μm 工艺技

学出版社

职教技术出版中心

www.abook.cn

Page 48: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

38     嵌入式系统设计与开发 (第二版) 

术 。 Intel Xscale微处理器的处理速度是 Intel StrongARM 的 2 倍 , 其内部结构也有了相应的变化 :

瞯 数据 cache的容量达到 32KB 。瞯 指令 cache的容量达到 32KB 。瞯 微小数据 cache的容量达到 2KB 。瞯 为了提高指令的执行速度 ,超级流水线结构由五级增至七级 。瞯 新增乘法/加法器 MAC 和特定的 DSP 型协处理器 CPO , 以提高对多媒体技术的支持 。

瞯 动态电源管理 ,使 Xscale处理器的时钟频率可达 1GHz 、功耗达 1畅6W ,主频可达 1200 MIPS 。

瞯 超低功耗与良好性能的组合使 Intel Xscale广泛用于 Internet 的接入设备 。

2畅4   ARM 微处理器的编程模型ARM 体系结构比较复杂 ,但需要程序员掌握的部分并不复杂 , 本节介绍 ARM 微

处理器的编程模型 ,包括 : ARM 微处理器支持的数据类型 , ARM 微处理器的工作状态 、工作模式 、寄存器组织 、处理器异常等 。通过对编程模型的学习 , 掌握 ARM 微处理器的基本工作原理和一些与程序设计相关的基本技术细节 , 为以后的程序设计打下基础 。

2畅4畅1   ARM处理器支持的数据类型

ARM 微处理器支持字节 (8 位) 、 半字 (16 位) 、字 (32 位) 3 种数据类型 , 可以表示有符号数和无符号数 。其中 ,字需要 4字节对齐 (地址的低两位为 0) ,半字需要 2字节对齐 (地址的最低位为 0) 。 ARM 指令恰好是一个字 (与 4 字节边界对准) ,Thumb指令恰好是半个字 (与 2 字节边界对准) 。数据在存储器上的储存方式有两种 ,即小端模式 (lit tle endian) 和大端模式 (big endian) 。

ARM 体系结构将存储器看作是字节线性存储器 , I/O 采用存储器映射式 。 地址序号从 0向上排列 , 字节 0 ~ 3 为第一个存储字 , 4 ~ 7 为第二个 , 以此类推 。 ARM 存储器模型见图 2畅 1 。作为 32位的微处理器 , ARM 体系结构所支持的最大寻址空间为 4GB(232字节) ,地址范围为 0 ~ 232 - 1 。

ARM 的地址空间也可以看作是 230个 32 位的字单元 。 这些字单元的地址可以被 4整除 ,也就是说该地址的最低两位为 00 (记为 0b00) 。 在 ARM 版本 4 及以上的版本中 , ARM 的地址空间也可以看作是 231个 16位的半字单元 , 这些半字单元的地址可以被 2整除 ,即地址的最低位为 0b0 。

所谓小端模式是指字数据的低字节存储在低地址中 ,而字数据的高字节存储在高地址中 。所谓大端模式是指字数据的高字节存储在低地址中 ,而字数据的低字节则存放在高地址中 。 ARM 默认的储存模式是传统的小端模式 。 图 2畅2 是十六进制数 783c1a24(0x783c1a24) 的小端模式和大端模式存储情况 。

Page 49: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            39     

图 2畅1   ARM存储器模型 图 2畅2   ARM的数据储存方式 (0x783c1a24)

2畅4畅2   ARM处理器的工作状态

ARM 处理器有两种工作状态 。瞯 ARM 状态 :此时处理器执行 32位的字对齐的 ARM 指令 。瞯 Thumb状态 :此时处理器执行 16位的 、半字对齐的 Thumb指令 。当 ARM 微处理器执行 32位的 ARM 指令集时 ,工作在 ARM 状态 ;当 ARM 微处

理器执行 16位的 Thumb指令集时 ,工作在 Thumb状态 。 在程序的执行过程中 , 微处理器可以随时在两种工作状态之间切换 ,并且处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容 。

ARM 指令集和 Thumb指令集均有切换处理器状态的指令 , 并可在两种工作状态之间切换 ,但 ARM 微处理器在开始执行代码时应该处于 ARM 状态 。 状态切换的方法如下 。

瞯 进入 Thumb状态 : 当操作数寄存器的状态位 (位 0) 为 1 时 , 可以采用执行BX指令的方法 ,使微处理器从 ARM 状态切换到 Thumb 状态 。 此外 , 当处理器从 Thumb状态进入异常 (如 IRQ 、 FIQ 、 Undef 、 Abort 、 SWI 等) , 在异常处理返回时自动切换到 ARM 状态 。

瞯 进入 ARM 状态 :当操作数寄存器的状态位 (位 0) 为 0 时 , 执行 BX 指令时可以使微处理器从 Thumb状态切换到 ARM 状态 。此外 ,在处理器进行异常处理时 ,把 PC指针放入异常模式链接寄存器中 , 并从异常向量地址开始执行程序 ,也可以使处理器切换到 ARM 状态 。例如 :

从 ARM 状态切换到 Thumb状态 :        LDR  R0,= Label + 1

BX R0

从 Thumb状态切换到 ARM 状态 :        LDR  R0,= Label

BX R0

学出版社

职教技术出版中心

www.abook.cn

Page 50: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

40     嵌入式系统设计与开发 (第二版) 

2畅4畅3   ARM处理器的工作模式

ARM 处理器有以下 7种工作模式 。1) 用户模式 USR (user mode) : ARM 的正常运行模式 , 通常用来执行一般的应

用程序 。2) 快速中断模式 FIQ (fast interrupt mode) : 由外部触发 FIQ 管脚 , 支持高速数

据传输或通道处理 。3) 中断模式 IRQ (interrupt mode) :由外部触发 IRQ 管脚 , 用于一般外部中断的

处理 。4) 管理模式 SVC (supervisor mode) :操作系统的保护模式 。5) 中止模式 ABT (abort mode) :数据或者指令预取出现错误或异常时进入此模

式 ,可用于支持虚拟内存和/或内存保护 。6) 系统模式 SYS (system mode) :运行具有特权的操作系统任务 。7) 未定义模式 UND (undefined mode) : 当未定义指令被执行时进入此模式 , 可

用于支持硬件协处理器的软件仿真 。除用户模式外的其他模式被称为特权模式 ,其中除去用户模式和系统模式以外的 5

种模式又称为异常模式 。可以通过软件改变 ARM 处理器的工作模式 ,外部中断或异常处理也可以引起模式发生改变 。

大多数应用程序在用户模式下执行 。当处理器工作在用户模式时 ,正在执行的程序不能访问某些被保护的系统资源 ,也不能改变模式 ,除非发生异常 。当特定的异常出现时 ,进入相应模式 。每种模式都有某些附加的寄存器 ,以避免不可靠状态的出现 。系统模式与用户模式有完全相同的寄存器 ,但它是特权模式 ,不受用户模式的限制 ,它供需要访问系统资源的操作系统使用 。

2畅4畅4   ARM状态下的寄存器组织

ARM 状态下的寄存器组织见图 2畅3 。 ARM 有 37 个 32 位长的寄存器 , 包括 31 个通用寄存器 、 1个当前程序状态寄存器 (current program status register , CPSR) 、 5个备份的程序状态寄存器 (saved program status register , SPSR) 。这 37个寄存器并不都是同时可见的 。在任意时刻 ,只有 16个通用寄存器 (R0 ~ R15) 和一个或者两个状态寄存器 (CPSR和 SPSR) 对处理器来讲是可见的 。

1畅 通用寄存器

31个通用寄存器用 R0 ~ R15表示 ,可以分为以下三类 。瞯 未分组寄存器 R0 ~ R7 。瞯 分组寄存器 R8 ~ R14 。瞯 程序计数器 (program counter , PC) R15 。(1) 未分组寄存器 R0 ~ R7在所有的运行模式下 ,未分组寄存器都指向同一个物理寄存器 ,它们未被系统用作

Page 51: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            41     

特殊的用途 ,因此 ,在中断或异常处理进行模式转换时 ,由于不同的处理器运行模式均使用相同的物理寄存器 ,可能会造成寄存器中数据的损坏 ,这一点在进行程序设计时应引起注意 。

图 2畅3   ARM状态下的寄存器组织(2) 分组寄存器 R8 ~ R14对于分组寄存器 ,它们每一次所访问的物理寄存器与处理器当前的运行模式有关 。对于 R8 ~ R12 来说 , 每个寄存器对应两个不同的物理寄存器 , 当使用 FIQ 模式

时 ,访问寄存器 R8 _ fiq ~ R12 _ fiq ;当使用除 FIQ 模式以外的其他模式时 , 均访问寄存器 R8 _ usr ~ R12 _ usr 。

对于 R13 、 R14这两个寄存器来说 ,每个寄存器各有 6个不同的物理寄存器 , 其中的一个是用户模式与系统模式共用的 ,另外 5个物理寄存器分别用于 5种异常模式 。

采用以下记号来区分不同的物理寄存器 :        R13 _ < mode>

R14 _ < mode>

其中 , mode为以下几种模式之一 : USR 、 FIQ 、 IRQ 、 SVC 、 ABT 和 UND 。寄存器 R13通常用作堆栈指针 (stack pointer , SP) , 但这只是一种习惯用法 , 用

户也可使用其他寄存器作为堆栈指针 。而在 Thumb 指令集中 ,某些指令强制要求使用R13作为堆栈指针 。

在实际使用中 ,一般会在存储器中分配一些空间作为堆栈 ,由于处理器的每种运行模式均有自己独立的物理寄存器 R13 ,在用户应用程序的初始化部分 ,一般都要初始化每种模式下的 R13 ,使其指向该运行模式的栈空间 。这样 ,当程序的运行进入异常模式时 ,可以将需要保护的寄存器放入 R13 所指向的堆栈 , 而当程序从异常模式返回时 ,则从对应的堆栈中恢复寄存器的内容 ,采用这种方式可以保证异常发生后程序的正常

学出版社

职教技术出版中心

www.abook.cn

Page 52: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

42     嵌入式系统设计与开发 (第二版) 

执行 。R14也称作子程序连接寄存器 (subroutine link register) 或连接寄存器 LR , 当执

行分支指令 BL 时 , R14中得到 R15 (程序计数器) 的备份 。 其他情况下 , R14 用作通用寄存器 。类似地 ,当发生中断或异常时 ,或当程序执行 BL 指令时 , 对应的分组寄存器 R14 _ svc 、 R14 _ irq 、 R14 _ fiq 、 R14 _ abt 和 R14 _ und用来保存 R15的返回值 。

寄存器 R14常用在如下情况 : 在每一种运行模式下 , 都可用 R14 保存子程序的返回地址 ,当用 BL 或 BLX指令调用子程序时 ,将子程序的返回地址 (在程序计数器中)复制给 R14 ,执行完子程序后 , 又将 R14 的值复制回程序计数器 , 即可完成子程序的调用返回 。典型的做法如下 。

瞯 执行以下任意一条指令 :        MOV  PC,LR   ;R14复制到 PC,实现子程序的返回

BX   LR ;跳到 LR指的地址处执行程序 ,实现子程序的返回

瞯 在子程序入口处使用以下指令将 R14存入堆栈 :        STMFD   SP!,{ < Regs> ,LR}

对应的 ,使用以下指令可以完成子程序返回 :        LDMFD   SP!,{ < Regs> ,PC}

图 2畅4是这种方法的一个实现 。

图 2畅4  压栈/出栈操作

(3) 程序计数器寄存器 R15用作程序计数器 (PC) 。 在 ARM 状态下 , 所有指令都是 32 位宽 , 所

有的指令必须字对齐 ,所以 PC的值由位 [31 ∶ 2] 决定 , 位 [1 ∶ 0] 是 0 (在 Thumb状态下 ,必须半字对齐 ,位 [0] 为 0 , PC 的值由位 [31 ∶ 1] 决定) 。 R15 虽然也可用作通用寄存器 ,但一般不这样使用 ,因为 R15的值通常是下一条要取出的指令的地址 ,因此使用时有一些特殊的限制 ,当超出了这些限制时 ,程序的执行结果是未知的 。

由于 ARM7采用了三级流水线技术 ,指令读出的 PC 值是指令地址值加 8个字节 。

2畅 程序状态寄存器

ARM 的程序状态寄存器 (program status register , PSR) 有 1 个当前程序状态寄存器 (CPSR) 和 5个备份的程序状态寄存器 (SPSR) 。 CPSR 用来标识 (或设置) 当

Page 53: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            43     

前运算的结果 、中断使能设置 、处理器状态 、当前运行模式等 。而 SPSR则在异常发生时用来保存 CPSR当前值 ,以便从异常退出时用 SPSR 来恢复 CPSR 。处理器在所有工作模式下都可访问 CPSR ,不同模式的 CPSR是同一个物理寄存器 。 而每一种异常模式下都有一个 SPSR ,它们对应不同的物理寄存器 。由于用户模式和系统模式不属于异常模式 ,它们没有 SPSR ,在这两种模式下访问 SPSR , 结果是未知的 。 CPSR 、 SPSR 都是 32位寄存器 ,它们的格式是相同的 ,如图 2畅 5所示 。

图 2畅5  程序状态寄存器

(1) 条件码标志位 N 、 Z 、 C 、 VN 、 Z 、 C 、 V (negative 、 zero 、 carry 、 overflow ) 位称为条件码标志 (condition

code flags) ,经常以标志引用 ,它们的内容可被算术或逻辑运算的结果改变 。 ARM 指令可以根据这些条件标志 ,选择性地执行后续指令 (条件执行) 。 各条件码标志位的具体含义如表 2畅2所示 。

表 2畅2  条件码标志的具体含义标志位 含   义

N(负)标志  当用两个补码表示的带符号数进行运算时 ,N = 1 表示运算的结果为负数 ;N = 0 表示运算

的结果为正数或零 ;N 位与运算结果的最高位相同Z(零)标志   Z = 1 表示运算的结果为零 ;Z = 0表示运算的结果为非零

C(进位)标志

  可以有4种方法设置 C 的值 :① 加法运算(包括比较指令 CM N) ,当运算结果产生了进位时

(无符号数溢出) ,C = 1 ,否则 C = 0 ;② 减法运算 (包括比较指令 CMP) ,当运算时发生了借位

(无符号数下溢出) ,C = 0 ,否则 C = 1 ;③ 对于包含移位操作的非加/减运算指令 ,C 为移位操作中最后移出位的值 ;④ 对于其他的非加/减运算指令 ,C 的值通常不改变

V(溢出)标志

  可以有2种方法设置 V 的值 :① 对于加/减法运算指令 ,当操作数和运算结果为二进制的补

码表示的带符号数时 ,V = 1表示符号位溢出 ;② 对于其他的非加/减运算指令 ,V 的值通常不改变 。具体可参考各指令的说明

(2) Q 标志位在 ARMv5及以上版本的 E 系列处理器中 , CPSR 中的 Q 标志位指示增强的 DSP

运算指令是否发生了溢出 。 SPSR中的标志位 Q 用于当异常出现时保留和恢复 CPSR 中

学出版社

职教技术出版中心

www.abook.cn

Page 54: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

44     嵌入式系统设计与开发 (第二版) 

的 Q 标志 。在其他版本的处理器中 , Q 标志位未定义 。(3) 控制位PSR的低 8位 I 、 F 、 T 和 M [4 ∶ 0] 统称为控制位 , 当发生异常时这些位发生变

化 ,如果处理器运行于特权模式下 ,这些位也可以由软件修改 。I和 F 位是中断禁止位 , I置 1则禁止 IRQ 中断 , F置 1则禁止 FIQ 中断 。T 位反映了处理器的运行状态 ,对于不同版本的 ARM 处理器 , T 位含义不同 。对于 ARM 体系结构 v3以及更低的版本和 v4的非 T 系列版本处理器 , T 位应当为

0 。在这些版本中 ,没有 ARM 和 Thumb状态之间的切换 。对于 ARM 体系结构 v4及以上版本的 T 系列处理器 , T 的含义为 : T = 0表示执行

ARM 指令 , T = 1表示执行 Thumb指令 。在这些结构体系中 ,可以自由地使用能在 ARM 和 Thumb状态之间切换的指令 。对于 ARM 体系结构 v5及以上版本的非 T 系列处理器 , T 的含义为 : T = 0表示执

行 ARM 指令 , T = 1表示强制下一条执行的指令产生未定义指令异常 。M [4 ∶ 0] (M0 、 M1 、 M2 、 M3 、 M4) 是模式位 ,这些位决定处理器的工作模式 ,

具体含义如表 2畅3所示 。

表 2畅3  运行模式位M [4 ∶ 0] 的具体含义

M[4 ∶ 0] 处理器模式 可访问的寄存器

0b10000 用户模式 PC , CPSR , R14 ~ R00b10001 FIQ 模式 PC , CPSR , SPSR _ fiq , R14 _ fiq , R8 _ fiq , R7 ~ R00b10010 IRQ 模式 PC , CPSR , SPSR _ irq , R14 _ irq , R13 _ irq , R12 ~ R00b10011 管理模式 PC , CPSR , SPSR _ svc , R14 _ svc , R13 _ svc , R12 ~ R00b10111 中止模式 PC , CPSR , SPSR _ ab t , R14 _ ab t , R13 _ ab t , R12 ~ R00b11011 未定义模式 PC , CPSR , SPSR _ und , R14 _ und , R13 _ und , R12 ~ R00b11111 系统模式 PC , CPSR(ARM v4及以上版本) , R14 ~ R0

M [4 ∶ 0] 其他的组合结果会导致处理器进入一个不可恢复的状态 。(4) 其他位PSR中的其余位为保留位 ,保留位将用于 ARM 版本的扩展 。应用软件不要操作这

些位 ,以免与 ARM 将来版本的扩展冲突 。

2畅5   ARM 的异常中断异常是由内部或外部源产生并引起处理器处理的一个事件 。例如 ,一个外部的中断

请求或试图执行未定义指令都会引起异常 ,此时 ARM 会进入异常模式 。 在正常的程序执行时 ,每执行一条 ARM 指令 , PC 的值加 4 (执行 Thumb 指令时 PC 的值加 2) , 程序顺序执行 ;当程序遇到跳转指令时 ,程序跳到特定的地址标号处执行 ;当程序遇到调用子程序指令时 ,程序转去执行子程序 ,执行完后 ,再返回到调用子程序指令的下一条

Page 55: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            45     

指令执行 ;当异常中断发生时 ,程序执行完当前指令后 ,根据引起异常的模式 ,转去相应的异常中断处理程序处执行 。在处理异常之前 ,处理器的状态必须保留 ,以便在异常处理完后能够重新执行原来的程序 。

2畅5畅1   ARM体系结构所支持的异常类型

ARM 体系结构所支持的异常类型见表 2畅 4 , 其中各中断向量地址组成异常中断向量表 ,中断向量表指定了各异常中断及其处理程序的对应关系 ,它通常存放在存储地址的低端 。在 ARM 体系中 ,异常向量表的大小为 32 字节 。 其中每个异常中断占据 4 个字节大小 ,保留了 4个字节空间 。每个异常中断对应的中断向量表中的 4个字节的空间中存放了一个跳转指令或者一个向 PC寄存器中赋值的指令 。 通过这两种指令 , 程序将跳转到相应的异常中断处理程序处执行 。

当几个异常中断同时发生时 ,就必须按照一定的次序来处理这些异常中断 ,这就是异常中断的优先级 。在 ARM 中通过给各异常中断赋予一定的优先级序号来实现这种处理次序 ,如表 2畅4中优先级为 1的异常中断优先级最高 ,当有优先级为 1的异常中断和其他异常中断同时发生时 ,先响应优先级为 1的异常中断 。

表 2畅4   ARM体系中的异常中断异常中断类型 异常中断模式 向量地址 优先级 (1 最高)

复位 管理模式 0 x00000000 1

未定义指令 未定义模式 0 x00000004 6

软件中断 (SWI) 管理模式 0 x00000008 6

指令预取中止 中止模式 0 x0000000C 5

数据访问中止 中止模式 0 x00000010 2

保留 0 x00000014外部中断请求 IRQ IRQ 模式 0 x00000018 4

快速中断请求 FIQ FIQ 模式 0 x0000001C 3

2畅5畅2  异常的响应及返回

1畅 异常的响应

ARM 微处理器对异常中断的响应过程如下 。1) 当异常中断发生时 ,程序将当前执行指令的下一条指令的地址存入新的异常模

式的链接寄存器 LR 中 (R14 _ < mode > ) , 以便程序在异常处理完后能正确返回原程序 。

2) 保存当前的 CPSR值 ,即将 CPSR复制到新的异常模式的 SPSR中 。3) 根据异常类型 ,重新设置 CPSR的运行模式位 CPSR [4 ∶ 0] , 使微处理器进入

相应的工作模式 。4) 强制给 PC赋值 ,即将表 2畅4中相应的向量地址赋给 PC , 从而跳转到相应的异

学出版社

职教技术出版中心

www.abook.cn

Page 56: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

46     嵌入式系统设计与开发 (第二版) 

常处理程序处执行程序 。5) 设置 CPSR中的中断禁止位 ,以禁止中断发生 。上述过程用伪码可以描述为 :

        R14 _ < Exception_ Mode > = Return LinkSPSR_ < Exception _ Mode> = CPSRCPSR[4:0] = Exception Mode NumberCPSR[5] = 0If < Exception_ Mode > = = Reset or FIQ then        CPSR[6] = 1       ;当响应 FIQ或复位异常时 ,禁止新的 FIQ中断        CPSR[7] = 1 ;禁止 IRQ中断    PC = Exception Vector Address

图 2畅6是一个从用户模式到 FIQ 模式的例子 。如果异常发生时处理器处于 Thumb状态 ,则当异常向量地址加载入 PC 时 ,处理器自动切换到 ARM 状态 。

图 2畅6  用户模式到 FIQ模式

2畅 异常的返回

异常处理完毕之后 , ARM 微处理器会执行以下几步操作从异常返回 。1) 由链接寄存器 LR的值恢复 PC ,返回到发生异常中断的指令的下一条指令处执

行程序 。2) 将 SPSR复制回 CPSR中 。3) 若在进入异常处理时设置了中断禁止位 ,要在此清除 。

Page 57: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            47     

复位系统后 ,开始整个异常应用程序的执行 ,因此复位异常处理程序不需要返回 。

2畅5畅3  各类异常及返回

1畅 复位

当处理器收到一个复位信号 (处理器的一个引脚) ,就会马上中断当前执行的程序 ,把处理器设为 ARM 状态与管理模式 , 从地址 0x0 (如果是高位向量地址则为0xFFFF0000) 处开始执行指令 ,操作如下 。        R14 _ svc = UNPREDICTABLE value

SPSR_ svc = UNPREDICTABLE valueCPSR[4:0] = 0b10011 /倡进入管理模式倡/CPSR[5] = 0 /倡在 ARM状态下执行倡/CPSR[6] = 1 /倡禁止快速中断倡/CPSR[7] = 1 /倡禁止 IRQ中断倡/If high vectors configured thenPC = 0xFFFF0000ElsePC = 0x00000000

复位通常在系统加电 、系统复位时发生 。

2畅 未定义指令异常

当 ARM 处理器执行协处理器指令时 ,它必须等待任一外部协处理器应答后才能真正执行这条指令 ,此时若没有协处理器回应 ,则产生未定义指令异常 。如果尝试执行未定义的指令 ,也会产生未定义指令异常 。 处理器被切换到 ARM 与未定义模式 , 操作如下 。        R14 _ und = address of next instruction after the undefined instruction

SPSR_ und = CPSRCPSR[4:0] = 0b11011 /倡进入未定义模式倡/CPSR[5] = 0 /倡在 ARM状态执行倡//倡CPSR[6]不变倡/CPSR[7] = 1 /倡禁止 IRQ中断倡/If high vectors configured thenPC = 0xFFFF0004ElsePC = 0x00000004

在未定义指令异常后 ,使用下列指令返回 。        MOVS PC,R14

3畅 软件中断异常

使用软件中断指令 (sof tware interrupt instruction , SWI) , 会使处理器切换到管

学出版社

职教技术出版中心

www.abook.cn

Page 58: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

48     嵌入式系统设计与开发 (第二版) 

理模式 ,以请求特定的管理 (操作系统) 函数 ,操作如下 。        R14 _ svc = address of next instruction after the SWI instruction

SPSR_ svc = CPSRCPSR[4:0] = 0b10011 /倡进入管理模式倡/CPSR[5] = 0 /倡在 ARM状态执行倡//倡CPSR[6]不变倡/CPSR[7] = 1 /倡禁止 IRQ中断倡/If high vectors configured thenPC = 0xFFFF0008ElsePC = 0x00000008

完成 SWI操作后 ,使用下列指令返回 。        MOVS PC,R14未定义指令异常和软件中断异常是由当前执行的指令自身产生的 , 当异常产生时 ,

PC指向当前指令后面的第二条指令 (对于 ARM 指令 , 它指向当前指令地址加 8 个字节的位置 ;对于 Thumb 指令 , 它指向当前指令地址加 4 个字节的位置) 。异常模式下的寄存器 R14将保存当前指令的下一条指令地址 (对于 ARM 指令来说是 PC唱4) , 返回操作可以通过将 R14复制到 PC来实现 。

4畅 指令预取中止异常

当指令预取访问存储器失败时 , 存储器系统向 ARM 处理器发出存储器中止(abort) 信号 ,预取的指令被记为无效 ,但只有当处理器试图执行无效指令时 , 指令预取中止异常才会发生 。如果指令未被执行 ,例如在指令流水线中发生了跳转 ,则预取指令中止不会发生 。在 ARMv5及以上版本中 ,执行 BKPT 指令也会产生预取中止异常 。当试图执行一条中止指令时 ,将执行下列操作 。        R14 _ abt = address of the aborted instruction + 4

SPSR_ abt = CPSRCPSR[4:0] = 0b10111 /倡进入中止模式倡/CPSR[5] = 0 /倡在 ARM状态执行倡//倡 CPSR [6]不变倡/CPSR[7] = 1 /倡禁止 IRQ中断倡/If high vectors configured thenPC = 0xFFFF000CElsePC = 0x0000000C

如需从中止模式返回 ,使用下列指令 。        SUBS PC,R14,# 4当发生指令预取中止异常时 , 程序要返回到这条有问题的指令处 , 重新读取并执

行该指令 , 而不是返回到发生异常的指令的下一条指令处 。 指令预取中止异常是由当前执行的指令自身产生的 , 当异常产生时 , PC 指向当前指令后面的第二条指令

Page 59: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            49     

(对于 ARM 指令 , 它指向当前指令地址加 8 个字节的位置 ; 对于 Thumb指令 , 它指向当前指令地址加 4 个字节的位置) 。 异常模式下的寄存器 R14 将保存当前指令的下一条指令地址 (对于 ARM 指令来说是 PC唱4) , 返回操作可以通过将 R14唱4 复制到 PC来实现 。

5畅 数据访问中止异常

如果数据访问指令的目标地址不存在 ,或者该地址不允许当前指令访问 ,处理器产生数据访问中止异常 (data abort) 。此时 ,执行下列操作 。        R14 _ abt = address of the aborted instruction + 8

SPSR_ abt = CPSRCPSR[4:0] = 0b10111 /倡进入中止模式倡/CPSR[5] = 0 /倡在 ARM状态执行倡//倡 CPSR [6]不变倡/CPSR[7] = 1 /倡禁止 IRQ中断倡/If high vectors configured thenPC = 0xFFFF0010ElsePC = 0x00000010

确定中止原因后 ,用下列指令从中止模式返回 。        SUBS PC,R14,# 8恢复 PC (从 R14 _ abt) 和 CPSR (从 SPSR _ abt) , 并返回重新执行中止的指令 。

若中止的指令不需要重新执行 ,则用下面的指令返回 。        SUBS PC,R14,# 4

6畅 外部中断请求异常

通过处理器上的 IRQ 输入引脚 , 由外部产生 IRQ 异常 , 若此时 CPSR 的 I 位为 0(CPSR [7] = 0) ,处理器会产生外部中断请求 (IRQ) 异常 。此时 ,执行下列操作 。        R14 _ irq = address of the next instruction to be executed + 4

SPSR_ irq = CPSRCPSR[4:0] = 0b10010 /倡进入 IRQ模式倡/CPSR[5] = 0 /倡在 ARM状态执行倡//倡 CPSR [6]不变倡/CPSR[7] = 1 /倡禁止 IRQ中断倡/If high vectors configured thenPC = 0xFFFF0018ElsePC = 0x00000018

使用下列指令从中断服务返回 。        SUBS PC,R14,# 4注意 ,只有在特权模式下才能改变 I位的状态 。

学出版社

职教技术出版中心

www.abook.cn

Page 60: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

50     嵌入式系统设计与开发 (第二版) 

7畅 快速中断请求异常

通过处理器上的 FIQ 输入引脚 , 由外部产生 FIQ 异常 , 若此时 CPSR 的 F 位为 0(CPSR [6] = 0) ,处理器会产生快速中断请求 (FIQ) 异常 。此时 ,执行下列操作 。        R14 _ fiq = address of the next instruction to be executed + 4

SPSR_ fiq = CPSR

CPSR[4:0] = 0b10001 /倡进入 FIQ模式倡/

CPSR[5] = 0 /倡在 ARM状态执行倡/

CPSR[6] = 1 /倡禁止 FIQ中断倡/

CPSR[7] = 1 /倡禁止 IRQ中断倡/

If high vectors configured then

PC = 0xFFFF001C

Else

PC = 0x0000001C

使用下列指令从中断服务返回 。        SUBS PC,R14,# 4

FIQ 向量放在向量表最后 , 允许 FIQ 异常处理程序直接放在地址 0x0000001C 或0xFFFF001C开始的位置 ,而不需要由跳转指令转到异常处理程序 ,这可以提高响应的速度 。注意 ,只有在特权模式下才能改变 F位的状态 。

通常处理器执行完当前指令后 ,查询 FIQ 和 IRQ 输入引脚 , 如果中断引脚有效且系统允许该中断 ,处理器将产生 FIQ 或 IRQ 异常 。当异常产生时 , PC 的指向已经更新 ,它指向当前指令后面第三条指令 (对于 ARM 指令 , 它指向当前指令地址加 12 个字节的位置 ;对于 Thumb 指令 , 它指向当前指令地址加 6 个字节的位置) 。 异常模式下的寄存器 R14将保存当前指令后的第二条指令地址 , 返回操作可以通过将 R14唱4 复制到 PC来实现 。

2畅6   ARM7TDMI处理器内核简介针对 ARM 各个系列的处理器 ,首先说明处理器内核 、处理器核 、芯片这三个概念

之间的区别与联系 。 ARM 公司本身不生产芯片 , 它为 ARM 架构处理器芯片提供ARM 处理器内核 (如 ARM7TDMI 、 ARM9TDMI 及 ARM10TDMI 等) 和 ARM 处理器核 (在最基本的 ARM 处理器内核基础上 , 可增加 CACHE 、 MMU 、 协处理器CP15 、 AMBA 接口以及 EM T 宏单元等 , 这样就构成了 ARM 处理器核 , 如ARM710T/720T/740T 、 ARM920T/922T/940T 、 ARM926E/966E 及 ARM1020E等) 。常见的 ARM 处理器 ,实际是半导体公司基于 ARM 的处理器核或处理器内核再开发的针对某一应用领域的芯片 。 例如 , Samsung 公司的 ARM7 芯片 S3C44B0X 是以ARM7TDMI处理器内核为核心设计的 , 而 ARM9 芯片 S3C2410X 是以 ARM920T 处理器核为核心设计的 。

Page 61: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            51     

2畅6畅1   ARM7TDMI介绍

ARM7TDMI核 ,是从最早实现了 32 位地址空间编程模式的 ARM6 核发展而来的 ,可在低于 5V 的电源电压下稳定可靠地工作 。增加了 64 位乘法指令支持片上调试 、Thumb指令集和 EmbeddedICE 片上断点和观察点 。 ARM7TDMI 是 ARM 公司最早为业界普遍认可且得到了广泛应用的核 , 特别是在手机和 PDA 应用中 。 随着 ARM 技术的发展 ,它已是目前最低端的 ARM 核 。

ARM7TDMI处理器区别于其他 ARM7 处理器的一个重要特征是其独有的被称为Thumb 的架构策略 。该策略为基本 ARM 架构的扩展 ,由 36种基于标准 32位 ARM 指令集 、 但重新采用 16 位宽度优化编码的指令格式构成 。 由于 Thumb 指令的宽度只为ARM 指令的一半 ,因此能获得非常高的代码密度 。当 Thumb 指令被执行时 ,其 16 位的操作码被处理器解码为等效的 32 位标准 ARM 指令 , 然后 ARM 处理器核就如同执行 32位的标准 ARM 指令一样执行 16位的 Thumb指令 。也就是说 , Thumb架构为 16位的系统提供了一条获得 32位性能的途径 。

ARM7TDMI内核既能执行 32 位的 ARM 指令集 , 又能执行 16 位的 Thumb 指令集 ,因此允许用户以子程序段为单位 , 在同一个地址空间使用 Thumb 指令集和 ARM指令集混合编程 。采用这种方式 ,用户可以在代码尺寸和系统性能上进行权衡 ,从而为特定的应用系统找到一个最佳的编程解决方案 。

32位的 ARM 指令集由 13种基本的指令类型组成 , 可分为如下四大类 : ① 4 类分支指令用于控制程序的执行流程 、指令的特权等级可在 ARM 代码与 Thumb 代码之间进行切换 ; ② 3类数据处理指令用于操作片上的 ALU 、 桶型移位器和乘法器 , 以完成在 31个 32位的通用寄存器之间的高速数据处理 ; ③ 3 类加载/存储指令用于控制在存储器和寄存器之间的数据传输 。一类为方便寻址进行了优化 ,另一类用于快速的上下文切换 ,第三类用于数据交换 ; ④ 3类协处理器指令用于控制外部的协处理器 , 这些指令以开放统一的方式扩展用于片外功能的指令集 。

几乎所有的 32位 ARM 指令都可以条件执行 。16位的 Thumb指令集为 32位 ARM 指令集的扩展 ,共包含 36 种指令格式 , 可分

为如下 4个功能组 : ① 4类分支指令 ; ② 12类数据处理指令 ,为标准 ARM 数据处理指令的一个子集 ; ③ 8类加载/存储寄存器指令 ; ④ 4类加载/存储乘法指令 。

在同一种处理模式下 ,每一条 16位的 Thumb指令都有对应的 32位 ARM 指令 。如前所述 , ARM7TDMI内核支持两种工作状态和七种操作模式 , 当系统响应中断

或异常或者访问受保护的系统资源时 ,处理器会进入特权模式 (除用户模式以外的所有模式) 。

ARM7TDMI核的部件和主要信号路径如图 2畅7所示 。可以看出 ARM7TDMI 主要由三部分构成 : 调试部分 、 总线分割和 ARM7TDMI

的处理器核 。

学出版社

职教技术出版中心

www.abook.cn

Page 62: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

52     嵌入式系统设计与开发 (第二版) 

图 2畅7   ARM7TDMI处理器核框图

1畅 调试部分

这里主要说明几个信号的功能 。瞯 SCREG (scan chain register) [3 ∶ 0] :确定当前扫描链的 ID编号 ,即当前使用的是哪一条扫描链 。

瞯 IR (TAP controller instruction register) [3 ∶ 0] :表明加载到 TAP控制器指令寄存器的当前指令 。 指令寄存器共有 4 位 , 在 Capture唱IR 时装入指令 ; 在Shift唱IR时作为 TI和 TO 之间的串行通路 ; 在 Update唱IR 时指令寄存器的值成为当前指令 。用于加载到 TAP 指令寄存器中的指令共 10条 ,如表 2畅5所示 。

表 2畅5   TAP指令指令 二进制代码 功能

EX TES T 0000   使被选中的扫描链进入测试模式 , 用于内部部件测试

SCAN _ N 0010   在 TDI 和 TDO 之间连接扫描链路径选择寄存器IN T ES T 1100   使被选中的扫描链进入测试模式 , 用于核测试

IDCODE 1110   在 TDI 和 TDO 之间连接设备标识寄存器BYPASS 1111   在 TDI 和 TDO 之间连接旁路寄存器 , 扫描链进入系统操作模式

CLA M P 0101  在 TDI 和 TDO 之间连接旁路寄存器 , 输出信号的值是当前装入扫

描链的值

HIG HZ 0111   在 TDI 和 TDO 之间连接旁路寄存器 , 使相应的信号进入高阻状态

Page 63: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            53     

续表

指令 二进制代码 功能

CLA M PZ 1001  在 TDI 和 TDO 之间连接旁路寄存器 , 确保测试时非 0 、 1 的信号

无效

SA MPLE/PREL OAD 0011  在 A MR7 TDMI 中 仅 可 用 于 产 品 测 试 , 扫 描 链 上 未 用 。 在

A MR9 TDM I 中选中的扫描链进入正常操作模式RES T AR T 0100   在 TDI 和 TDO 之间连接旁路寄存器 , 从调试状态重新启动处理器

瞯 TAPSM (TAP controller state machine) [3 ∶ 0] : 表明 TAP 控制器状态机的当前状态 。

2畅 总线分割

ARM7TDMI和存储器之间有两种数据总线形式 :单向总线输入 DIN [31 ∶ 0] /单向总线输出 DOU T [31 ∶ 0] 和双向总线 D [31 ∶ 0] 。总线分割在调试情况下通常用来进行状态切换 。

3畅 ARM7TDMI的处理器核ARM7TDMI的处理器核的框图如图 2畅8所示 。我们首先看看它完成的功能和工作

过程 。对于 ARM7的三级流水线工作模式 ,它实际完成取指 、译码和执行的整个过程 。左上部分实际主要完成指令执行 ,指令执行主要由算术逻辑单元 ALU 完成 , 其上部的通道主要完成数据的供给 ,并能根据执行指令的不同进行适当的调整 ,如进行移位等操作 。右上部分主要完成指令译码和整个处理器逻辑的控制 。下边的两部分分别完成指令和数据的读取 、数据存储操作 。从图 2畅8中可以看出指令译码和控制逻辑同数据通道是分离的 ,这样有利于流水线的实现 。

2畅6畅2   ARM7TDMI处理器核的硬件接口

ARM7TDMI的硬件接口外围信号如图 2畅 9所示 。按接口信号的功能划分 , 有存储器接口 、 MMU 接口 、片上调试 、 JTAG 边界扫描扩展以及时钟接口等 14类接口信号 。

1畅 存储器接口

存储器接口包括 32位地址 (A [31 ∶ 0]) 、双向数据总线 (D [31 ∶ 0]) 、分开的数据输出 (DOU T [31 ∶ 0]) 和数据输入 (DIN [31 ∶ 0]) 总线以及 10 个控制信号 , 这10个控制信号及含义分别如下 。

瞯 nMREQ 指示一个需要存储器访问的处理器周期 。瞯 SEQ 指示存储器地址与前周期使用的地址连续 (也可能相同) 。瞯 LOCK 指示处理器应该保持总线的状态不变 ,以确保 SWAP 指令读相和写相的不可分割性 。

瞯 nRW 指示处理器执行的是读周期还是写周期 。

学出版社

职教技术出版中心

www.abook.cn

Page 64: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

54     嵌入式系统设计与开发 (第二版) 

图 2畅8   ARM7TDMI主处理器逻辑图瞯 MAS [1 ∶ 0] 是对存储器访问大小的编码 ,指出访问的是字节 、半字或字 。瞯 BL [3 ∶ 0] 由外部控制的使能信号 ,作用于数据输入总线上 4 字节中每个字节的锁存 ,这使得 8位 、 16位和 32位存储器易于实现与处理器接口 。

瞯 ARM7TDMI存储器访问有 4 种周期类型 : 空闲周期 、 非顺序周期 、 顺序周期和协处理器寄存器传送周期 。

2畅 MMU 接口ARM7TDMI处理器核提供了 MMU 的接口控制信号 , 以进行存储器区域的访问

控制 。

Page 65: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            55     

图 2畅9   ARM7TDMI核的硬件接口外围信号瞯 nTRANS (传送控制) 信号 :指明处理器是工作在用户模式 (nTRANS = 0) 还是特权模式 (nTRANS = 1) ,使得存储器的一些区域被限制为仅用于监控访问 。

瞯 ABORT (中止) :当一个存储器不允许访问时 , 在中止输入端发出信号 , 中止时序连同数据在时钟周期结束时有效 。

3畅 总线控制

通常 ARM7TDMI核得到新地址后就立即发出总线控制请求 , 以便 MMU 或存储器控制器有最长的时间来处理它 。 但在简单的系统中 , 地址总线直接连接到 ROM 或SRAM ,需要把原来的地址保持到周期的末端 。处理器核有一个由 APE 控制的锁存器 ,当外部逻辑需要时 ,它可给地址重新定时 。

信号 nENOU T 用来指示 ARM7TDMI 核执行写周期 。 如果外部数据总线是双向的 ,就用 nENOU T 将 DOU T [31 ∶ 0] 加到总线上 。 有时希望推迟写操作 , 以使其他

学出版社

职教技术出版中心

www.abook.cn

Page 66: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

56     嵌入式系统设计与开发 (第二版) 

部件可驱动总线 ,可使用数据总线的 DBE 来确保 nENOU T 在这个情况下保持无效 。处理器核必须停止 (用 nWAIT 或时钟展宽) , 直到总线可使用为止 。 DBE 按照外部逻辑的要求由外部定时 。

4畅 时钟控制

处理器所有状态变化都由存储器时钟 MCLK 控制 。 尽管这个时钟可由外部操作 ,以便使处理器等待低速的读/写 , 但它常常是一个自由的时钟 , 使用 nWAIT 跳过时钟周期 。内部时钟实际上正好是 MCLK 和 nWAIT 的逻辑 “与” , 因此只有当 MCLK 为低时 , nWAIT 才能变化 。

ECLK 时钟输出反映了处理器核使用的时钟 ,因此它一般反映了 MCLK 在 nWAIT门控后的行为 ,但在调试模式下它也反映了调试时钟的行为 。

5畅 状态输出

TBIT 信号表明当前处理器执行的是 ARM 指令还是 Thumb指令 。

6畅 配置

BIGEND信号用于在小端模式和大端模式之间选择 , 即选择字节按地址的存放位置顺序 。

7畅 中断

nFIQ 和 nIRQ 是两个中断请求输入信号 。 nFIQ 为快速中断请求 , nIRQ 为一般中断请求 。

8畅 初始化

nRESET 信号用来复位 、启动处理器 ,处理器从地址 0x00000000开始执行程序 。

9畅 Debug 接口ARM7TDMI实现了典型的 ARM 调试结构 。 EmbeddedICE 模块包含断点和观察

点寄存器 ,使运行的代码能够停下来以便调试 。当遇到断点或观察点时 ,处理器停下来并进入调试状态 。一旦进入调试状态 ,就可使用扫描链 1强制指令进入指令流水线 ,检查处理器的寄存器 。对所有寄存器的数据进行存储 ,将它们的值送到数据总线 ,在数据总线上再用扫描链 1 采样并移出 。 访问特权模式寄存器需要强制加入指令来改变模式(注意 ,在调试状态 ,阻止从用户状态转换到特权模式的障碍已不存在) 。

若需检查系统状态 , 可让 ARM 以系统速度访问存储器 , 然后立即切换回调试状态 。调试接口可扩展集成的 EmbeddedICE宏单元所提供的功能 , 它使外部硬件能够支持调试 (通过 DBGEN) ,并发出异步的调试请求 (在 DBGRQ 端口) 或与指令同步的请求 (在 BREAKPT 端口) 。外部硬件通过 DBGACK 得知处理器核何时处于调试模式 。内部调试请求信号在 DBGRQI输出 。

Page 67: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 2章   ARM及其编程模型            57     

外部事件可通过 EXTERN0和 EXTERN1来触发观察点 ,而 EmbeddedICE观察点的匹配则由 RANGEOU T0和 RANGEOU T1端口的信号表示 。

如果通信发送缓冲器是空的 , 则在 COMM TX 端口发出信号 ; 如果通信接收缓冲器是空的 ,则在 COMMRX端口发出信号 。

处理器在 nEXEC端口指示当前在执行级的指令是否被执行 。 如果指令没有被执行 ,则表示它的条件码测试失败了 。

10畅 电源

ARM7TDMI核应在正常 5V 或 3V 电源电压下工作 , 这主要依赖于制作工艺和在核中使用的电路设计形式 。

11畅 JTAG 接口JTAG 控制信号符合标准的规定 , 这些控制信号通过专用引脚连接到片外测试控

制器 。

12畅 TAP信息这些信号用来支持对 JTAG 系统增加更多的扫描链 。 TAPSM [3 ∶ 0] 指示 TAP

控制器所处的状态 ; IR [3 ∶ 0] 给出 TAP 指令寄存器的内容 ; SCREG [3 ∶ 0] 是TAP控制器当前所选择的扫描寄存器的地址 ; TCK1 和 TCK2 形成一对非重叠时钟来控制扩展扫描链 ; nTDOEN 指示何时在 TD0有串行数据输出 。

本 章 要 点

瞯 精简指令集计算机 RISC和复杂指令集计算机 CISC 。瞯 到目前 ARM 体系结构共定义了 6个版本 ,以版本号 v1 ~ v6表示 。瞯 常见的 ARM 体系的变种有 T 变种 、 M 变种 、 E 变种 、 J变种和 SIMD变种 。瞯 ARM 处理器有两种工作状态 : ARM 状态和 Thumb状态 。瞯 ARM 处理器有 7种工作模式 : 用户模式 USR 、 快速中断模式 FIQ 、 中断模式IRQ 、管理模式 SVC 、中止模式 ABT 、系统模式 SYS和未定义模式 UND 。

瞯 ARM 有 37 个寄存器 , 包括 31 个通用寄存器 、 1 个当前程序状态寄存器(CPSR) 、 5个备份的程序状态寄存器 (SPSR) 。在任意时候 ,只有 16个通用寄存器 (R0 ~ R15) 和一个或者两个状态寄存器 (CPSR 、 SPSR) 对处理器来讲是可见的 。

瞯 ARM 体系结构所支持的异常类型有复位 、未定义指令 、软件中断 、指令预取中止 、数据访问中止 、外部中断请求 (IRQ) 和快速中断请求 (FIQ) 。

学出版社

职教技术出版中心

www.abook.cn

Page 68: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

58     嵌入式系统设计与开发 (第二版) 

习    题

1畅 ARM 处理器有什么特点 ?2畅 ARM 的哪个寄存器作为 PC使用 ?哪个作为 LR使用 ?3畅 ARM 有几种运行模式 ?哪些具有特权 ?如何改变处理器的模式 ?4畅 ARM 有几种异常 ?其异常处理方式和 x86有什么不同 ?5畅 试比较 ARM 和 x86的 I/O 寻址方式的特点 。6畅 若允许 FIQ 和 IRQ 中断 , CPSR应该如何设置 ?7畅 什么是 ARM 的 E 变种 ?8畅 ARM 的哪一种 (或几种) 模式使用的寄存器最少 ,使用的是哪些寄存器 ?9畅R13通常用来存储什么 ?

Page 69: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集

3畅1   ARM 指令集概述ARM 体系具有 ARM 和 Thumb两种指令集 。当处理器工作在 ARM 状态时 ,执行

ARM 指令集 (以后称 ARM 指令) , 而当其工作在 Thumb 状态时 , 则执行 Thumb 指令集 (以后称 Thumb指令) 。所有 ARM 指令均为 32 位长度 , 指令以字对齐方式保存在存储器中 , 而所有 Thumb 指令都是 16 位长度 , 指令以半字对齐方式保存在存储器中 。大多 ARM 指令都可以条件执行 ,而 Thumb指令仅有一条具备条件执行的功能 。

ARM 是典型的 RISC 构架处理器 , 指令和寻址方式少而简单 , 大多数 ARM 指令在一个周期内就可以执行完毕 。 ARM 体系的指令集只有载入和存储指令可以访问存储器 ,数据处理指令只对寄存器的内容进行操作 。为了提高处理器性能 , ARM 处理器采用流水线技术来缩短指令执行的时间 , ARM7为三级流水线 , ARM9为五级流水线 。

ARM 指令集主要包括数据处理指令 、分支指令 、 存储器访问指令 、 程序状态寄存器处理指令 、协处理器指令和异常中断产生指令等 。

3畅1畅1   ARM指令的编码格式

ARM 指令的典型编码格式如下 。

其中 ,每部分编码的含义如下所示 。瞯 cond :指令执行的条件编码 。瞯 opcode :指令操作符编码 。瞯 S :决定指令的执行是否影响 CPRS 的值 。瞯 Rn :包含第一个源操作数的寄存器编码 。瞯 Rd :目标寄存器编码 。瞯 shifter _ operand :第二个源操作数 。ARM 指令的黄型语法格式如下所示 :

        < opcode> { < cond> }{S}   < Rd > ,< Rn > ,< shifter _ operand >

其中 :瞯 < opcode > :指令助记符 ,表示指令的功能 ,如 ADD表示加法指令 。瞯 { < cond > } :表示指令执行的条件 ,如 EQ 表示相等时才执行该指令 。瞯 {S} :决定指令执行后 ,是否影响 CPRS的值 。默认情况下 ,数据处理指令不影响条件码标志位 ,但可以选择通过添加 “S” 来影响 。 有些指令如 CMP 不需要

学出版社

职教技术出版中心

www.abook.cn

Page 70: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

60     嵌入式系统设计与开发 (第二版) 

增加 “S” 就可改变相应的标志位 。 一般情况下 , 需要影响 CPRS 的值则加“S” ,否则不加 。

瞯 < Rd > :表示目标寄存器 。瞯 < Rn > :表示包含第一个源操作数的寄存器 。瞯 < shifter _ operand > :表示第二个源操作数 。ARM 指令语法格式中 , < > 中的内容是必需的 , 而 {} 中的内容是可选的 。 例

如 ,指令 “ADDEQS R0 ,R1 , # 6” 表示 ,相等时 (Z 标志等于 1) 执行操作 R0 ← R1+ 6 ,执行的结果影响 CPRS的值 (例如加的结果为负时 ,将 N 标志置 1) 。

3畅1畅2   ARM指令的条件码域

大多 ARM 指令都可以条件执行 ,也就是根据 CPSR中条件码的状态决定是否执行该指令 。只有在 CPSR中的条件码标志满足指定的条件时 , 带条件码的指令才可以执行 ,否则指令被忽略 (相当于一条空操作 (NOP) 指令) 。 每一条 ARM 指令编码中包含 4位的条件码 ,位于指令编码的最高 4位 [31 ∶ 28] 。条件码共有 16种 ,每种条件码可用两个字符 (条件码的助记符) 表示 ,这两个字符可以添加在指令助记符的后面和指令同时使用 。在 16种条件标志码中 ,只有 15 种可以使用 , 第 16 种 (1111) 为系统保留 ,暂时不能使用 。条件码的含义和助记符见表 3畅1 。

表 3畅1  指令的条件码条件码 助记符后缀 标志 含义

0000 EQ Z 置位 (Z = 1) 相等

0001 NE Z 清零 (Z = 0) 不相等

0010 CS/HS C 置位 无符号数大于或等于

0011 CC/ LO C 清零 无符号数小于

0100 MI N 置位 负数

0101 PL N 清零 正数或零

0110 VS V 置位 溢出

0111 VC V 清零 未溢出

1000 HI C 置位且 Z 清零 无符号数大于

1001 LS C 清零 Z 置位 无符号数小于或等于

1010 GE N 等于 V (N = 1 且 V = 1 或 N = 0 且 V = 0) 带符号数大于或等于

1011 L T N 不等于 V 带符号数小于

1100 G T Z 清零且 N 等于 V 带符号数大于

1101 LE Z 置位或 N 不等于 V 带符号数小于或等于

1110 A L 忽略 无条件执行

3畅1畅3  指令流水线

ARM 核使用流水线技术以提高处理器指令的执行速度 。 流水线允许几个操作同时

Page 71: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              61     

进行 ,并允许处理和存储系统连续操作 。 ARM7TDMI 使用了典型的三级流水线 ,ARM9TDMI使用了典型的五级流水线 。 尽管近年来 , ARM 公司开发了七级流水线的处理器核 ,但目前使用最广泛的还是基于三级流水线和五级流水线体系结构的 ARM 处理器核 。 ARM7TDMI使用三级流水线 ,指令的执行分三个阶段 :取指 、译码和执行 。

瞯 取指 (fetch) :从存储器中读入指令 。瞯 译码 (decode) :对指令及其用到的寄存器进行解码 。瞯 执行 (execute) :从寄存器送出信息 ,执行移位运算和逻辑运算 ,并将最后结果写回寄存器 。

图 3畅1   ARM单周期指令三级流水线操作

在通常情况下 , 当一个指令被执行的时候 ,下一个指令正在进行解码 ,而同一时间内第三条指令正在被系统从存储器中读取 。图 3畅1是 ARM 单周期指令的三级流水线操作 ,可见 ,在处理器执行简单的指令时 , 可以达到每个时钟周期执行一条指令 。 而当执行多周期指令时 ,由于流水线被阻断 ,达不到每个时钟周期执行一条指令 。流水线处理器的执行使得程序计数器 (PC) 必须在当前指令之前计数 , 即在第一条指令执行周期开始时 ,得到的 PC为当前指令的 PC 加 8 。

3畅2   ARM 寻址方式ARM 的指令编码中包含了操作码 (指令的操作性质 ,如加 、减等) 和参与运算的

操作数信息 。寻址方式包括指令寻址和操作数的寻址 。所谓操作数的寻址方式是指根据指令编码中的操作数信息寻找真实操作数的方式 。 ARM 处理器有如下几种常用的寻址方式 。

1畅 立即寻址

        ADD   R0,R0,# 3;  R0 ← R0 + 3MOV   R1,# 0x18; R1 ← # 0x18

第一条指令完成寄存器 R0的内容加 3 ,结果再放回 R0中 ;第二条指令完成将十六进制数 18送到寄存器 R1中 。

立即寻址是一种特殊的寻址方式 ,指令编码中包含了操作数本身 ,操作数在操作码的后续字节中 ,这个操作数称为立即数 。 立即数在指令中以 # 为前缀表示 。 在 # 后加0x 或 & 表示十六进制数 ,加 0b表示二进制数 ,加 0d或缺省表示十进制数 。

2畅 寄存器寻址

        ADD R0,R1,R2;R0 ← R1 + R2

这条指令完成寄存器 R1的内容与寄存器 R2 的内容相加 , 结果送到寄存器 R0 中 。寄存器寻址就是用寄存器的内容作为操作数 。指令编码中的操作数信息部分给出了寄存

学出版社

职教技术出版中心

www.abook.cn

Page 72: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

62     嵌入式系统设计与开发 (第二版) 

器编号 ,而操作数就在此编号的寄存器中 。

3畅 寄存器间接寻址

        LDR R0,[R1];R0 ← [R1]STR R0,[R1];[R1] ← R0

第一条指令将 R1指向的存储单元中的内容加载到 R0中 ;第二条指令将寄存器 R0的内容送到 R1 指向的存储单元中 。 寄存器间接寻址就是用寄存器 (如第一条指令的R1) 的值作为操作数的地址指向一个存储单元 ,而操作数在此存储单元中 。

4畅 寄存器移位寻址

        ADD R3,R2,R1,LSL # 2;R3 ← R2 + 4倡R1ADD R3,R2,R1,LSL R4;R3 ← R2 + R1倡2R4

第一条指令先将寄存器 R1的内容逻辑左移 2位 (左移一位相当于乘以 2) , 再与寄存器 R2的内容相加 ,结果送到寄存器 R3中 ;第二条指令先将寄存器 R1的内容逻辑左移 R4位 (R4的内容表示移位的位数) , 再与寄存器 R2 的内容相加 , 结果送到寄存器R3中 。寄存器移位寻址是 ARM 指令集特有的 , 第二个源寄存器中存放的操作数先进行移位操作 ,然后与第一个源操作数结合 。移位的位数可以由立即数直接给出 ,也可以以寄存器的方式间接给出 。各个移位操作的移位方式如图 3畅2所示 。

图 3畅2   ARM的移位操作瞯 LSL (logical shif t left) :逻辑左移 。 寄存器中的操作数左移一位 , 低端空出位补 0 。

瞯 ASL (arithmetic shift left) :算术左移 。含义与 LSL 相同 。瞯 LSR (logical shif t right) : 逻辑右移 。 寄存器中的操作数右移一位 , 高端空出位补 0 。

瞯 ASR (arithmetic shift right) :算术右移 。其操作对象是带符号数 。 因此移位过程中应保持操作数的符号不变 。寄存器中的操作数右移一位 。 若操作数为正数 ,则高端空出位补 0若操作数为负数 ,则高端空出位补 1 (符号位扩展) 。

Page 73: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              63     

瞯 ROR (rotate right) :循环右移 。寄存器中的操作数右移一位 ,最高端空出位移入最低端移出的位 。

瞯 RRX (rotate right ex tended) : 带扩展的循环右移 。 寄存器中的操作数右移一位 ,高端空出位用原来 C标志位中的值填入 ,低端移出的位填入 C标志位 。

5畅 基址变址寻址

        LDR R0,[R1,# 唱8];      R0 ← [R1唱8]前变址模式LDR R0,[R1,R2]; R0 ← [R1 + R2];基地加索引寻址LDR R0,[R1],# 8; R0 ← [R1],R1 ← R1 + 8;后变址模式LDR R0,[R1,# 4]!; R0 ← [R1 + 4],R1 ← R1 + 4;自动变址模式

第一条指令把 R1唱8指向的存储单元中的内容加载到 R0 中 ; 第二条指令将 R1 加R2指向的存储单元中的内容加载到 R0中 ;第三条指令把 R1指向的存储单元中的内容加载到 R0中 ,再修改 R1等于 R1 + 8 ;第四条指令把 R1 + 4 指向的存储单元中的内容加载到 R0中 ,再修改 R1等于 R1 + 4 。

基址变址寻址是将基址寄存器中的内容与指令中的偏移量相加 ,得到操作数的存放地址 。基址变址寻址用于访问基址附近的存储单元 。基址变址寻址包括基址加偏移寻址和基地加索引寻址 。基址加偏移寻址是在基址寄存器的基础上 ,加上 (或减去) 一个不超过 4KB的偏移量来计算访问地址 , 如果偏移量是另一个寄存器的值时 , 就是基址加索引寻址 (如第二条指令) 。基址加偏移寻址又分为前变址模式 、 后变址模式和自动变址模式 。前变址模式基址寄存器存放的地址先变化 ,再执行指令操作 (如第一条指令) ;后变址模式先用基址寄存器的内容作为地址执行指令操作 ,然后再加偏移量来改变基址寄存器的内容 (如第三条指令) ;自动变址模式用符号 “ !” 表示指令执行完后自动更新基址 (如第四条指令 ,后变址模式不需要 “ !”) 。 当基址变址寻址的偏移量为零时 , 基址变址寻址就是寄存器间接寻址 。

6畅 多寄存器寻址

多寄存器寻址方式可一次传递几个寄存器中的值 ,允许在一条指令中传送 16 个寄存器的任何子集 ,如 :        LDMIA R0,{R1,R2,R3};R1 ← [R0];R2 ← [R0 + 4];R3 ← [R0 + 8]

这一条指令将以 R0 为起始地址的存储单元中的内容加载到多个寄存器 R1 、 R2 、R3中 。

7畅 堆栈寻址

堆栈是一种按特定顺序进行存取的存储区 , 这种特定顺序即 “先进后出 (FILO)”或 “后进先出 (LIFO)” 。指向堆栈地址的寄存器称为堆栈指针 (SP) 。 ARM 中 , 寄存器 R13通常用作堆栈指针 。 所谓堆栈寻址即利用堆栈指针按特定顺序访问存储单元 。使用压栈指令 (push , STMFD) 向堆栈写数据 ,使用出栈指令 (pop , LDMFD) 从堆栈中读数据 ,如 :

学出版社

职教技术出版中心

www.abook.cn

Page 74: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

64     嵌入式系统设计与开发 (第二版) 

        STMFD R13!,{R0,R4唱R12,LR}   ;将寄存器列表中的寄存器(R0,R4到;R12,LR)内容存入堆栈

LDMFD R13!,{R0,R4唱R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到 R12,PC)中

8畅 块拷贝寻址

块拷贝寻址即把一块数据从存储空间的某一位置复制到另一位置 ,如 :        LDMIA R0!,{R2唱R9}

STMIA R1!,{R2唱R9}

上面两条指令将 R0指向位置的 8个字复制到 R1指向的位置 。关于多寄存器寻址 、堆栈寻址和块拷贝寻址的详细说明参考 3畅 3畅3节 。

9畅 相对寻址

相对寻址是一种指令的寻址 , 可以认为是基地址为程序计数器 (PC) 的当前值 ,偏移量为目的地址和现行指令地址之间差的基址变址寻址 , 将 PC 的值与偏移量相加之后得到下一条要执行的指令的地址 。 以下程序段完成子程序的调用和返回 , 跳转指令BL 采用了相对寻址方式 。        BL   NEXT        ;跳转到子程序 NEXT处执行

爥爥NEXT:爥爥MOV  PC,LR ;从子程序返回

其中 , NEXT 的地址由 PC的值加 PC 到 NEXT 的偏移量得到 。

3畅3   ARM 指令分类介绍ARM 指令根据其功能可分为六类 : 数据处理指令 (含乘法指令) 、 分支指令 、 存

储器访问指令 、程序状态寄存器与通用寄存器之间传送指令 、协处理器指令和异常中断产生指令 。

3畅3畅1  数据处理指令

数据处理指令如表 3畅2 所示 ,可分为数据传送指令 (MOV 、 MVN) 、 算术和逻辑运算指令 (ADD 、 SUB 、 RSB 、 ADC 、 SBC 、 RSC 、 AND 、 ORR 、 EOR 、 BIC) 和比较指令 (CMP 、 CMN 、 TST 、 TEQ) 。数据传送指令用于数据在源 、 目标之间进行传输 。算术逻辑运算指令完成常用的算术和逻辑的运算 ,该类指令不但将运算结果保存在目的寄存器中 ,同时可以更新 CPSR中的相应条件标志位 。比较指令不保存运算结果 ,只更新 CPSR中相应的条件标志位 。

Page 75: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              65     

表 3畅2   ARM数据处理指令助记符 说明 操作

MOV {cond} {S} Rd , operand2 数据传送指令 Rd ← operand2MVN {cond} {S} Rd , operand2 数据非传送指令 Rd ← ( ~ operand2)ADD {cond} {S} Rd , Rn , operand2 加法运算指令 Rd ← Rn + operand2SUB {cond} {S} Rd , Rn , operand2 减法运算指令 Rd ← Rn唱operand2RSB {cond} {S} Rd , Rn , operand2 逆向减法指令 Rd ← operand2唱RnADC {cond} {S} Rd , Rn , operand2 带进位加法指令 Rd ← Rn + operand2 + CFSBC {cond} {S} Rd , Rn , operand2 带进位减法指令 Rd ← Rn唱operand2唱 (NO T) CFRSC {cond} {S} Rd , Rn , operand2 带进位逆向减法指令 Rd ← operand2唱Rn唱 (NO T) CFA ND {cond} {S} Rd , Rn , operand2 逻辑 “与” 操作指令 Rd ← Rn & operand2ORR {cond} {S} Rd , Rn , operand2 逻辑 “或” 操作指令 Rd ← Rn | operand2EOR {cond} {S} Rd , Rn , operand2 逻辑 “异或” 操作指令 Rd ← Rn^ operand2BIC {cond} {S} Rd , Rn , operand2 位清除指令 Rd ← Rn & ( ~ operand2)CMP {cond} Rn , operand2 比较指令 标志 N 、 Z 、 C 、 V ← Rn唱operand2CM N {cond} Rn , operand2 负数比较指令 标志 N 、 Z 、 C 、 V ← Rn + operand2T S T {cond} Rn , operand2 位测试指令 标志 N 、 Z 、 C 、 V ← Rn & operand2TEQ {cond} Rn , operand2 相等测试指令 标志 N 、 Z 、 C 、 V ← Rn^ operand2

大多数 ARM 通用数据处理指令有一个灵活的第二操作数 ,在每 —个指令的句法描述中以 “ operand2” 表示 , operand2 有两种可能的形式 : # immed _ 8r 或 Rm { ,shif t} 。其中 , immed _ 8r为取值是数字常量的表达式 。 常量是一个 8 位的常数经循环右移偶数位 (0 、 2 、 4 、 8 、 … 、 26 、 28 、 30) 得到 。 ARM 指令是固定的 32 位指令编码 ,不可能直接用 32位表示立即数 ,采用上述间接方式表示的立即数在指令编码中需要 12位 (其中 8位表示常数 , 4 位表示循环右移) 。 这样一来 , 并不是每一个 32 位的常数都是合法的立即数 ,只有通过上面的构造方法得到的才是合法的立即数 。

合法常量 : 0xFF 、 0x104 、 0xFF0 、 0xFF000 、 0xFF000000 、 0xF000000F 。非法常量 : 0x101 、 0x102 、 0xFFl 、 0xFF04 、 0xFF003 、 0xFFFFFFFF 、 0xF000001F 。Rm 为存储第二操作数数据的 ARM 寄存器 ,可用各种方法对寄存器中的位进行移

位或循环移位 。 shift 可以是以下方法的任意一种 。瞯 ASR n :算术右移 n位 (1 ≤ n ≤ 32) 。瞯 LSL n :逻辑左移 n位 (1 ≤ n ≤ 31) 。瞯 LSR n :逻辑右移 n位 (1 ≤ n ≤ 32) 。瞯 ROR n :循环右移 n位 (1 ≤ n ≤ 31) 。瞯 RRX :带扩展的循环右移 1 位 。瞯 type Rs : type 是 ASR 、 LSL 、 LSR 和 ROR 中的一种 。 Rs 是提供移位量的ARM 寄存器 ,仅使用最低有效字节 。

在指令中移位操作的结果用作 operand2 ,但 Rm本身不变 。

学出版社

职教技术出版中心

www.abook.cn

Page 76: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

66     嵌入式系统设计与开发 (第二版) 

1畅 数据传送指令

(1) MOV ——— 数据传送指令指令格式 :

        MOV{cond}{S} Rd,operand2

MOV 指令将源操作数 operand2 (可以是立即数或寄存器的值) 传送到目标寄存器Rd中 。若设置条件 cond ,则 CPSR 中的条件码标志满足指定条件时 , MOV 指令才执行 。若设置 S位 ,则根据指令执行的结果更新标志 N 和 Z , 在计算 operand2 时更新标志 C ,不影响 V 标志 。

指令示例 :        MOV  R0,R1 ;R0 = R1  不影响标志位

MOVS  R2,# 0x10 ;R2 = # 0x10,并影响标志位MOVEQ R1,# 0 ;相等时(Z = 1)则 R1 = 0

(2) MVN ———数据非传送指令指令格式 :

        MVN{cond}{S} Rd,operand2

MVN 指令将源操作数 operand2 (可以是立即数或寄存器的值) 按位取反后传送到目标寄存器 Rd 中 。 若设置条件 cond , 则 CPSR 中的条件码标志满足指定条件时 ,MVN 指令才执行 。若设置 S位 ,则根据指令执行的结果更新标志 N 和 Z , 在计算 op唱erand2时更新标志 C ,不影响 V 标志 。

指令示例 :        MVN  R3,R1,LSL # 2     ;R1左移并取反后 ,结果存到 R3

MVNS R2,# 0xFF ;R2 = 0Xffff00,并影响标志位

2畅 算术和逻辑运算指令

(1) ADD ———加法运算指令指令格式 :

        ADD{cond}{S} Rd,Rn,operand2

ADD指令将操作数 operand2 与 Rn 的值相加 , 结果存放到目的寄存器 Rd 中 。 若设置 S , 则根据运算结果影响 N 、 Z 、 C 、 V 位 (指令 ADC 、 SUB 、 RSB 、 SBC 、 RSC对标志位的影响同 ADD指令) 。

指令示例 :        ADDS R1,R1,R2     ;R1 = R1 + R2,并根据运算的结果更新标志位

ADD R0,R1,# 1 ;R0 = R1 + 1ADD R0,R2,R3,LSL# 2 ;R0 = R2 + (R3 < < 2)

(2) ADC ———带进位加法运算指令指令格式 :

        ADC{cond}{S} Rd,Rn,operand2

Page 77: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              67     

ADC指令将操作数 operand2与 Rn的值相加 ,再加上 CPSR 中的 C 条件标志位的值 ,结果存放到目的寄存器 Rd中 。 ADC 指令利用进位标志位 , 可以做比 32 位大的数的加法 ,注意不要忘记设置 S 后缀来更新进位标志 。

以下指令序列完成两个 64 位数的加法 , 第一个数由高到低存放在寄存器 R5 ~ R4中 ;第二个数由高到低存放在寄存器 R3 ~ R2 中 , 运算结果由高到低存放在寄存器R1 ~ R0中 。        ADDS R0,R4,R2     ;加低端的字

ADC R1,R5,R3 ;(R1,R0) = (R5,R4) + (R3,R2)

(3) SUB ——— 减法运算指令指令格式 :

        SUB{cond}{S} Rd,Rn,operand2

SUB指令用 Rn的值减去操作数 operand2 ,并将结果存放到目的寄存器 Rd中 。指令示例 :

        SUBS R1,R1,R2     ;R1 = R1唱R2,并根据运算的结果更新标志位SUBGT R3,R3,# 1 ;大于则 R3 = R3唱1SUB R0,R2,R3,LSL# 2 ;R0 = R2唱(R3 < < 2)

(4) SBC ———带进位减法运算指令指令格式 :

        SBC{cond}{S} Rd,Rn,operand2

SBC指令用 Rn的值减去操作数 operand2 , 再减去 CPSR 中的 C 条件标志位的非(即 C = 0 ,则结果减去 1) ,结果存放到目的寄存器 Rd 中 。 利用 SBC 指令可以做比 32位大的数的减法 ,如 :        SUBS R0,R0,R2

SBC R1,R1,R3   ;用 SBC实现64位减法 ,(R1,R0) = (R1,R0)唱(R3,R2)

(5) RSB ———逆向减法指令指令格式 :

        RSB{cond}{S} Rd,Rn,operand2

RSB指令用操作数 operand2减去 Rn的值 ,结果存放到目的寄存器 Rd中 。指令示例 :

        RSB R0,R1,R2 ;R0 = R2– R1RSB R0,R1,# 256 ;R0 = 256– R1RSB R0,R2,R3,LSL# 1 ;R0 = (R3 < < 1)唱R2

(6) RSC ———带进位逆向减法指令指令格式 :

        RSC{cond}{S} Rd,Rn,operand2

RSC 指令用操作数 operand2减去 Rn 的值 , 再减去 CPSR 中的 C 条件标志位的非(即 C = 0 ,则结果减去 1) ,结果存放到目的寄存器 Rd中 。

指令示例 :

学出版社

职教技术出版中心

www.abook.cn

Page 78: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

68     嵌入式系统设计与开发 (第二版) 

        RSBS  R2,R0,# 0     ;用 RSC指令实现求64位数值的负数RSC  R3,R1,# 0 ;(R3,R2) = 唱(R1,R0))

(7) AND ———逻辑 “与” 操作指令指令格式 :

        AND{cond}{S} Rd,Rn,operand2

AND指令将操作数 operand2 与 Rn 的值按位逻辑 “与” , 结果存放到目的寄存器Rd中 。若设置 S , 则根据运算结果影响 N 、 Z 位 ; 在计算第二操作数时 , 更新 C 位 ,不影响 V 位 (指令 ORR 、 EOR 、 BIC对标志位的影响同 AND指令) 。

指令示例 :        ANDS R1,R1,R2     ;R1 = R1&R2,并根据运算的结果更新标志位

AND R0,R0,# 0x0F ;R0 = R0&0x0F,取出 R0最低4位数据

(8) ORR ———逻辑 “或” 操作指令指令格式 :

        ORR{cond}{S} Rd,Rn,operand2

ORR指令将操作数 operand2 与 Rn 的值按位逻辑 “或” , 结果存放到目的寄存器Rd中 。

指令示例 :        ORRS R1,R1,R2   ;R1 = R1 | R2,并根据运算的结果更新标志位

ORR  R0,R0,# 0x0F ;R0 = R0 | 0x0F,将 R0最低4位置1,其余位不变

(9) EOR ———逻辑 “异或” 操作指令指令格式 :

        EOR{cond}{S} Rd,Rn,operand2

EOR指令将操作数 operand2与 Rn的值按位逻辑 “异或” ,结果存放到目的寄存器Rd中 。

指令示例 :        EORS R1,R1,R2       ;R1 = R1^ R2,并根据运算的结果更新标志位

EOR  R0,R0,# 0x0F ;R0 = R0^ 0x0F,将 R0最低4位取反 ,其余位不变

(10) BIC ——— 位清除指令指令格式 :

        BIC{cond}{S} Rd,Rn,operand2

BIC指令将 Rn的值与操作数 operand2 的反码按位逻辑 “与” , 结果存放到目的寄存器 Rd中 。

指令示例 :        BIC  R0,R0,# 0x0F    ;将 R0最低4位清零 ,其余位不变

3畅 比较指令

(1) CMP ———比较指令指令格式 :

Page 79: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              69     

        CMP{cond} Rn,operand2

CMP指令用 Rn的值减去操作数 operand2 , 并将结果的状态 (Rn 与 operand2 比较是大 、小 、相等) 反映在 CPSR中 ,以便后面的指令根据条件标志决定程序的走向 。CMP指令与 SUBS指令完成的操作一样 ,区别是 CMP指令只减 ,不存结果 。

指令示例 :        cmp R0,R1       ;比较 R0,R1

beq stop ;R0 = R1跳到 stop

blt less ;R0 < R1跳到 Less

Less:

Stop:

(2) CMN ———负数比较指令指令格式 :

        CMN{cond} Rn,operand2

CMN 指令用 Rn的值加上操作数 operand2 , 并将结果的状态反映在 CPSR 中 , 以便后面的指令根据条件标志决定程序的走向 。 CMN 指令与 ADDS 指令完成的操作一样 ,区别是 CMN 指令只加 ,不存结果 。

指令示例 :        CMN R1,# 100;将寄存器 R1的值与立即数100相加 ,并根据结果设置 CPSR的标志位

(3) TST ———位测试指令指令格式 :

        TST{cond} Rn,operand2

TST 指令将操作数 operand2 与 Rn 的值按位逻辑 “与” , 并根据运算的结果更新CPSR中相应的条件标志位 。 TST 指令与 ANDS指令完成的操作一样 , 区别是 TST 指令不存结果 。

指令示例 :        TST R1,# 0x01   ;测试 R1的最低位是否为0

(4) TEQ ———相等测试指令指令格式 :

        TEQ{cond} Rn,operand2

TEQ 指令将操作数 operand2 与 Rn 的值按位 “异或” , 并根据运算的结果更新CPSR中相应的条件标志位 。 TEQ 指令与 EORS指令完成的操作一样 ,区别是 TEQ 指令不存结果 。

指令示例 :        TEQ R1,R2   ;比较 R1与 R2是否相等

TEQ R0,R0 ;R0^ R0结果为0,标志位 Z = 1

CMP 、 CMN 、 TST 、 TEQ 指令本身就是为影响标志位的 ,所以 ,不设置 S 也会影

学出版社

职教技术出版中心

www.abook.cn

Page 80: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

70     嵌入式系统设计与开发 (第二版) 

响标志位 。

4畅 前导零计数 CLZ指令指令格式 :

        CLZ{cond} Rd,Rm其中 :瞯 cond :可选的条件码 。瞯 Rd :结果寄存器 , Rd不允许是 R15 。瞯 Rm :操作数寄存器 。CLZ指令对 Rm 中值的前导零的个数进行计数 ,结果放到 Rd中 。 若源寄存器全为

0 ,则结果为 32 。若位 [31] 为 1 ,则结果为 0 。这条指令不影响条件码标志 。指令示例 :

        CLZ R4,R9CLZNE   R2,R3

5畅 乘法指令

ARM 的乘法指令完成两个寄存器的内容相乘 , 结果可以是 32 位 (放在一个寄存器中) ,也可以是 64位 (放在两个寄存器中) 。 两种情形也可以是乘加的结果 , 即将乘积连续相加成为总和 ,参与运算的数可以是有符号的或无符号的 。 ARM 的乘法指令如表 3畅3所示 。其中 , R15 不能用作 Rd 、 Rm 、 Rs 或 Rn , Rd 不能与 Rm 相同 。 乘法指令中的所有操作数 、目的寄存器必须为通用寄存器 ,不能对操作数使用立即数或被移位的寄存器 。乘法指令和乘加指令的运算结果影响 CPSR中相应的条件标志位 。

表 3畅3  乘法指令表助记符 说明 操作

M U L{cond}{S} Rd , Rm , Rs 32位乘法指令 Rd ← Rm倡RsM LA{cond}{S} Rd , Rm , Rs , Rn 32位乘加指令 Rd ← (Rm倡Rs) + RnU M U LL{cond}{S} RdLo , RdHi , Rm , Rs 64位无符号乘法指令 (RdLo , RdHi) ← Rm倡RsU M LA L{cond}{S}RdLo , RdHi , Rm , Rs 64位无符号乘加指令 (RdLo , RdHi) ← Rm倡Rs + (RdLo , RdHi)SM U LL{cond}{S}RdLo , RdHi , Rm , Rs 64位有符号乘法指令 (RdLo , RdHi) ← Rm倡RsSM LA L{cond}{S}RdLo , RdHi , Rm , Rs 64位有符号乘加指令 (RdLo , RdHi) ← Rm倡Rs + (RdLo , RdHi)

(1) MUL 和 MLA ——— 32位乘法指令指令格式 :

        MUL{cond}{S} Rd,Rm,RsMLA{cond}{S} Rd,Rm,Rs,Rn

MUL 指令完成将 Rm 和 Rs中的值相乘 , 并把结果放置到 Rd 中 。 MLA 指令完成将 Rm 和 Rs中的值相乘 ,再将乘积加上 Rn , 并把结果放置到 Rd 中 。 {cond} 表明该指令可以条件执行 ,若选 S ,则可以根据运算结果设置 CPSR 中相应的条件标志位 。 由

Page 81: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              71     

于运算结果只保留最低有效的 32位 ,对无符号数和有符号数是一样的 , 所以这条指令无需区分无符号数和有符号数 ,操作数 1和操作数 2 均可以是 32 位的有符号数或无符号数 。

指令示例 :        MLA R0,R1,R2,R3     ;R0 = R1倡R2 + R3

MLAS R0,R1,R2,R3 ;R0 = R1倡R2 + R3,同时设置 CPSR中的相关条件标志位

(2) UMULL 和 UMLAL ——— 64位无符号数乘法指令指令格式 :

        UMULL{cond}{S} RdLo,RdHi,Rm,RsUMLAL{cond}{S} RdLo,RdHi,Rm,Rs

UMULL 指令完成将两个无符号整数 Rm 和 Rs 相乘 , 并将结果的最低有效 32 位放置到 RdLo中 ,最高有效 32 位放置到 RdHi 中 。 UMLAL 指令完成将两个无符号整数 Rm 和 Rs相乘 ,并将 64位结果加到原 RdHi 和 RdLo中的 64位无符号整数上去 。

指令示例 :        UMULL   R0,R1,R2,R3     ;R0 = (R2 × R3)的低32位

;R1 = (R2 × R3)的高32位UMLAL   R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0

;R1 = (R2 × R3)的高32位 + R1

(3) SMULL 和 SMLAL ——— 64位有符号数乘法指令指令格式 :

        SMULL{cond}{S} RdLo,RdHi,Rm,RsSMLAL{cond}{S} RdLo,RdHi,Rm,Rs

SMULL 指令完成将两个有符号整数 (补码表示) Rm 和 Rs 相乘 , 并将结果的最低有效 32位放在 RdLo中 ,最高有效 32 位放在 RdHi中 。 SMLAL 指令完成将两个有符号整数 (补码表示) Rm和 Rs相乘 ,并将 64位结果加到原 RdHi和 RdLo中的 64位有符号整数上去 。

指令示例 :        SMLALS   R0,R1,R7,R6   ;R0 = (R7倡R6)的低32位 + R0,R1 = (R7倡R6)的高32位 + R1,根据运算结

果设置 CPSR中相应的条件标志位SMULLNE   R0,Rl,R7,R6 ;当条件 NE时 ,R0 = (R7倡R6)的低32位 ,R1 = (R7倡R6)的高32位

参与运算的数据和结果均为补码表示的有符号整数 。

3畅3畅2  分支指令

在 ARM 程序中有两种方法可以实现程序流程的跳转 : 一种是通过向程序计数器(PC) 写入跳转地址值 ,可以实现在 4GB的地址空间中任意跳转 ,如 MOV PC LR ;另一种是使用专门的分支指令 ,实现从当前指令向前或向后的 32MB 的地址空间的跳转 。ARM 的分支指令见表 3畅 4 。

学出版社

职教技术出版中心

www.abook.cn

Page 82: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

72     嵌入式系统设计与开发 (第二版) 

表 3畅4   ARM分支指令助记符 说明 操作

B {cond} lable 分支指令 PC ← lableBL {cond} lable 带链接的分支指令 LR ← PC唱4 , PC ← lableBX {cond} Rm 带状态切换的分支指令 PC ← Rm ,切换处理器状态

(1) B ——— 分支指令指令格式 :

        B{cond}   lable

其中 lable是一个地址标号 ,这条指令使 ARM 处理器跳转到给定的目标地址 lable处执行指令 。 B指令编码中的跳转地址值是相对当前 PC 值的一个偏移量 , 经汇编器计算得到跳转的绝对地址 。

指令示例 :        LOOP

爥爥B LOOP           ;无条件跳转 LOOP处执行CMP  R1,# 0 ;R1等于0时 ,程序跳转到标号 Label处执行BEQ  Label爥爥Label爥爥

(2) BL ———带链接的分支指令指令格式 :

        BL{cond}   lable

BL 指令在执行跳转的同时将转移指令的下一条指令的地址复制到当前处理器模式下的链接寄存器 LR中 ,这一般用于子程序的调用和返回 。

指令示例 :        BL   fun     ;调用子程序 fun

爥爥fun爥爥MOV PC,LR   ;子程序返回

(3) BX ———带状态切换的分支指令指令格式 :

        BX{cond} RmBX指令使 ARM 处理器跳转到 Rm 的值指定的地址处执行指令 , 若 Rm 的位 [0]

为 1 ,则指令将 CPSR中的 T 标志位置位 ,且将目标地址处的代码解释为 Thumb 代码

Page 83: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              73     

(ARM 状态切换到 Thumb 状态) 。 若 Rm 的位 [0] 为 0 , 则处理器继续执行 ARM指令 。

指令示例 :        BX   R7     ;跳转到 R7的值指定的地址 ,并根据 R7的最低位切换处理器状态

(4) BLX ——— 带链接分支并可选的交换指令这条指令有两种格式 :

        BLX{cond} RmBLX  label

BLX指令将本指令的下一条指令的地址复制到当前处理器模式下的链接寄存器 LR中 ,转移到 label或 Rm 的值指定的地址处 ,若 Rm 的位 [0] 为 1 或使用 “BLX label”形式 ,则指令集切换到 Thumb 。

指令示例 :        ;ARM指令

爥BLX  SUB1 ;一定切换到 Thumb爥;以下是 Thumb指令SUB1爥爥BX   R14 ;返回 ARM代码

3畅3畅3  存储器访问指令

ARM 微处理器的加载/存储指令用于在寄存器和存储器之间传送数据 , 加载指令(LDR) 用于将存储器中的数据传送到寄存器 , 存储寄存器指令 (STR) 将数据从寄存器存放到存储器中 。 ARM 处理器是加载/存储体系结构的典型的 RISC 处理器 , 对存储器的访问只能使用加载/存储指令实现 。 另外 , ARM 处理器对 I/O 采用存储器映射式的寻址 (I/O 端口与存储器统一编址) , 因此输入/输出也通过加载/存储指令实现 。 当加载/存储的地址指向一个 I/O 端口时 , LDR完成输入 , STR 完成输出 。 ARM 指令集有 3种基本的数据存取指令 : 单寄存器存取指令 (LDR , STR) 、 多寄存器存取指令(LDM 、 STM) 和单寄存器交换指令 (SWP) 。

1畅 单寄存器存取指令

(1) LDR和 STR ———用于字和无符号字节指令格式 :

        LDR/STR{cond}{T}Rd,<地址 >LDR/STR{cond}B{T}Rd,<地址 >

指令 “LDR {cond} { T} Rd ,< 地址 > ” 加载指定地址的字数据到 Rd 中 ; 指令“STR {cond} { T} Rd ,< 地址 > ” 存储 Rd 中的字数据到指定的地址单元中 。 指令

学出版社

职教技术出版中心

www.abook.cn

Page 84: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

74     嵌入式系统设计与开发 (第二版) 

“LDR {cond} B {T} Rd ,< 地址 > ” 加载指定地址的字节数据到 Rd 的最低字节中(Rd的高 24位清零) ;指令 “STR {cond} B {T} Rd ,<地址 > ” 存储 Rd 中的最低字节数据到指定的地址单元中 。 T 为可选后缀 , 若有 T , 那么即使处理器是在特权模式下 ,存储系统也将访问看成处理器是在用户模式下 , T 在用户模式下无效 ,不能与前索引偏移一起使用 T 。地址部分可用的形式有以下 4种 。

1) 零偏移 [Rn] , Rn的值作为传送数据的地址 。如 :        LDR R0,[R1];

2) 前索引偏移 [Rn , Flexoffset] { !} 在数据传送之前 , 将偏移量 Flexoffset 加到Rn中 。其结果作为传送数据的存储器地址 。 若使用后缀 “ !” , 则结果写回到 Rn 中 ,且 Rn不允许是 R15 ,如 :        LDRB R0,[R1,# 8]

LDR R0,[R1,# 8]!

3) 程序相对偏移 label (label 必须是在当前指令的 ± 4KB范围内) 。程序相对偏移是前索引形式的另一种版本 。 从 PC 计算偏移量 , 并将 PC 作为 Rn

生成前索引指令 ,不能使用后缀 “ !” ,如 :        LDR  R0,place      ;place地址装入 R0

4) 后索引偏移 [Rn] , Flexoffset 。 在数据传送后 , 将偏移量 Flexoffset 加到 Rn中 ,结果写回到 Rn , Rn不允许是 R15 ,如 :        LDR R0,[R1],R2,LSL # 2   ;将存储器地址为 R1的字数据读入寄存器 R0,并将新地

;址 R1 + R2 × 4写入 R1

用于字和无符号字节的存取指令 ,偏移量 Flexoffset 可以是下两种形式之一 。1) 取值范围是 - 4095到 + 4095的整数的表达式 ,经常是数字常量 ,如 :

        STR R5,[R7],# 唱唱82) 一个寄存器再加上移位 (移位由立即数指定) ,如 : {唱} Rm { , shif t} 。其中 :瞯 - :可选负号 。 若带此符号 , 则从 Rn 中减去偏移量 ; 否则将偏移量加到

Rn中 。瞯 Rm :内含偏移量的寄存器 。 Rm 不允许是 R15 。瞯 Shift : Rm 的可选移位方法 。可以是下列形式的任意一种 。瞯 ASR n :算术右移 n位 (1 ≤ n ≤ 32) 。瞯 LSL n :逻辑左移 n位 (1 ≤ n ≤ 31) 。瞯 LSR n :逻辑右移 n位 (1 ≤ n ≤ 32) 。瞯 ROR n :循环右移 n位 (1 ≤ n ≤ 31)瞯 RRX :循环右移 1位 ,带扩展 。

        LDR R0,[R1,R2,LSL# 2]!(2) LDR和 STR ———用于半字和带符号字节指令格式 :

        LDR/STR{cond} < H | SH| SB > Rd,<地址 >

Page 85: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              75     

LDR {cond} H   Rd ,<地址 > : 指令加载存储器中指定地址的一个 16 位的无符号半字数据到目的寄存器 Rd中同时将寄存器 Rd的高 16位清零 。

LDR {cond} SH   Rd ,<地址 > :指令加载存储器中指定地址的一个 16 位的有符号半字数据到目的寄存器 Rd中 ,同时将寄存器 Rd的高 16位作符号扩展 。

LDR {cond} SB   Rd ,<地址 > :指令加载存储器中指定地址的一个 8位的有符号字节数据到目的寄存器 Rd中 ,同时将寄存器 Rd的高 24位作符号扩展 。

STR {cond} H   Rd ,<地址 > :指令存储寄存器 Rd中一个 16 位的无符号半字数据 (Rd的低 16位) 到指定的存储器地址单元中 。

STR {cond} SH   Rd ,<地址 > :指令存储寄存器 Rd 中一个 16 位的有符号半字数据 (Rd的低 16位) 到指定的存储器地址单元中 。

STR {cond} SB   Rd ,<地址 > :指令存储寄存器 Rd 中一个 8 位的有符号字节数据 (Rd的低 8位) 到指定的存储器地址单元中 。

这类指令地址部分可用的形式与用于字和无符号字节 LDR /STR 的指令相同 , 但要注意偏移量表达式的取值范围是 - 255 ~ + 255 内的整数 , 且不允许一个寄存器再加上移位的形式 。例如 , “LDRSB R0 , [R1] , R2 , LSL   2” 是错误的 。

2畅 多寄存器存取指令

ARM 微处理器支持批量数据加载/存储指令 , 这可以一次在一片连续的存储器单元和多个寄存器之间传送数据 。批量数据加载指令 (LDM) 用于将一片连续的存储器中的数据传送到多个寄存器 , 批量数据存储指令 (STM) 则将多个寄存器的值存储到一片连续的存储器中 。

指令格式 :        LDM/STM{ < cond> } <模式 >   Rn{!},reglist{^ }

其中 , “模式” 为以下几种情况 :瞯 IA :先操作 ,后增加 。瞯 IB :先增加 ,后操作 。瞯 DA :先操作 ,后递减 。瞯 DB :先递减 ,后操作 。瞯 FD :满递减堆栈 。瞯 ED :空递减堆栈 。瞯 FA :满递增堆栈 。瞯 EA :空递增堆栈 。“模式” 为 IA 、 IB 、 DA 、 DB 时 , 称数据块传送指令 ; “模式” 为 FD 、 ED 、 FA 、

EA 时 ,称堆栈操作指令 。Rn为基址寄存器 ,装有传送数据的初始地址 , Rn不允许为 R15 。寄存器列表 reglist 可以为 16个可见寄存器 (R0 ~ R15) 的任意子集或全部 , 列表

中至少应有 1个寄存器 。当有多个寄存器时 , 可用 “ ,” 隔开或用 “ - ” 表示寄存器范围 ,如 {R1 ,R3 ,R5唱R7 ,R9} 。 列表中的寄存器次序是不重要的 , 因为这里有个约定 :

学出版社

职教技术出版中心

www.abook.cn

Page 86: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

76     嵌入式系统设计与开发 (第二版) 

编号低的寄存器在加载/存储时对应存储器的低地址 。 不过 , 一般的习惯是在寄存器列表中按递增的次序设定寄存器 。

{ !} 为可选后缀 ,若选用该后缀 ,则当数据传送完毕之后 ,将最后的地址写入基址寄存器 ,否则基址寄存器的内容不改变 。

{^ } 为可选后缀 ,不允许在用户模式或系统模式下使用 。当指令为 LDM 且寄存器列表中包含 R15 , 选用该后缀时表示 : 除了正常的数据传送之外 , 还将 SPSR 复制到CPSR ,这可用于异常处理返回 。同时 ,使用该后缀进行数据传送且寄存器列表不包含R15 (PC) 时 ,加载/存储的是用户模式下的寄存器 ,而不是当前模式下的寄存器 。

批量数据加载/存储指令 (LDM/STM) 依据其模式 (IA 、 IB 、 DA , DB) 的不同 ,寻址方式也有较大的不同 ,不同模式下的寻址方式如图 3畅 3所示 。

图 3畅3  批量数据加载/存储指令的寻址方式

数据块传送 (块拷贝) 指令如下 :        LDMIA R10,{R0,R1,R4}

STMDB R10,{R0,R1,R4}

图 3畅4  堆栈的形式

ARM 的堆栈操作通过批量数据加载/存储指令来完成 , 栈指针可以指向不同的位置 。栈指针指向栈顶元素 (即最后一个入栈的元素) 时 , 称为满栈 , 见图 3畅4 (a) 。 栈指针指向与栈顶元素相邻的一个可用数据单元时 ,称为空栈 ,见图 3畅 4 (b) 。 堆栈的增长方向也可以不同 。 当数据栈向内存地址减小的方向增长时 , 称为递减堆栈 , 见图 3畅4 ;反之 ,当数据栈向内存地址增加的方向增长时称为递增堆栈 。

Page 87: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              77     

综合这两种特点 ,可以有以下 4种数据栈 :瞯 FD 满递减堆栈 。瞯 ED 空递减堆栈 。瞯 FA 满递增堆栈 。瞯 EA 空递增堆栈 。它们与批量数据加载/存储指令的对应关系见表 3畅5 。

表 3畅5  块拷贝和堆栈指令对照表递   增 递   减

满 空 满 空

增值

先增S T M IBS T M FA

LDMIBLDMED

后增S T M IAS T MEA

LDM IALDM FD

减值

先减LDMDBLDMEA

S T MDBS T M FD

后减LDMDALDM FA

S T MDAS T MED

堆栈操作指令如下 :        STMFD   R13!,{R4唱R7,LR}   ;将寄存器列表中的寄存器内容存入堆栈

LDMFD   R13!,{R4唱R7,PC} ;将堆栈内容恢复到寄存器列表中

指令的执行过程如图 3畅5所示 (其中 old R13为操作前堆栈指针的位置) 。

图 3畅5  堆栈操作指令执行过程

注意 ,堆栈操作中总是要指定自动变址 ,否则以前保存的内容会因为堆栈寄存器的基址不变而在下一次堆栈操作时遭到破坏 。

3畅 存储器和寄存器交换指令

指令格式 :        SWP{cond}{B} Rd,Rm,[Rn]

学出版社

职教技术出版中心

www.abook.cn

Page 88: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

78     嵌入式系统设计与开发 (第二版) 

SWP指令将寄存器 Rn所指向的存储器中的字数据或字节数据 (SWPB) 传送到寄存器 Rd中 ,同时将寄存器 Rm 中的字数据或字节数据传送到寄存器 Rn 所指向的存储器中 。 Rd与 Rm 可以是同一寄存器 ,但两者应与 Rn 不同 。 Rd 与 Rm 为同一个寄存器时 ,指令交换该寄存器和存储器的内容 。当交换的是字节数据时 , Rd的高 24位清零 。

指令示例 :        SWP R0,R1,[R2]     ;将 R2所指向的存储器中的字数据传送到 R0,同时将

;R1中的字数据传送到 R2所指向的存储单元SWPB R0,R0,[R1] ;将 R1所指向的存储器中的字节数据与 R0中的低8位数据交换

3畅3畅4  程序状态寄存器与通用寄存器之间的传送指令

这类指令用于在程序状态寄存器 CPSR (或 SPSR) 和通用寄存器之间传送数据 ,包括以下两条 :

瞯 MRS :程序状态寄存器到通用寄存器的数据传送指令 。瞯 MSR :通用寄存器到程序状态寄存器的数据传送指令 。MRS和 MSR指令配合使用 ,可以更新状态寄存器 (PSR) , 达到设置条件码标志

位 、设置中断使能位和设置处理器模式的目的 (但不能用这种方法设置 T 位来进行状态切换 ,应该用 BX指令等完成程序状态的切换) 。

(1) MRS ———程序状态寄存器到通用寄存器的数据传送指令指令格式 :

        MRS{ < cond > } Rd,CPSRMRS{ < cond > } Rd,SPSR

指令 MRS { < cond > } Rd ,CPSR完成将当前程序状态寄存器 CPSR 的值传送到通用寄存器 Rd 中 。 指令 MRS { < cond > } Rd , SPSR 完成将备份的程序状态寄存器SPSR的值传送到通用寄存器 Rd中 。注意 , 在用户或系统模式下没有可访问的 SPSR ,所以这条指令在用户或系统模式下不能用 。

指令示例 :        MRS R0,CPSR       ;传送 CPSR的内容到 R0

MRS R0,SPSR       ;传送 SPSR的内容到 R0

(2) MSR ———通用寄存器到程序状态寄存器的数据传送指令指令格式 :

        MSR{cond} < psr> _ < fields> ,# immediateMSR{cond} < psr> _ < fields> ,Rm

其中 :瞯 < psr > :状态寄存器 CPSR或 SPSR 。瞯 < fields > :用于设置程序状态寄存器中需要操作的位 , 32位的程序状态寄存器可分为 4个域 。■ 位 [31 ∶ 24] :为条件标志位域 ,用 f表示 。■ 位 [23 : 16] :为状态位域 ,用 s表示 。

Page 89: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              79     

■ 位 [15 : 8] :为扩展位域 ,用 x 表示 。■ 位 [7 : 0] :为控制位域 ,用 c表示 。

瞯 immediate :将要传到状态寄存器中指定域的立即数 。瞯 Rm :包含将要传到状态寄存器中指定域的数据 。在用户模式下不能对 CPSR [23 ∶ 0] 做任何修改 , 在用户模式下所有位均可以被

读取 ,但只有条件标志位 (f) 可被写 。修改条件标志位 (f) 可以使用立即数方式 , 其他情况最好不用立即数方式 。

指令示例 :        MRS R0,CPSR   ;读取 CPSR

BIC R0,R0,# 0x1F ;修改 ,去除当前处理器模式ORR R0,R0,# 0x13 ;修改 ,设置特权模式MSR CPSR _ c,R0 ;写回 ,仅修改 CPSR中的控制位域

3畅3畅5  协处理器指令

ARM 支持协处理器操作 ,协处理器的控制要通过协处理器指令实现 。 ARM 体系支持 16个协处理器 。在程序执行的过程中 , 每个协处理器只执行针对自身的协处理器指令 ,忽略 ARM 处理器和其他协处理器的指令 。如果相应的协处理器不存在 , 将发生一个未定义指令异常 。

ARM 协处理器指令包括以下三类 :瞯 协处理器数据处理指令 CDP : 用于 ARM 处理器初始化 ARM 协处理器的数据处理操作 。

瞯 协处理器寄存器传送指令 MRC/MCR : 用于 ARM 寄存器和 ARM 协处理器寄存器间的数据传送 。

瞯 协处理器存储器传送指令 LDC/STC :用于 ARM 协处理器寄存器和内存单元间的数据传送 。

(1) 协处理器数据处理指令 CDP指令格式 :

        CDP{cond} coproc,opcode1,CRd,CRn,CRm{,opcode2}其中 :瞯 cond :可选的条件码 。瞯 coproc :指令操作的协处理器名 。标准名为 pn ,其中 n为 0 ~ 15范围内的整数 。瞯 opcode1 :协处理器的特定操作码 。瞯 CRd 、 CRn 、 CRm :协处理器寄存器 。瞯 opcode2 :可选的协处理器特定操作码 。指令示例 :

        CDP  p1,10,C1,C2,C3   ;协处理器 p1的操作初始化 .

(2) 协处理器寄存器传送指令 MRC/ MCR指令格式 :

学出版社

职教技术出版中心

www.abook.cn

Page 90: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

80     嵌入式系统设计与开发 (第二版) 

        MCR{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}MRC{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}

其中 :瞯 cond :可选的条件码 。瞯 coproc :指令操作的协处理器名 。标准名为 pn ,其中 n为 0 ~ 15范围内的整数 。瞯 opcode1 :协处理器的特定操作码 。瞯 Rd :源寄存器 ,不允许是 R15 。瞯 CRn 、 CRm :协处理器寄存器 。瞯 opcode2 :可选的协处理器特定操作码 。MCR指令用于将 ARM 处理器寄存器中的数据传送到协处理器寄存器中 , 若协处

理器不能成功完成操作 ,则产生未定义指令异常 。其中 ,协处理器操作码 1 (opcode1)和协处理器操作码 2 (opcode2) 为协处理器将要执行的操作 ,源寄存器为 ARM 处理器的寄存器 Rd ,目的寄存器 1 (CRn) 和目的寄存器 2 (CRm) 均为协处理器的寄存器 。

指令示例 :        MCR P3,3,R0,C4,C5,6     ;该指令将 ARM处理器寄存器 R0中的数据传送到协

;处理器 P3的寄存器中

MRC指令用于将协处理器寄存器中的数据传送到 ARM 处理器寄存器中 , 若协处理器不能成功完成操作 ,则产生未定义指令异常 。其中 ,协处理器操作码 1 (opcode1)和协处理器操作码 2 (opcode2) 为协处理器将要执行的操作 ,目的寄存器为 ARM 处理器的寄存器 ,源寄存器 1 (CRn) 和源寄存器 2 (CRm) 均为协处理器的寄存器 。

指令示例 :        MRC p15,5,R4,C0,C2,3   ;协处理器15中的寄存器 C0和 C2完成

;操作5(子操作3),然后将结果传到;ARM寄存器 R4中

(3) 协处理器存储器传送指令 LDC/ STC指令格式 :

        LDC{cond}{L} coproc,CRd,<地址 >STC{cond}{L} coproc,CRd,<地址 >

其中 :瞯 cond :可选的条件码 。瞯 L :可选后缀 ,指明是长整数传送 。瞯 coproc :指令操作的协处理器名 。标准名为 pn ,其中 n为 0 ~ 15范围内的整数 。瞯 CRd :用于加载或存储的协处理器寄存器 。瞯 <地址 > :指定的内存地址LDC指令用于将 “地址” 所指向的存储器中的字数据传送到目的寄存器 CRd 中 ,

若协处理器不能成功完成传送操作 ,则产生未定义指令异常 。指令示例 :

        LDC p6,CR1,[R4]   ;将 R4所指的存储器单元中的字数据取至协处理器

Page 91: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              81     

;p6的寄存器 CR1中LDC p6,CR4,[R2,# 4] ;将 R2 + 4所指的存储器单元中的字数据取至协处理器

;p6的寄存器 CR4中

STC指令用于将源寄存器中 CRd的字数据传送到 “地址” 所指向的存储器单元中 ,若协处理器不能成功完成传送操作 ,则产生未定义指令异常 。

指令示例 :        STC p8,CR8,[R2,# 4]!  ;将协处理器 ?p8寄存器 CR8中的内容存至存储器中

;R2 + 4所指向的存储器单元中 ,然后 ,R2 = R2 + 4STC p6,CR9,[R2],# 唱16 ;将协处理器 p6寄存器 CR9中的内容存至存储器中

;R2指向的存储器单元中 ,然后 ,R2 = R2唱16

3畅3畅6  异常中断产生指令

ARM 有两条异常中断产生指令 , 软件中断指令 SWI 用于产生 SWI 异常中断 ,ARM 正是通过这种机制实现在用户模式下对操作系统中特权模式的程序的调用 ; 断点中断指令 BKPT 在 ARMv5及以上的版本中引入 ,主要用于产生软件断点 ,供程序调试使用 。

(1) 软件中断指令 SWI指令格式 :

        SWI{cond} immed _ 24其中 , immed _ 24为表达式 ,其值为 24位正整数 。SWI指令用来执行系统调用 ,处理器进入管理模式 。指令中 24 位的立即数指定用

户程序调用系统例程的类型 ,相关参数通过通用寄存器传递 , 当指令中 24 位的立即数被忽略时 ,用户程序调用系统例程的类型由通用寄存器 R0 的内容决定 , 同时参数通过其他通用寄存器传递 。

指令示例 :        SWI 0x02       ;该指令调用操作系统编号位02的系统例程

(2) 断点中断指令 BKPT指令格式 :

        BKPT immed_ 16其中 , immed _ 16 为表达式 , 其值为范围在 0 ~ 65 535 内的正整数 (16 位正整

数) 。BKPT (BreaKPoinT) 指令引起处理器进入调试模式 。 调试工具可使用这一点在

指令到达特定的地址时查询系统状态 。指令示例 :

        BKPT0xF02C

学出版社

职教技术出版中心

www.abook.cn

Page 92: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

82     嵌入式系统设计与开发 (第二版) 

3畅4   Thumb指令集3畅4畅1   Thumb指令集概述

为兼容数据总线宽度为 16 位的应用系统 , ARM 体系结构除了支持执行效率很高的 32位 ARM 指令集以外 ,同时支持 16 位的 Thumb 指令集 。 Thumb 指令集是 ARM指令集的一个子集 ,是针对代码密度问题而提出的 , 它具有 16 位的代码宽度 。 与等价的 32位代码相比较 , Thumb指令集在保留 32 位代码优势的同时 , 大大的节省了系统的存储空间 。 Thumb不是一个完整的体系结构 ,不能指望处理器只执行 Thumb指令集而不支持 ARM 指令集 。

当处理器在执行 ARM 程序段时 ,称 ARM 处理器处于 ARM 工作状态 ; 当处理器在执行 Thumb程序段时 ,称 ARM 处理器处于 Thumb 工作状态 。 Thumb 指令集并没有改变 ARM 体系底层的编程模型 ,只是在该模型上增加了一些限制条件 , 只要遵循一定的调用规则 , Thumb子程序和 ARM 子程序就可以互相调用 。

与 ARM 指令集相比较 , Thumb指令集中的数据处理指令的操作数仍然是 32 位 ,指令地址也为 32位 ,但 Thumb指令集为实现 16 位的指令长度 , 舍弃了 ARM 指令集的一些特性 ,如大多数的 Thumb指令是无条件执行的 , 而几乎所有的 ARM 指令都是有条件执行的 ,大多数的 Thumb 数据处理指令采用 2 地址格式 。 由于 Thumb 指令的长度为 16位 ,即只用 ARM 指令一半的位数来实现同样的功能 , 所以 , 要实现特定的程序功能 ,所需的 Thumb指令的条数较 ARM 指令多 。在一般的情况下 , Thumb 指令集与 ARM 指令集的时间效率和空间效率关系为 :

瞯 Thumb代码所需的存储空间约为 ARM 代码的 60 % ~ 70 % 。瞯 Thumb代码使用的指令数比 ARM 代码多约 30 % ~ 40 % 。瞯 若使用 32位的存储器 , ARM 代码比 Thumb代码快约 40 % 。瞯 若使用 16位的存储器 , Thumb代码比 ARM 代码快约 40 % ~ 50 % 。瞯 与 ARM 代码相比较 ,使用 Thumb代码 ,存储器的功耗会降低约 30 % 。显然 , ARM 指令集和 Thumb 指令集各有其优点 , 若对系统的性能有较高要求 ,

应使用 32位的存储系统和 ARM 指令集 ; 若对系统的成本及功耗有较高要求 , 则应使用 16位的存储系统和 Thumb 指令集 。 当然 , 若两者结合使用 , 充分发挥其各自的优点 ,会取得更好的效果 。

Thumb指令集在以下几方面与 ARM 指令集存在区别 :瞯 跳转指令 。条件跳转在范围上有更多的限制 ,转向子程序只具有无条件转移 。瞯 数据处理指令 。对通用寄存器进行操作 , 操作结果需放入其中一个操作数寄存器 ,而不是第三个寄存器 。

瞯 单寄存器加载和存储指令 。 Thumb状态下 , 单寄存器加载和存储指令只能访问寄存器 R0 ~ R7 。

瞯 批量寄存器加载和存储指令 。 LDM 和 STM 指令可以将任何范围为 R0 ~ R7 的寄存器子集加载或存储 。 PUSH 和 POP指令使用堆栈指针 R13作为基址实现满

Page 93: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              83     

递减堆栈 ,除 R0 ~ R7外 , PUSH 指令还可以存储链接寄存器 R14 , 并且 POP指令可以加载程序指令 PC 。

瞯 Thumb指令集没有包含进行异常处理时需要的一些指令 , 因此在异常中断时还是需要使用 ARM 指令 。 这种限制决定了 Thumb 指令不能单独使用 , 需要与ARM 指令配合使用 。

3畅4畅2   Thumb 寄存器和 ARM寄存器之间的关系

Thumb寄存器在 ARM 寄存器上的映射如图 3畅6所示 。

图 3畅6   Thumb寄存器在 ARM寄存器上的映射

1畅 Thumb 状态寄存器集是 ARM 状态寄存器集的子集程序员可直接访问 8 个通用寄存器 R0 ~ R7 、 PC 、堆栈指针 SP 、链接寄存器 LR和

CPSR 。每个特权模式都有分组的 SP 、 LR和 SPSR 。

2畅 Thumb状态寄存器与 ARM 状态寄存器的关系Thumb状态寄存器与 ARM 状态寄存器有如下关系 。瞯 Thumb状态 R0 ~ R7与 ARM 状态 R0 ~ R7相同 。瞯 Thumb状态 CPSR和 SPSR与 ARM 状态 CPSR和 SPSR 相同 。瞯 Thumb状态 SP映射到 ARM 状态 R13 。

学出版社

职教技术出版中心

www.abook.cn

Page 94: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

84     嵌入式系统设计与开发 (第二版) 

瞯 Thumb状态 LR映射到 ARM 状态 R14 。瞯 Thumb状态 PC 映射到 ARM 状态 PC (R15) 。

3畅 在 Thumb状态中访问高寄存器在 Thumb状态中高寄存器 (寄存器 R0 ~ R7为低寄存器 ,寄存器 R8 ~ R15 为高寄

存器) 不是标准寄存器集的一部分 ,汇编语言程序员对它们的访问会受到限制 ,但可以将它们用于快速暂存 。

可以使用 MOV 指令的特殊变量将一个值从低寄存器 (R0 ~ R7) 转移到高寄存器(R8 ~ R15) ,或者从高寄存器转移到低寄存器 。 CMP 指令可用于比较高寄存器和低寄存器的值 。 ADD 指令可用于将高寄存器的值与低寄存器的值相加 。

3畅4畅3   Thumb指令分类介绍

Thumb指令集分为分支指令 、数据传送指令 、 单寄存器加载和存储指令以及多寄存器加载和存储指令 。 Thumb指令集没有协处理器指令 、信号量 (semaphore) 指令以及访问 CPSR或 SPSR的指令 。

1畅 存储器访问指令

(1) LDR和 STR ———立即数偏移加载寄存器和存储寄存器 。 存储器的地址以一个寄存器的立即数偏移 (immediate

offset) 指明 。指令格式 :

        op Rd,[Rn,# immed_ 5 × 4]opH Rd,[Rn,# immed _ 5 × 2]opB Rd,[Rn,# immed _ 5 × 1]

其中 :瞯 op :为 LDR或 STR 。瞯 H :指明无符号半字传送的参数 。瞯 B :指明无符号字节传送的参数 。瞯 Rd :加载和存储寄存器 。 Rd必须在 R0 ~ R7范围内 。瞯 Rn :基址寄存器 。 Rn必须在 R0 ~ R7范围内 。瞯 immed _ 5 × N : 偏移量 。 它是一个表达式 , 其取值 (在汇编时) 是 N 的倍数 ,在 (0 ~ 31) × N 范围内 , N = 4 、 2 、 1 。

瞯 STR :用于存储一个字 、半字或字节到存储器中 。瞯 LDR :用于从存储器加载一个字 、半字或字节 。瞯 Rn : Rn中的基址加上偏移形成操作数的地址 。立即数偏移的半字和字节加载是无符号的 。 数据加载到 Rd 的最低有效字或字节 ,

Rd 的其余位补 0 。字传送的地址必须可被 4整除 ,半字传送的地址必须可被 2整除 。

Page 95: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              85     

指令示例 :        LDR R3,[R5,# 0]

STRB R0,[R3,# 31]STRH R7,[R3,# 16]LDRB R2,[R4,# 1abel唱{PC}]

(2) LDR和 STR ———寄存器偏移加载寄存器和存储寄存器 。用一个寄存器的基于寄存器偏移指明存储器地址 。指令格式 :

        op Rd,[Rn,Rm]其中 , op 是下列情况之一 。瞯 LDR :加载寄存器 , 4字节字 。瞯 STR :存储寄存器 , 4字节字 。瞯 LDRH :加载寄存器 , 2字节无符号半字 。瞯 LDRSH :加载寄存器 , 2字节带符号半字 。瞯 STRH :存储寄存器 , 2字节半字 。瞯 LDRB :加载寄存器 ,无符号字节 。瞯 LDRSB :加载寄存器 ,带符号字节 。瞯 STRB :存储寄存器 ,字节 。瞯 Rm :内含偏移量的寄存器 , Rm 必须在 R0 ~ R7范围内 。带符号和无符号存储指令没有区别 。STR指令将 Rd中的一个字 、半字或字节存储到存储器 。LDR指令从存储器中将一个字 、半字或字节加载到 Rd 。Rn中的基址加上偏移量形成存储器的地址 。寄存器偏移的半字和字节加载可以是带符号或无符号的 。 数据加载到 Rd 的最低有

效字或字节 。对于无符号加载 , Rd的其余位补 0 ;对于带符号加载 , Rd的其余位复制符号位 。字传送地址必须可被 4整除 ,半字传送地址必须可被 2整除 。

指令示例 :        LDR R2,[Rl,R5]

LDRSH R0,[R0,R6]STRB Rl,[R7,R0]

(3) LDR和 STR ——— PC或 SP相对偏移加载寄存器和存储寄存器 。 用 PC 或 SP 中值的立即数偏移指明存储器中的地址 。

没有 PC相对偏移的 STR指令 。指令格式 :

        LDR Rd,[PC,# immed _ 8 × 4]LDR Rd,[labelLDR Rd,[[SP,# immed _ 8 × 4]STR Rd,[SP,# immed _ 8 × 4]

其中 ,

学出版社

职教技术出版中心

www.abook.cn

Page 96: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

86     嵌入式系统设计与开发 (第二版) 

瞯 immed _ 8 × 4 : 偏移量 。 它是一个表达式 , 取值 (在汇编时) 为 4 的整数倍 ,范围在 0 ~ 1020之间 。

瞯 label :程序相对偏移表达式 。 label必须在当前指令之后且 1KB范围内 。瞯 STR :将一个字存储到存储器 。瞯 LDR :从存储器中加载一个字 。PC或 SP的基址加上偏移量形成存储器地址 。 PC 的位 [1] 被忽略 , 这确保了地

址是字对准的 。字或半字传送的地址必须是 4的整数倍 。指令示例 :

        LDR R2,[PC,# 1016]LDR R5,localdataLDR R0,[SP,# 920]STR Rl,[SP,# 20]

(4) PUSH 和 POP低寄存器和可选的 LR进栈 ,以及低寄存器和可选的 PC 出栈 。指令格式 :

        PUSH{reglist}POP {reglist}PUSH{reglist,LR}POP {reglist,PC}

其中 reglist 表示低寄存器的全部或其子集 。括号是指令格式的一部分 ,它们不代表指令列表可选 , 列表中至少有 1 个寄存器 。

Thumb堆栈是满递减堆栈 ,堆栈向下增长 ,且 SP指向堆栈的最后入口 。寄存器以数字顺序存储在堆栈中 。最低数字的寄存器存储在最低地址处 。

POP {reglist ,PC} 这条指令引起处理器转移到从堆栈弹出给 PC的地址 ,这通常是从子程序返回 ,其中 LR在子程序开头压进堆栈 。这些指令不影响条件码标志 。

指令示例 :        PUSH{R0,R3,R5}

PUSH{R1,R4唱R7}PUSH{R0,LR}POP {R2,R5}POP {R0唱R7,PC}

(5) LDMIA 和 STMIA加载和存储多个寄存器 。指令格式 :

        op Rn! ,{reglist}其中 , op为 LDMIA 或 STMIA 。reglist 为低寄存器或低寄存器范围的 、用逗号隔开的列表 。括号是指令格式的一部

分 ,它们不代表指令列表可选 ,列表中至少应有 1个寄存器 。寄存器以数字顺序加载或存储 。最低数字的寄存器在 Rn的初始地址中 。

Page 97: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              87     

Rn的值以 reglist 中寄存器个数的 4倍增加 。若 Rn在寄存器列表中 ,则 :瞯 对于 LDMIA 指令 , Rn的最终值是加载的值 ,不是增加后的地址 。瞯 对于 STMIA 指令 , Rn存储的值有两种情况 , 若 Rn 是寄存器列表中最低数字的寄存器 ,则 Rn存储的值为 Rn 的初值 ; 其他情况则不可预知 。 当然 , reglist中最好不包括 Rn 。

指令示例 :        LDMIA R3!,{R0,R4}

LDMIA R5!,{R0 ~ R7}STMIA R0!,{R6,R7}STMIA R3!,{R3,R5,R7}

2畅 数据处理指令

(1) ADD和 SUB ———低寄存器加法和减法 。对于低寄存器操作 ,这两条指令各有如下 3种形式 。瞯 两个寄存器的内容相加或相减 ,结果放到第 3个寄存器中 。瞯 寄存器中的值加上或减去一个小整数 ,结果放到另一个不同的寄存器中 。瞯 寄存器中的值加上或减去一个大整数 ,结果放回同一个寄存器中 。指令格式 :

        op Rd,Rn,Rmop Rd,Rn,# expr3op Rd,# expr8

其中 ,瞯 op为 ADD或 SUB 。瞯 Rd :目的寄存器 。它也用作 “op Rd , # expr8” 的第 1个操作数 。瞯 Rn :第一操作数寄存器 。瞯 Rm :第二操作数寄存器 。瞯 expr3 :表达式 ,为取值在 - 7 ~ + 7范围内的整数 (3位立即数) 。瞯 expr8 :表达式 ,为取值在 - 255 ~ + 255范围内的整数 (8位立即数) 。“op Rd ,Rn ,Rm” 执行 Rn + Rm 或 Rn - Rm 操作 ,结果放在 Rd中 。“op Rd ,Rn ,# expr3” 执行 Rn + expr3或 Rn唱expr3操作 ,结果放在 Rd中 。“op Rd ,# expr8” 执行 Rd + expr8或 Rd唱expr8操作 ,结果放在 Rd中 。expr3或 expr8为负值的 ADD指令汇编成相对应的带正数常量的 SUB指令 。 expr3

或 expr8为负值的 SUB指令汇编成相对应的带正数常量的 ADD指令 。Rd 、 Rn和 Rm 必须是低寄存器 (R0 ~ R7) 。这些指令更新标志 N 、 Z 、 C 和 V 。指令示例 :

        ADD R3,Rl,R5SUB R0,R4,# 5

学出版社

职教技术出版中心

www.abook.cn

Page 98: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

88     嵌入式系统设计与开发 (第二版) 

ADD R7,# 201

(2) ADD ———高或低寄存器将寄存器中值相加 ,结果送回到第一操作数寄存器 。指令格式 :

        ADD Rd,Rm其中 :瞯 Rd :目的寄存器 ,也是第一操作数寄存器 。瞯 Rm :第二操作数寄存器 。这条指令将 Rd和 Rm中的值相加 ,结果放在 Rd中 。当 Rd和 Rm 都是低寄存器时 , 指令 “ADD Rd ,Rm” 汇编成指令 “ADD Rd ,Rd ,

Rm” 。若 Rd和 Rm 是低寄存器 , 则更新条件码标志 N 、 Z 、 C 和 V ; 其他情况下这些标志不受影响 。

指令示例 :        ADD R12,R4

(3) ADD和 SUB ——— SPSP加上或减去立即数常量 。指令格式 :

        ADD SP,# exprSUB SP,# expr

其中 , expr 为表达式 ,取值 (在汇编时) 为在 - 508 ~ 508范围内的 4的整倍数 。该指令把 expr 的值加到 SP 的值上或用 SP的值减去 expr 的值 ,结果放到 SP中 。expr 为负值的 ADD指令汇编成相对应的带正数常量的 SUB 指令 。 expr 为负值的

SUB指令汇编成相对应的带正数常量的 ADD指令 。这条指令不影响条件码标志 。指令示例 :

        ADD SP,# 32SUB SP,# 96

(4) ADD ——— PC 或 SP相对偏移SP或 PC值加一立即数常量 ,结果放入低寄存器 。指令格式 :

        ADD Rd,Rp,# expr其中 :瞯 Rd :目的寄存器 。 Rd必须在 R0 ~ R7范围内 。瞯 Rp : SP 或 PC 。瞯 expr :表达式 ,取值 (汇编时) 为在 0 ~ 1020范围内的 4的整倍数 。这条指令把 expr 加到 Rp的值中 ,结果放入 Rd 。若 Rp是 PC ,则使用值是 (当前指令地址 + 4) AND & FFFFFFC , 即忽略地址的

低 2位 。

Page 99: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              89     

这条指令不影响条件码标志 。指令示例 :

        ADD R6,SP,# 64ADD R2,PC,# 980

(5) ADC 、 SBC和 MUL带进位的加法 、带进位的减法和乘法 。指令格式 :

        op Rd,Rm其中 :瞯 op为 ADC 、 SBC或 MUL 。瞯 Rd :目的寄存器 ,也是第一操作数寄存器 。瞯 Rm :第二操作数寄存器 , Rd 、 Rm 必须是低寄存器 。ADC将带进位标志的 Rd和 Rm 的值相加 ,结果放在 Rd中 , 用这条指令可组合成

多字加法 。SBC考虑进位标志 ,从 Rd值中减去 Rm 的值 , 结果放入 Rd 中 , 用这条指令可组

合成多字减法 。MUL 进行 Rd和 Rm 值的乘法 ,结果放入 Rd 中 。Rd和 Rm 必须是低寄存器 (R0 ~ R7) 。ADC和 SBC 更新标志 N 、 Z 、 C和 V 。 MUL 更新标志 N 和 Z 。在 ARMv4及以前版本中 , MUL 会使标志 C和 V 不可靠 。 在 ARMv5 及以后版本

中 , MUL 不影响标志 C 和 V 。指令示例 :

        ADC R2,R4SBC R0,R1MUL R7,R6

(6) AND 、 ORR 、 EOR和 BIC ———按位逻辑操作指令格式 :

        op Rd,Rm其中 :瞯 op为 AND 、 ORR 、 EOR或 BIC 。瞯 Rd :目的寄存器 ,它也包含第一操作数 , Rd必须在 R0 ~ R7范围内 。瞯 Rm :第二操作数寄存器 , Rm 必须在 R0 ~ R7范围内 。这些指令用于对 Rd和 Rm 中的值进行按位逻辑操作 ,结果放在 Rd 中 ,操作如下 。瞯 AND :进行逻辑 “与” 操作 。瞯 ORR :进行逻辑 “或” 操作 。瞯 EOR :进行逻辑 “异或” 操作 。瞯 BIC :进行 “Rd AND NOT Rm” 操作 。这些指令根据结果更新标志 N 和 Z 。

学出版社

职教技术出版中心

www.abook.cn

Page 100: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

90     嵌入式系统设计与开发 (第二版) 

指令示例 :        AND R1,R2

ORR  R0,R1EOR  R5,R6BIC  R7,R6

(7) ASR 、 LSL 、 LSR和 ROR ———移位和循环移位操作Thumb指令集中 ,移位和循环移位操作作为独立的指令使用 ,这些指令可使用寄

存器中的值或立即数移位量 。指令格式 :

        op Rd,Rsop Rd,Rm,# expr

其中 :瞯 op是下列之一 。

■ ASR :算术右移 ,将寄存器中的内容看作补码形式的带符号整数 。 将符号位复制到空出位 。

■ LSL :逻辑左移 ,空出位填零 。■ LSR :逻辑右移 ,空出位填零 。■ ROR :循环右移 ,将寄存器右端移出的位循环移回到左端 。 ROR 仅能与寄存

器控制的移位一起使用 。瞯 Rd :目的寄存器 ,它也是寄存器控制移位的源寄存器 。 Rd 必须在 R0 ~ R7 范围内 。

瞯 Rs :包含移位量的寄存器 , Rs必须在 R0 ~ R7范围内 。瞯 Rm :立即数移位的源寄存器 , Rm必须在 R0 ~ R7范围内 。瞯 expr :立即数移位量 , 它是一个取值 (在汇编时) 为整数的表达式 。 若 op 是LSL ,则整数的范围为 0 ~ 31 ;其他情况则为 1 ~ 32 。

对于除 ROR以外的所有指令 ,若移位量为 32 ,则 Rd 清零 , 最后移出的位保留在标志 C 中 ;若移位量大于 32 ,则 Rd和标志 C 均被清零 。

这些指令根据结果更新标志 N 和 Z , 且不影响标志 V 。 对于标志 C , 若移位量是零 ,则不受影响 。其他情况下 ,它包含源寄存器的最后移出位 。

指令示例 :        ASR R3,R5

LSR R0,R2,# 16   ;将 R2的内容逻辑右移16次后 ,结果放入 R0中LSR R5,R5,av

(8) CMP和 CMN ———比较指令指令格式 :

        CMP Rn,# exprCMP Rn,RmCMN Rn,Rm

其中 :

Page 101: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              91     

瞯 Rn :第一操作数寄存器 。瞯 expr :表达式 ,其值 (在汇编时) 为在 0 ~ 255范围内的整数 。瞯 Rm :第二操作数寄存器 。CMP指令从 Rn的值中减去 expr 或 Rm 的值 , CMN 指令将 Rm 和 Rn 的值相加 。

这些指令根据结果更新标志 N 、 Z 、 C和 V ,但不向寄存器中存放结果 。对于 “CMP Rn ,# expr” 和 CMN 指令 , Rn和 Rm 必须在 R0 ~ R7范围内 。对于 “CMP Rn ,Rm” 指令 , Rn和 Rm 可以是 R0 ~ R15中的任何寄存器 。指令示例 :

        CMP R2,# 255CMP R7,R12CMN Rl,R5

(9) MOV 、 MVN 和 NEG ——— 传送 、传送非和取负指令格式 :

        MOV Rd,# exprMOV Rd,RmMVN Rd,RmNEG Rd,Rm

其中 :瞯 Rd :目的寄存器 。瞯 expr :表达式 ,其取值为在 0 ~ 255范围内的整数 。瞯 Rm :源寄存器 。MOV 指令将 # expr 或 Rm 的值放入 Rd 。 MVN 指令从 Rm 中取值 ,然后对该值进

行按位逻辑 “非” 操作 ,结果放入 Rd 。 NEG 指令取 Rm 的值再乘以唱1 ,结果放入 Rd 。对于 “MOV Rd ,# expr” 、 MVN 和 NEG 指令 , Rd和 Rm 必须在 R0 ~ R7范围内 。对于指令 “MOV Rd ,Rm” , Rd和 Rm 可以是寄存器 R0 ~ R15中的任意一个 。“MOV Rd ,# expr” 和 MVN 指令更新标志 N 和 Z , 对标志 C 或 V 无影响 。 NEG

指令更新标志 N 、 Z 、 C 和 V 。 指令 “MOV Rd ,Rm” 中 , 若 Rd 或 Rm 是高寄存器(R8 ~ R18) ,则标志不受影响 ;若 Rd 和 Rm 都是低寄存器 (R0 ~ R7) , 则更新标志 N和 Z ,且清除标志 C和 V 。

指令示例 :        MOV R3,# 0

MOV R0,R12MVN R7,R1NEG R2,R2

(10) TST ———测试位指令格式 :

        TST Rn,Rm其中 ,瞯 Rn :第一操作数寄存器 。

学出版社

职教技术出版中心

www.abook.cn

Page 102: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

92     嵌入式系统设计与开发 (第二版) 

瞯 Rm :第二操作数寄存器 。TST 对 Rm 和 Rn中的值进行按位 “与” 操作 ,但不把结果放入寄存器 。该指令根

据结果更新标志 N 和 Z ,标志 C和 V 不受影响 。 Rn和 Rm 必须在 R0 ~ R7范围内 。指令示例 :

        TST R2,R4

3畅 分支指令

(1) 分支 B指令这是 Thumb指令集中唯一的有条件指令 。指令格式 :

        B{cond} label其中 , label是程序相对偏移表达式 ,通常是在同一代码块内的标号 。若使用 cond ,

则 label必须在当前指令的 - 256 ~ + 256 字节范围内 。 若指令是无条件的 , 则 label 必须在 ± 2KB范围内 。若 cond满足或不使用 cond ,则 B指令引起处理器转移到 label 。

label必须在指定限制内 。 ARM 链接器不能增加代码来产生更长的转移 。指令示例 :

        B dloopBEG sectB

(2) 带链接的长分支 BL 指令指令格式 :

        BL label其中 , 1abel为程序相对转移表达式 。 BL 指令将下一条指令的地址复制到 R14 (链

接寄存器) ,并引起处理器转移到 1abel 。BL 指令不能转移到当前指令 ± 4MB 以外的地址 。 必要时 , ARM 链接器插入代码

以允许更长的转移 。指令示例 :

        BL extract(3) 分支 ,并可选地切换指令集 BX指令格式 :

        BX   Rm

其中 , Rm 装有分支目的地址的 ARM 寄存器 。 Rm 的位 [0] 不用于地址部分 。 若Rm 的位 [0] 清零 ,则位 [1] 也必须清零 ,指令清除 CPSR 中的标志 T , 目的地址的代码被解释为 ARM 代码 , BX 指令引起处理器转移到 Rm 存储的地址 。 若 Rm 的位[0] 置位 ,则指令集切换到 Thumb状态 。

指令示例 :        BX   R5

(4) 带链接分支 ,并可选地交换指令集 BLX指令格式 :

Page 103: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

第 3章   ARM 指 令 集              93     

        BLX  RmBLX   label

其中 , Rm 装有分支目的地址的 ARM 寄存器 。 Rm 的位 [0] 不用于地址部分 。 若Rm 的位 [0] 清零 ,则位 [1] 必须也清零 ,指令清除 CPSR 中的标志 T , 目的地址的代码被解释为 ARM 代码 。 Label为程序相对偏移表达式 , “BLX label” 始终引起处理器切换到 ARM 状态 。

BLX指令可用于 :瞯 复制下一条指令的地址到 R14 。瞯 引起处理器转移到 label或 Rm 存储的地址 。瞯 如果 Rm 的位 [0] 清零 , 或使用 “BLX   label” 形式 , 则指令集切换到 ARM

状态 。指令不能转移到当前指令 ± 4MB范围以外的地址 。必要时 , ARM 链接器插入代码

以允许更长的转移 。指令示例 :

        BLX   R6BLX  armsub

4畅 中断和断点指令

(1) SWI ———软件中断指令指令格式 :

        SWI immed_ 8其中 , immed _ 8为数字表达式 ,其取值为 0 ~ 255范围内的整数 。SWI指令引起 SWI异常 。这意味着处理器状态切换到 ARM 态 , 处理器模式切换

到管理模式 , CPSR保存到管理模式的 SPSR中 ,执行转移到 SWI向量地址 。处理器忽略 immed _ 8 ,但 immed _ 8出现在指令操作码的位 [7 ∶ 0] 中 , 而异常处理程序用它来确定正在请求何种服务 ,这条指令不影响条件码标志 。

指令示例 :        SWI 12

(2) BKPT ——— 断点指令指令格式 :

        BKPT immed_ 8其中 , immed _ 8为数字表达式 ,取值为 0 ~ 255范围内的整数 。BKPT 指令引起处理器进入调试模式 。调试工具利用这一点来查询到达特定地址的

指令时的系统状态 。尽管 immed _ 8 出现在指令操作码的位 [7 ∶ 0] 中 , 处理器忽略immed _ 8 。调试器用它来保存有关断点的附加信息 。

指令示例 :        BKPT67

学出版社

职教技术出版中心

www.abook.cn

Page 104: LeYb g/QúrHN- Ã yÑ[fQúrHy>  · 嵌入式系统设计与开发(第二版) 第3章详细介绍ARM体系的指令系统和寻址方式。 Thumb指令集是ARM指令集 的子集,本章对Thumb指令集及其与ARM指令集的区别也做了简要介绍。

94     嵌入式系统设计与开发 (第二版) 

本 章 要 点

瞯 ARM 体系具有 ARM 和 Thumb两种指令集 , ARM 指令长度为 32 位 , Thumb指令长度是 16位 。

瞯 ARM 指令集主要包括数据处理指令 、分支指令 、存储器访问指令 、程序状态寄存器处理指令 、协处理器指令和异常中断产生指令等 。 Thumb 指令集分为分支指令 、数据传送指令 、单寄存器加载和存储指令以及多寄存器加载和存储指令 。

瞯 ARM 处理器常用的寻址方式有 :立即寻址 、寄存器寻址 、寄存器间接寻址 、 寄存器移位寻址 、基址变址寻址 、多寄存器寻址 、 堆栈寻址 、 块拷贝寻址和相对寻址 。

习    题

1畅 举例说明 ARM 的各种寻址方式 。2畅R0和 R1中有两个 32位数 , 若 R0 > R1 ,则 R0 = R0唱R1 ; 若 R0 < R1 , 则 R1 =

R1唱R0 ;若 R0 = R1 ,则 R1 、 R0保持不变 。1) 请用 CMP 、 B和 SUB指令完成上述操作 。2) 请用条件 SUB指令完成上述操作 。3畅 用合适的指令实现以下功能 。1) R0 = 16 2) R1 = R0 × 43) R0 = R1/16 4) R1 = R2 × 74畅 说明下列指令的功能 。1) ADDS R0 , R1 , R1 , LSL # 22) RSB R2 , R1 , # 05畅 下列指令序列完成什么功能 ?ADD R0 , R1 , R1 , LSL # 1SUB R0 , R0 , R1 , LSL # 4ADD R0 , R0 , R1 , LSL # 7