type
status
date
slug
summary
tags
category
icon
password

2.1 ARM 处理器简介

2.1.1 ARM的3种含义

  • 它是一个公司的名称
  • 还是一种技术的名称
  • 是一类微处理器的通称

2.1.2 ARM的背景

基于 ARM技术 的微处理器应用约占据了 32位RISC微处理器 80% 以上的市场份额,其中,在手机市场,ARM 占有绝对的垄断地位
ARM公司 是专门从事基于 RISC 技术芯片开发的公司,作为嵌入式 RISC 处理器的知识产权 IP 供应商。
使用 ARM 公司硬件技术授权的公司有:Intel、IBM、SAMSUNG 、LG半导体、NEC、SONY、PHILIP、华为等几十多家企业和公司。至于软件系统的合伙人,则包括Microsoft、SUN和MRI等一系列知名公司。其合作伙伴超过超过200家。
ARM公司与芯片厂商的关系
notion image

2.1.3 ARM微处理器特点(*)

  • 体积小、功耗低、低成本、高性能;
  • 支持 Thumb(16位)/ARM(32位)双指令集,能很好地兼容 8位/16位 器件;
  • 大量使用寄存器,指令执行速度更快;
  • 大多数数据操作都在寄存器中完成;
  • 寻址方式灵活简单,执行效率高;
  • 指令长度固定(因为是精简指令系统)

2.1.4 ARM处理器应用领域

  • 工业控制领域;
  • 无线通讯领域;
  • 消费类电子产品;
  • 成像和安全产品。

2.2 ARM 处理器系列

目前常用基于ARM核的处理器有以下几类:ARM7系列、ARM9系列、ARM9E系列、ARM10E系列、ARM11系列 、SecurCore微处理器系列、Coretex等。

2.2.1 ARM指令集体系结构的演变(-)

2.2.1.1 ARM指令集体系结构演变概述

ARM公司定义了不同版本的ARM指令集体系结构版本,用vn来标识(n是版本号,目前是1-8)。
ARM v1~v3版本的处理器未得到大量应用,ARM处理器的大量广泛应用是从其v4版本开始的。
v7系列CPU被称作CoreTex系列(这里应该是指使用v7指令体系结构的CPU)
到目前v8是最新的版本, 可以选择64或32执行状态。64执行状态针对64位处理技术,引入了一个全新指令集A64,可以存取大虚拟地址空间。

2.2.1.2 ARMv4

  • ARMv4相关信息:ARMv4是目前支持的最老的架构,是基于32-bit地址空间的32-bit指令集。
  • ARMv4除了支持ARMv3的指令外还扩展了:
    • 支持halfword的存取
    • 支持byte和halfword的符号扩展读
    • 进一步的明确了会引起Undefined异常的指令
    • 对以前的26bits体系结构的CPU不再兼容

2.2.1.3 ARMv4T

  • ARMv4T相关信息(‘T’表示支持Thumb)
  • ARMv4T增加了16-bit Thumb 指令集(ARMv4T中的T就是Thumb),这样使得编译器能产生紧凑代码(相对于32-bit代码,内存能节省到35%以上)并保持32-bit系统的好处。
    • Thumb在处理器中仍然要扩展为标准的32位ARM指令来运行(意思是执行的时候要扩展,但是在存储器中就是16位的)。用户采用16位Thumb指令集最大的好处就是可以获得更高的代码密度和降低功耗。

2.2.1.4 ARMv5TE

  • ARMv5TE相关信息(‘E’扩展表示在通用的CPU上提供DSP能力)
  • 1999年推出ARMv5TE其增强了Thumb体系,增强的Thumb体系增加了新的指令,同时改进了Thumb/ARM相互作用、编译能力和混合及匹配ARM与Thumb例程,以更好地平衡代码空间和性能,并在ARM指令集体系结构上扩展了增强的DSP 指令集:增强的DSP指令包括支持饱和算术(saturated arithmetic), 并且针对Audio DSP应用提高了70%性能。

2.2.1.5 ARMv5TEJ

  • ARMv5TEJ相关信息(‘J’表示支持Java加速技术)
  • 2000年推出ARMv5TEJ,增加了Jazelle扩展以支持Java加速技术(处理器指令层对JAVA加速)。
    • Jazelle技术比仅仅基于软件的JVM性能提高近8倍的性能减少了80%的功耗。

2.2.1.6 ARMv6

  • ARMv6相关信息
  • 2001年推出ARMv6,它在许多方面做了改进如内存系统、异常处理和较好地支持多处理器。
    • SIMD扩展使得广大的软件应用如Video和Audio codec的性能提高了4倍。
      Thumb-2和TrustZone 技术也用于ARMv6中。
      ARMv6第一个实现是2002年春推出的ARM1136J(F)-STM处理器,2003年又推出了 ARM1156T2(F)-S 和ARM1176JZ(F)-S处理器。

2.2.1.7 ARMv7

  • ARMv7相关信息(也就是CoreTex)
  • 所有ARMv7 profiles实现Thumb-2技术。同时还包括了NEON™技术的扩展提高DSP和多媒体处理吞吐量400% ,并提供浮点支持以满足下一代3D图形和游戏以及传统嵌入式控制应用的需要。
  • ARMv7定义了3种不同的处理器配置(processor profiles):
    • Profile A是面向复杂、基于虚拟内存的OS和应用的(CoreTex A)
    • Profile R是针对实时系统的(CoreTex R)
    • Profile M是针对低成本应用的优化的微控制器的。(CoreTex M)

2.2.1.8 ARMv8

  • ARMv8
  • 2011年11月,ARM公司发布了新一代处理器架构ARM V8,ARM的首个64位架构
    • 在继承了v7架构的基础上,可以选择64或32执行状态。64执行状态针对64位处理技术,引入了一个全新指令集A64,可以存取大虚拟地址空间;
      运用ARMv8指令集的产品:
      ARM 2012年十月发布了Cortex-A53 and Cortex-A57 核心。2013年苹果基于V8架构的Apple 7使用在了iPhone 5S上。

2.2.1.9 ARM处理器和指令集构架版本的对应关系

也就是ARMN与ARMvN的对应关系。或者说是ARM指令系统版本ARM系列的对应关系。更通俗的说,就是某个系列的ARM使用了哪种指令系统
notion image

2.2.1.10 ARM/Thumb的命名规范

从上面的演变过程中其实也介绍了一点ARM指令系统版本的命名规则。这里更系统地去介绍一下命名规则:
  • 以ARMv开头
  • ARM指令集的版本号(1-8)
  • 可变功能标识(T—表示支持Thumb指令,M---表示支持乘法指令,E — 增强型DSP指令,J — Java加速器Jazelle,SIMD — ARM媒体功能扩展),但是ARMv4和其上的版本缺省都支持M功能,因此ARMv4和其上的版本的标识中可以不用标识M.
  • 如果3中描述的功能不存在,则在该功能标识符前加x 。例如,ARMv5TxM 表示 ARM 指令集版本为 5,支持 T 变种,不支持 M 变种。

2.2.1.11 ARM处理器命名(*)

需要注意的是这里就是指ARM系列的命名了
  • 规则:ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
    • x -- 处理器系列
    • y -- 存储管理/保护单元
    • z -- cache
    • T -- 支持Thumb指令集
    • D -- 支持片上调试
    • M -- 支持快速乘法器
    • I -- 支持Embedded ICE,支持嵌入式跟踪调试
    • E -- 支持增强型DSP指令
    • J -- 支持Jazelle
    • F -- 具备向量浮点单元VFP
    • S -- 可综合版本
  • 可以发现这里的后缀大部分跟上面的按照指令系统命名的ARM是一样的
如:
notion image

2.2.1.12 ARM处理器指令集的特点(*)

ARM内核不是一个纯粹的RISC体系结构,ARM指令集与纯粹的RISC的定义有以下几个不同。
  • 一些特定指令的周期数可变,并不是每条ARM指令都是单周期的。
  • 内嵌的桶形移位器产生了更为复杂的指令,扩展了指令的功能,因此改善了内核的性能。
  • 支持16位的Thumb指令集,提高了代码密度。
  • 支持条件执行:每条指令都可以设置一个执行条件,只有条件满足时才执行。
  • 增强指令:一些功能强大的数字信号处理指令被加入到ARM指令集中。

2.2.2 ARM体系结构的演变

2.2.2.1 ARM7系列

  • ARM7相关信息
  • ARM7系列微处理器为低功耗32位RISC处理器,最适合用于对价格和功耗要求较高的应用领域。
    • ARM7 系列包括:ARM7TDMI、ARM7TDMI-S、带有高速缓存处理宏单元的ARM720T 和 扩充了jazelle的ARM7EJ-S。
      ARM7部分处理器相关功能信息如下图:
      notion image
      需要注意的是这里的命名好像并不是完整的,如ARM7EJ-S没有T,但是支持Thumb指令集
  • ARM7系列微处理器特点
    • 具有嵌入式ICE JTAG 软件调试方式,调试开发方便
    • 极低的功耗,适合对功耗要求较高的应用,如便携式产品
    • 能够提供0.9MIPS/MHZ的三级流水线结构(取指、译码、执行)
    • 代码密度高并兼容16位的Thumb指令集
    • 指令系统与ARM9、ARM9E和ARM10E系列兼容,便于用户产品的升级换代
    • 主频最高可达130MIPS,高速的运算处理能力能胜任绝大多数的复杂应用。

2.2.2.2 ARM9系列

  • ARM9相关信息
  • 1997年问世,采用5级指令流水线存储器系统根据哈弗体系结构(程序和数据空间独立的体系结构)重新设计,区分了数据总线和指令总线。
    • ARM9系列的第一个处理器是ARM920T,它包含独立的数据指令Cache和MMU。(cortex M不支持MMU是因为他是MCU)
      该处理器能够用在要求有虚拟存储器支持的操作系统上。该系列中的 ARM922T是ARM920T的变种,只有一半大小的数据指令Cache。
      ARM940T 包含一个更小的数据指令Cache 和一个MPU(Micro Processor Unit)。它是针对不要求运行操作系统的应用而设计的。ARM920T、ARM940T都执行v4T架构指令。
      ARM9部分处理器相关功能信息如下表:
      notion image
  • ARM9系列微处理器特点
    • 5级整数流水线取指、译码、执行、缓冲/数据、回写),指令执行效率高;
    • 基于嵌入式ICE JTAG 的软件调试方式,调试开发方便;
    • 提供1.1MIPS/MHZ的哈佛结构
    • 支持32位ARM指令集和16位Thumb指令集;
    • 支持32位的高速AMBA总线接口;
    • 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统;
    • MPU支持实时操作系统;
    • 支持数据Cahe 和指令Cache,具有更高的指令和数据处理器能力。
  • ARM9应用场景:仪器仪表、安全系统、引擎管理、机顶盒、高端打印机、PDA、网络电脑以及带有MP3音频和MPEG4视频多媒体格式的智能电话中。

2.2.2.3 ARM9E

  • ARM9E相关信息
  • ARM9E 系列微处理器为综合处理器,使用单一的处理器内核,提供了微控制器、DSP、java应用系统解决方案,极大地减少了芯片的面积和系统的复杂程度。ARM9E系列包括ARM926EJ-S、ARM946E-S、ARM966E-S和ARM968E-S等
    • ARM9E部分处理器相关功能如下:
      notion image
  • ARM9E系列微处理器特点
    • 支持DSP指令集,适合于需要高速数字信号处理的场合
    • 具有嵌入式ICE-RT逻辑,更好地适应实时系统开发
    • 5级整数流水线,指令执行效率高
    • 支持32位ARM指令集和16位Thumb指令集
    • 支持32位的高速AMBA总线接口
    • 支持VFP9浮点处理协处理器
    • 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统;
    • MPU支持实时操作系统;
    • 支持数据Cache和指令Cache,具有更高的指令和数据处理能力;
    • 主频最高可达300MIPS
  • ARM9E应用场景
    • 下一代无线设备,包括视频电话和PDA;
    • 数字消费品,包括:机顶盒、家庭网关、MP3播放器和MPEG-4播放器;
    • 成像设备,包括:打印机、数码照相机 和 数码摄像机;
    • 存储设备,包括 DVD 或 HDD 等;
    • 工业控制,包括电机控制等;
    • 汽车、通信和信息系统的 ABS 和 车体控制;
    • 网络设备,包括:VoIP、WirelessLAN等。

2.2.2.4 ARM10E

  • ARM10E相关信息
  • ARM10E 系列微处理器由于采用了新的体系结构,与同等的 ARM9 器件相比较,在同样的时钟频率下,性能提高了近 50% ,同时还采用了两种先进的节能方式,使其功耗极低。ARM10E 系列包括ARM1020E、 ARM1022E 和 ARM1026EJ-S三种类型。
    • ARM10E部分处理器相关功能如下:
      notion image
  • ARM10E系列微处理器特点
    • 支持DSP指令集,适合于需要高速数字信号处理的场合
    • 6级整数流水线,指令执行效率更高
    • 支持32位的ARM指令和16位的Thumb指令
    • 支持32位的高速AMBA总线接口
    • 支持VFP10浮点处理协处理器
    • 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统;
    • 支持数据Cache和指令Cache,具有更高的指令和数据处理能力;
    • 主频最高可达400MIPS;(MIPS是每秒百万条指令的意思,在精简指令集中与主频相同,因为精简指令集一个周期一条指令)
    • 内嵌并行读/写操作部件。

2.2.2.5 ARM11

  • ARM11相关信息
  • ARM11 系列的运行频率高达500~700MHZ,更为强大的性能。ARM11 处理器在增加流水线数的同时,还在结构设计方面进行了改进。
    • ARM11 包含64个4种状态的跳转目标地址缓存,用来存储最近使用过的跳转目标地址,这将会极大地提高IPC指标,尤其是对那些存在许多条件跳转指令的测试向量或应用程序。
      ARM11 系列包括ARM1136(F)-S、ARM1156T2(F)-S和ARM1176JZ(F)-S三种类型
      ARM11部分处理器相关功能如下:
      notion image
  • ARM11 系列微处理器特点
    • 工作频率高达700MHZ,功耗低至200mW;
    • 实时响应快,中断延迟更低,支持矢量化中断,中断速度提高 3 倍
    • 内核有8级流水线,带2个周期的高速闪存访问,可实现高频工作;
    • ARM11处理器在提供高性能的同时,也允许在性能和功耗间做权衡以满足某些特殊应用。通过动态调整时钟频率和供应电压,开发者完全可以控制这两者的平衡。在0.13um工艺,1.2v条件下,ARM11处理器的功耗可以低至0.4mW/MHz.;
    • ARM11 MPCore使用多核处理器结构,可实现从1个内核到4个内核的多核可扩展性,从而使得单个宏的简单系统设计可以具备4倍于单个内核的性能;(就是四个核一起工作)
    • 存储器管理单元支持Microsoft Windows、Symbian OS、WinRiver和Linux操作系统;
    • 多媒体处理扩展:使MPEG4编码/解码加快一倍、音频处理加快一倍;

2.2.2.6 Cortex系列

  • Cortex系列相关信息
  • ARM 推出的 Cortex 系列包括:Cortex-A、 Cortex-R 和 Cortex-M三个系列。
    • Cortex-A 系列主要应用于复杂的应用中,支持:ARM、Thumb 和 Thumb2指令集。
      Cortex-R系列 是为实时操作系统设计的嵌入式处理器,能带来更小的芯片面积和低功耗。
      Cortex-M系列 处理器结合了多种突破性技术,集成了许多紧耦合系统外设,以便能满足下一代产品的控制要求,适用于高性能、低成本需求的嵌入式应用。 Cortex-M 主要针对 单片机领域

2.2.2.7 SecurCore 微处理器系列

  • SecurCore相关信息
  • SecurCore 系列微处理器专为安全需要而设计,提供了完善的 32位 RISC 技术的安全解决方案。
    • SecurCore 系列微处理器包含SecurCore SC100,SecurCore SC110,SecurCore SC200 和 SecurCore SC210 四种类型
      SecurCore部分处理器相关功能如下:
      notion image
  • SecurCore 系列处理器特点: SecurCore 系列处理器除了具有 ARM 体系结构的主要特点(见2.1)外,还在系统安全方面具有如下的特点
    • 带有灵活的保护单元,以确保操作系统和应用数据的安全;
    • 采用软内核技术,防止外部对其进行扫描探测;
    • 可集成用户的安全特性和其他协处理器。
  • SecurCore 应用场景:SecurCore 系列微处理器主要应用于一些对安全性要求较高的应用产品及应用系统,如:电子商务、电子政务、电子银行业务、网络和认证系统等领域。

2.3 ARM9 处理器内核

因为课是以ARM9为例的,所以这里再花一节的时间介绍ARM9处理器

2.3.0 ARM9系列相关信息

ARM9系列有ARM920T、ARM922T和 带有高速缓冲器宏单元的ARM940T。全部的ARM9系列处理器均具有16位Thumb指令集和基于Embedded ICE的调试方式。
ARM920T、ARM922T和ARM940T是在ARM9TDMI的基础上研制开发的。
ARM9TDMI是基于ARM体系结构v4版本的高端ARM核(注意:核并非芯片,ARM核与其他部件(如RAM、ROM、片内外设)组合在一起才构成现实的芯片)

2.3.1 ARM9系列MCU

2.3.1.1 ARM9TDMI

  • ARM9TDMI的后缀意义
    • T:支持16位Thumb指令集
    • D:支持片上Debug
    • M:内嵌硬件乘法器
    • I:嵌入式ICE,支持片上断点和调试点。
  • ARM9TDMI的特点
    • ARM9TDMI使用哈弗结构,通过cache可以同时读取指令和数据。
    • 流水线从ARM7TDMI的 3级 增加到5级
    • 在相同工艺下,ARM9TDMI的性能近似为ARM7TDMI的2倍。

2.3.1.2 ARM920T

  • ARM920T相关信息
  • ARM920T核由ARM9TDMI、存储管理单元MMU和高速缓存三部分组成。其中,MMU可以管理虚拟内存,高速缓存由独立的16KB指令和16KB数据高速Cache组成。(哈弗结构)
    • ARM920T有两个内部协处理器CP14和CP15。CP14用于调试控制,CP15用于存储系统控制及测试。

2.3.1.3 ARM940T

  • ARM940T相关信息
  • ARM940T内置指令和数据Cache(哈佛结构)、保护单元和高速AMBA总线接口

2.3.2 ARM9TDMI的流水线(**)

2.3.2.1 ARM7的 3 级流水线

ARM7的 3 级流水线为:取指、译码、执行。如下图:
notion image
需要注意的是,精简指令集是指令执行只需要一个周期,并没有算上取指和译码的时间

2.3.2.2 ARM9的 5 级流水线

  • ARM9的 5 级流水线:5级流水线 是 ARM9TDMI 的主要特征之一,其设计减少了在每个时钟内必须完成的最大工作量,进而允许使用较高的时钟频率
    • 取指:指令从存储器中取出,放入指令流水线;
    • 译码:指令译码,从寄存器堆中读取寄存器操作数
    • 执行:把一个操作数移位,产生ALU的结果。如果指令是Load或Store,在ALU中计算存储器的地址;
    • 缓存/数据:如果需要,则访问数据存储器;否则,ALU的结果只是简单地缓冲一个时钟周期,以便使所有指令具有同样的流水线流程;
    • 回写:将指令产生的结果写回到寄存器堆,包括任何从寄存器读出的数据。

2.3.2.3 ARM9TDMI与ARM7TDMI流水线比较

notion image
需要注意的是在译码的时候寄存器操作数就已经被读取了

2.3.2.4 指令流水的扩展(-)

notion image
notion image
从上图可以发现流水线没那么顺畅了,是因为有的流水线操作并没有执行,而是直接跳过,所以5级最佳流水线为:
notion image

2.3.3 协处理器接口

2.3.3.0 协处理器接口相关信息

协处理器用于减轻系统微处理器的特定处理任务的芯片或模块。例如:intel pentium 微处理器就包括内置的数学协处理器。
ARM处理器内置的协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。

2.3.3.1 扩展指令集

协处理器也能通过提供一组专门的新指令来扩展指令集。例如,有一组专门的指令可以添加到标准ARM指令集中,以处理向量浮点(VFP)运算。
  • 扩展指令集的处理过程
    • 这些新指令是在ARM流水线的译码阶段被处理的。协处理器和ARM处理器连接到同一个指令总线,这意味着协处理器可以对指令流中的指令进行译码并执行其所支持的指令。
    • 如果在译码阶段发现是一条协处理器指令,则把它交给相应的协处理器。
    • 如果该协处理器不存在,或不认识这条指令,则ARM认为发生了未定义指令异常,则执行未定义指令陷阱(即未定义指令异常服务子程序)。

2.3.3.2 可用的协处理器

一个系统中最多可连接16个协处理器。每个协处理器都由唯一的ID标识。
  • AMR920T处理器的两个协处理器(在上面的介绍中也有提到)
    • CP14通信通道协处理器,负责调试
    • CP15为CACHEMMU功能提供的系统控制协处理器
协处理器总表如下:
notion image

2.4 ARM 处理器工作状态(*)

2.4.1 ARM 处理器工作状态简介

嵌入式系统在某些应用场合对存储成本或空间要求比较苛刻,为了让用户更好地控制代码量,于是设计了2套指令系统,分别为ARM指令集和Thumb指令集。其中ARM指令集为32位(字)长度,具有最完整的功能;Thumb指令集为16位(半字)长度,能实现ARM指令集的大部分功能。
在功能上可以认为Thumb是ARM指令集的子集:
notion image
ARM处理器有2个处理器状态与这2套指令集分别对应

2.4.2 ARM状态

执行32位的字对齐的ARM指令。是系统上电默认的状态

2.4.3 Thumb状态

执行16位的、半字对齐的Thumb指令。

2.4.3 处理器状态切换(**)

ARM处理器的两种状态可以通过相应的指令进行切换。ARM指令集与Thumb指令集不能同时混合使用
注意:ARM和Thumb状态间的切换并不影响处理器模式或寄存器内容
从一个ARM例程调用另一个Thumb例程时,内核必须切换状态,反之亦然。下面使用BX分支指令将ARM内核的操作状态在ARM和Thumb之间进行切换,如下:
notion image
需要注意的是这里从ARM跳到Thumb的时候将跳转地址的最低位置1了(即Lable+1)。可以发现在执行带状态跳转的时候会将跳转地址的最后一位自动写入CPSR的状态位,然后将跳转地址写入PC并将最低位清零

2.4.4 指令长度和数据格式

ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。
ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型。
  • 对齐
    • 如果一个数据是以字方式存储的,那么它就是字对齐的(四字节对齐);
    • 如果一个数据是以半字方式存储的,那么它就是半字对齐的(二字节对齐)
  • 如下图:
    • notion image

2.5 ARM 处理器运行模式(***)

2.5.1 ARM 处理器运行模式

2.5.1.1 用户模式(USR)

正常程序执行模式,大部分任务执行在这种模式下。用户模式是用户程序的工作模式。该没有权限去操作其它硬件资源,也不能切换到其它模式下。(也就是不允许直接写CPSR

2.5.1.2 系统模式(SYS)

系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,但比用户模式有更高的权限,可以访问所有系统资源进行模式切换

2.5.1.3 一般中断模式(IRQ)

一般中断模式也叫通用中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源

2.5.1.4 快速中断模式(FIQ)

快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中,其中断优先级相对普通中断更高

2.5.1.5 管理模式(Supervisor,SVC)

管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下系统复位或开机、软中断时进入到SVC模式下

2.5.1.6 中止模式(ABT)

中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式

2.5.1.7 未定义模式(UND)

CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式,进行未定义陷阱处理。

2.5.2 特权模式

  • 特权模式的定义:除用户模式外的其它6种处理器模式称为特权模式(Privileged Modes)。在特权模式下,程序可以访问所有的系统资源,也可以任意的进行处理器模式切换
  • 特权模式的特点:只有在特权模式下才允许对当前程序状态寄存器(CPSR)的所有控制位直接进行读/写访问,而在非特权模式下只允许对CPSR的控制位进行间接访问(SWI方式)。(也就是使用软中断进入SVC模式。在用户下只能读状态寄存器,不能写状态寄存器

2.5.3 异常模式

  • 异常模式的定义:特权模式中除系统模式之外的其他5种模式又统称为异常模式。它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式。
  • 从用户模式切换至异常模式:大多数的用户程序运行在用户模式下。当处理器工作在用户模式时,需要进行处理器模式切换时,应用程序可以产生异常处理(也就是上面特权模式所说的使用软中断),在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用。

2.5.4 运行模式总结(***)

这里给出一张7种运行模式的总表:
notion image

2.6 ARM 寄存器(**)

2.6.0 寄存器概述

ARM处理器有如下37个用户可见寄存器。下面对37个寄存器进行分类:
  • 31 个通用寄存器:R0~R15、R13svc、R14svc 、 R13abt、R14abt 、R13und、R14und、R13irq、 R14irq 、 R8fiq~R14fiq。
  • 他们可于任何时候使用通用寄存器的指令
  • 6 个状态寄存器:1 个CPSR、5 个SPSR( SPSRsvr、 SPSRabt 、 SPSRund 、 SPSRirq 、 SPSR_frq )

2.6.1 ARM状态下的寄存器(***)

2.6.1.1 各模式可访问的寄存器

在ARM状态下,任一时刻都可以访问到 16个 通用寄存器和1~2个状态寄存器。各种模式下能访问的寄存器如下图所示:
notion image
需要注意的是这里完全通用的寄存器只有R0~R13(R13的值都是自己写的,而不是体系结构决定的)

2.6.1.2 一般通用寄存器

从这里开始2.6.1就是在介绍通用寄存器了
这里我就先把R14、R15算在通用寄存器里面了。只不过R13-R15被用作特殊目的了。下面是copilot的解释:
在 ARM 架构中,有 16 个通用寄存器,编号为 r0 到 r15。
其中,r13 通常被用作堆栈指针(SP),r14 是链接寄存器(LR),用于存储子程序返回地址,r15 是程序计数器(PC)。
剩下的 r0 到 r12 寄存器可以用于通用目的。在函数调用中,r0 到 r3 通常用于传递参数和返回结果。
但是注意这里说的是一般通用寄存器,所以就把PC排除了
  • 一般通用寄存器分类(就是有没有多个)
    • 未分组寄存器,包括 R0~R7:在所有处理器模式下对于每一个未分组寄存器来说,指的都是同一个物理寄存器(只有一个物理寄存器。需要注意的是这里谈分组的时候并不考虑PC,但是PC是一个通用寄存器)
    • 如下图:
      • notion image
    • 分组寄存器,包括 R8~R14:它们每一个访问的物理寄存器取决于当前的处理器模式
    • 如下图:
      • notion image
        分组寄存器可进一步分组
      • 分组寄存器R8~Rl2可分为两组物理寄存器。一组用于FIQ模式,另一组用于除FIQ以外的其他模式。第1组访问R8fiq~R12fiq,允许快速中断处理。第二组访问R8usr~R12usr,没有任何指定的特殊用途。在进入FIQ模式后就不必为保护寄存器而浪费时间,程序可以直接使用R8fiq ~ R12fiq来执行操作了,从而实现快速的中断处理
      • 如下图:
        • notion image
      • 寄存器R13~R14可分为6个分组的物理寄存器。1个用于用户模式和系统模式,而其他5个分别用于svc、abt、und、irq和fiq五种异常模式。
      • 如下图:
        • notion image
下面详细介绍几个用作特殊目的的通用寄存器

2.6.1.3 堆栈指针R13

  • 寄存器R13通常用作堆栈指针,称作SP。每种异常模式都有自己的分组R13。通常R13应当被初始化成指向给各模式所分配的堆栈。
  • 其中用户模式和系统模式共用一个,每种异常模式都有专用的R13寄存器。它们通常指向各模式所对应的专用堆栈,也就是说ARM处理器允许用户程序有6个不同的堆栈空间

2.6.1.4 链接寄存器R14(**)

  • 寄存器R14(链接寄存器或LR)在体系结构中有两种特殊用途:
    • 在各种模式下,R14用来保存子程序的返回地址。当一条BL或者BLX指令执行子程序调用时,R14设为子程序的返回地址
    • 如下图:
      • notion image
        这个时候返回的时候LR是不用减的(可以理解为编译器帮我做了这件事,不用管PC在跳转的时候到底是在哪条指令)
        子程序的返回
      • 执行指令
        • MOV PC, LR ;把LR中的值写入到PC寄存器中
        • BX LR ;跳转(带状态切换)到LR地址所指向的指令执行。用于从实现从一个状态返回另外一个状态并继续执行。
      • 借助栈
      • 相关代码如下:
      • 当发生异常时,相关异常模式下的R14就设为异常返回地址。异常的返回地址与子程序的返回类似。区别在于有些异常有一个小常量的偏移。(流水线问题)
      • 如下图:
        • notion image
          正如上图所示,在异常处理的过程中还要考虑LR的组别问题

    2.6.1.5 程序计数器R15(**)

    主要需要考虑的问题就是指令对齐以及流水线问题
    • 程序计数器PC简介:寄存器R15用作程序计数器(PC)。在ARM状态,位[1:0]为0,位[31:2]保存PC。在Thumb状态,位[0]为0,位[31:1]保存PC(指令对齐问题)。R15虽然可以像其他通用寄存器那样操作(所以PC还是算通用寄存器),但对R15的使用还是有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。
    • 读程序计数器:指令读出的R15的值是当前正在执行的指令地址加上8字节(Thumb状态+4。流水线问题)。由于ARM指令始终是字对齐的,所以读出结果值的位[1:0]总是0(在Thumb状态下bit0总是0。指令对齐问题)。
    • 下面给出上面这段话的解释
      • 无论处理器处于何种状态,程序计数器R15(即PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。
      • 一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第1条指令
      • 因此,PC总是指向第3条指令,或者说PC总是指向当前正在执行的指令地址再加2条指令的地址
      • 当处理器处于ARM状态时,每条指令长4字节(所以Bit1,Bit0为0),所以PC的值为正在执行的指令地址加8字节,即:PC值=当前程序执行位置+8字节
      • 当处理器处于Thumb状态时,每条指令长2字节(所以Bit0为0),所以PC的值为正在执行的指令地址加4字节,即:PC值=当前程序执行位置+4字节
    • 写程序计数器。写R15的通常结果是将写到R15中的值作为指令地址,并以此地址发生转移。由于ARM指令要求字对齐(Thumb要求半字对齐),通常希望写到R15中值的位[1:0]=0b00(Thumb状态下Bit0为0)。

    2.6.2 ARM状态下程序状态寄存器(***)

    2.6.2.0 程序状态寄存器概述

    当前程序状态寄存器(CPSR)可以在任何处理器模式下被访问(只有一个)
    • 程序状态寄存器内容
      • ALU 状态标志(条件码标志位,NZCV)
      • 当前的处理器模式
      • 中断使能标志
      • 设置处理器的状态
    • 如下图:
      • notion image
    • 备份状态寄存器SPSR:每一种异常模式下,都有一个专用的物理寄存器做备份程序状态寄存器(SPSR: Saved Program Status Register )。当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器

    2.6.2.1 条件标志位(***)

    这些条件标志位会根据程序中的算数指令或逻辑指令的执行结果进行改变,而且这些条件标志位可由大多数指令检测以决定指令是否执行。
    • N:本位设置成当前指令执行结果的第31位。当两个由补码表示的有符号整数运算时,N=1 表示结果为负数;否则结果为正数或零(所以不用管是有符号数还是无符号数,只不过在有符号数运算的时候才有实际的意义)
    • Z:Z=1 表示运算的结果为零,否则结果不为零。
    • C:分 4 种情况设置 C 的方法:
      • 加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出,其它情况下C=0;
      • 减法指令中(包括比较指令CMP),当运算中发生了借位,则C=0,其它情况下C=1;
      • 对于在操作数中包含移位操作的运算指令(非加/减指令。加减指令的时候根据结果置位),C被设置成被移位寄存器最后移出去的位;
      • 对于其它非加/减法运算指令,C的值通常不受影响(乘法指令也不会影响C
    • 需要注意的是这里比较指令的中间结果也算是加减法指令
    • V:下面分两种情况讨论V的设置方法:
      • 对于加/减运算指令(包括比较指令CMP与CMN),当操作数和运算结果都是以二进制的补码表示的带符号的数时,且运算结果超出了有符号运算的范围时溢出。V=1 表示符号位溢出
      • 对于非加/减法指令,通常不改变标志位 V 的值(乘法指令也不会影响V
    从上面可以看出C常用于无符号数的溢出,而V常用于有符号数的溢出
    C 标志位和 V 标志位都用于表示某种形式的“超出范围”,但 C 标志位主要用于无符号数的运算,而 V 标志位主要用于有符号数的运算。
    从下面这张图中能看出一点端倪:
    notion image
    可以发现C位是将操作数视为无符号数然后进行置位;而V是将操作数视为有符号数然后进行置位。而我们在编码的时候只需要知道我们使用的是有符号数还是无符号数然后关注相应的标志位即可。所以是可能存在一条指令同时将CV置位的。

    2.6.2.2 Q标志位(-)

    在带DSP指令扩展的ARMV5及更高版本中,Q标志位被指定用于指示增强DSP指令是否发生了溢出。
    在ARMV5以前的版本及ARMV5的非E系列处理器中,Q标志位没有被定义,属于待扩展的位。

    2.6.2.3 控制位

    CPSR的低8位属于控制位
    • 中断禁止位(第7、6位,即I,F)
      • I=1:IRQ被禁止
      • F=1:FIQ被禁止。
    • 状态控制位(第5位,即T)
      • T=0:处理器处于ARM状态
      • T=1:处理器处于Thumb状态。
    • 注意:绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器会进入一个无法预知的状态
    • 模式控制位(第4-0位)
    • 模式控制位代表的模式如下:
      • notion image
        注意:如果将非法值写入M[4 : 0]中,处理器将进入一个无法恢复的模式。
      • 模式控制位注意点
        • 通过程序修改CPSR可以进入异常。除此之外,也可以在内核对异常或者中断响应时由硬件切换到异常模式。
        • ;例:从系统模式切换到管理模式(用户模式不能直接写CPSR进行模式切换) MSR CPSR_c,#D3 ;CPSR的控制位为#D3(11010011),切换到管理模式。
        • 用户模式与系统模式不能由异常进入,也就是说要想进入系统模式,必须通过修改CPSR才能实现
        • MSR CPSR_c,#DF ;CPSR的控制位为#DF(11011111),切换到系统模式(比如从管理模式到系统模式)

    2.7 ARM 存储系统

    2.7.1 ARM存储方法(*)

    ARM处理器外部采用冯·诺依曼(von Neumann)结构(所以从外部看都是冯诺依曼体系结构),指令和数据共用一条32位数据总线,只有装载、存储和交换指令可访问存储器中的数据。(就是有专用的存储器访问指令)
    ARM处理器将存储器看作是一个从0开始的线性递增的字节集合,其中每个数组元素(字节)都是可以寻址的(可以说地址的“分辨率”就是一字节)
    • 内存模式(格式):ARM支持大端模式(big-endian)和小端模式(little-endian)两种内存模式。
      • 在大端模式下,一个字的高地址单元放的是数据的低位
      • 在小端模式下,数据的低位放在内存中低地址单元中(常用小端)
    • 如下图:
      • notion image
    • 内存模式的修改:一个基于ARM的实际芯片可能只支持小端存储器格式,也可能只支持大端存储器格式,还可能两者都支持。
      • ARM指令集不包含任何直接选择大小端存储器格式的指令,但是一个同时支持大小端存储器格式的ARM芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。
      • 如果芯片有一个标准系统控制的协处理器(例如ARM920T的CP15协处理器),系统控制协处理器寄存器1的bit7可用于改变配置(也就是通过软件指定存储器格式)。
      • 注意:对于S3C2440是通过软件来指定存储器格式的(通过设置CP15寄存器1的bit7来实现),缺省为小端格式

    2.7.2 ARM体系的存储空间

    ARM9使用2^32个8位字节地址空间,字节地址的排列从0~2^32-1。
    地址空间也可以看作是包含2^30个32位字(也就是将地址除以4),地址以字为单位进行分配。地址为A的字包含4个字节,地址分别为A、A+1、A+2和A+3(向上的四个字节)
    地址空间还可被看作包含2^31个16位半字(也就是将地址除以2),地址按照半字进行分配。地址为A的半字包含2个字节,地址分别为A和A+1(向上的两个字节)
    • 寻址注意事项
    • 通常地址计算通过普通的整数加减指令来实现。这意味着如果地址向上或向下溢出地址空间(也就是加减法出现溢出),通常会发生翻转。如果地址的计算没有发生翻转,那么结果仍然位于0~2^32-1范围内。
      • 程序应保证穿过地址0xFFFF FFFF的向前转移和穿过地址0x0000 0000的向后转移的情况都不发生(就是寻址不越界)

    2.7.3 存储器结构

    ARM处理器有的带有指令cache和数据cache(带有指令数据缓存通常就是哈佛结构),但不带有片内RAM和片内ROM。系统所需的RAM和ROM(包括Flash)都通过总线外接(这里的片内RAM的意思是核内的RAM。核内RAM就只需要通过内总线连接)
    有的ARM片内还带有存储器管理单元MMU(Memory Management Unit)

    2.7.4 存储器映射I/O

    基于ARM内核的芯片具有许多的外设,这些外设访问的标准方法是使用存储器映射的I/O(存储器统一编址),为外设的每个寄存器都分配一个地址。通常,从这些地址装载数据用于读入,向这些地址保存数据用于输出(也就是没有专用的输入输出指令)。有些地址的装载和保存用于外设的控制功能,而不是输入或输出功能。
    注意:存储器映射的I/O位置的操作不同于正常的存储器位置的操作。通常,把存储器映射的I/O位置标记为无高速缓存和无缓冲区,以避免处理器把这部分地址当普通内存,调入到cache中,进行缓存操作

    2.7.5 Flash组织形式

    目前几乎所有MCU的程序都存储在Flash中。
    • Flash分类:
      • 片内Flash
      • 片外Flash
        • NOR Flash:NOR Flash读取速度快,但是擦除和写入速度慢。
        • NAND Flash:NAND Flash读取速度比NOR Flash慢,但擦除和写入速度很快。

    2.7.6 RAM的组织形式

    芯片自带的RAM不够用时需要外加(就是在总线上继续加RAM),外加的RAM一般是SDRAM和DDR RAM,极少数使用SRAM,因为SRAM的价格相对较贵,但SRAM速度要比动态RAM快。
    • SRAM。只需要在IDE中设置好地址
    • SDRAM/DDR RAM。不仅要在IDE中设置好起始地址,还要在程序中做初始化操作后才能使用(因为是动态RAM,需要设定刷新频率什么的)。如果使用仿真器,那么在仿真运行程序前,要执行一个初始化脚本文件,或者执行一系列命令对SDRAM和DDR RAM进行初始化,否则会运行出错。

    2.8 中断和异常的基本概念(--)

    由于ppt上指明了不考,就猛猛复制一下

    2.8.1 中断和异常

    • 什么叫中断
    • 当处理器遇有外部设备发生 “紧急事件” 需要它来处理时,它就必须停下 “手头上的工作” 先去处理这个 “紧急事件”。处理器的这种工作过程,或者这种工作状态就叫做中断
    • 什么叫中断请求
    • 当外部设备有紧急事件需要处理器进行处理时,外部设备必须向处理器发送一个 电信号(脉冲或电平) 来表示有事件需要处理器来处理。这个信号叫做中断请求信号 ,或称中断请求
    • 什么叫中断源
    • 发出中断请求信号的外部设备或事件就叫做中断源。
    • 什么叫异常
    • 内部事件引起的中断叫做异常。

    2.8.2 中断请求信号的屏蔽

    • 屏蔽中断的寄存器和开关
    • 如下图:
      • notion image
    • 中断分类
      • 可屏蔽中断:人们把带有开关能阻止中断请求的中断输入端叫做可屏蔽中断信号输入端。这类中断叫可屏蔽中断。
      • 非屏蔽中断:人们把不带开关不能阻止中断请求的中断输入端叫做非屏蔽中断信号输入端。这类中断叫非屏蔽中断。
    • 中断控制器:为了对处理器可以接收中断源的数目进行扩充及对中断进行必要的管理,在中断源和处理器之间还配有如下图所示的中断控制器。
        notion image

    2.8.3 中断优先级及中断嵌套

    • 中断优先级:处理器通常只有一个可屏蔽中断请求输入端。对于具有多个中断源的系统来说,当有两个或两个以上中断源同时发生中断请求时就会出现所谓的竞争
    • 竞争可以通过优先级的方法来处理,具体实现方法有两种:硬件实现方法软件实现方法

    2.8.4 中断服务程序

    • 中断服务程序概念:中断服务程序是用来处理中断事件的程序
    • 中断服务程序的一般结构
    • 如下图:
        notion image
    • 中断服务程序与普通子程序的区别:中断服务程序要对中断嵌套进行必要的管理。即中断服务程序要根据需要,对程序状态寄存器中的中断允许标志进行相应的设置

    2.8.5 中断向量和中断向量表

    • 中断向量:为了与普通子程序的首地址进行区分,中断服务程序的首地址(入口地址)通常被叫做中断向量,或中断矢量。以后还会看到,凡是能直接或间接指向中断服务程序的都叫中断向量(如跳转到中断服务程序的跳转指令
    • 在处理器收到中断请求之后,它们都需要获得中断服务程序首地址——中断向量。
    • 中断向量表:所有的中断向量都按一定规律存放在一个固定的存储区域这个集中存放了中断向量或与中断向量相关信息的存储区域就叫做中断向量表

    2.8.6 中断的处理过程

    • 处理器响应中断的条件
      • 处理器程序状态寄存器的中断屏蔽标志处于非屏蔽状态;
      • 没有更高级的中断请求正在响应或正在发出、正挂起;
      • 处理器在现行指令执行结束后(指的是流水线中的那个执行,而不是一条指令的5级全过程)
    • 中断的处理过程
    • 当有中断请求发生且满足上述条件时,计算机系统就会响应中断请求,并自动将被中断程序的下一条指令地址(断点地址)保存和关闭中断;接下来便将自中断向量表查询得到的与该中断源对应的中断向量送入PC,并转去执行中断服务程序。
      • 当执行到中断服务程序末尾时,执行中断返回指令或跳转指令,把保存的断点地址送回 PC,以在断点处接续执行被中断的程序。
        这个是不允许中断嵌套的情况,因为进入中断之后就会关闭中断

    2.9 ARM 的异常(***)

    • 只要正常的程序流程被暂时中止,ARM处理器就进入异常模式(五种模式)
    • ARM处理器可以响应的中断(异常)有:中断、快中断、复位中断、软中断异常、预取指令中止异常、数据中止异常 和 未定义指令异常 7 种(ARM异常与中断不做严格意义上的区别。)

    2.9.1 ARM的中断(异常)向量表

    • ARM的中断向量特点:ARM的中断向量表内存放的是响应异常和中断的转移指令而不是中断向量地址。
    • 低端与高端向量表:ARM有低端和高端两种向量表,用户可以根据需要选用其中一种
    • 如下图:
      • notion image
        就是看前16位是0还是1
        高端向量是ARM架构可选配置,可以通过硬件外部输入管脚来配置是低端向量还是高端向量,不能通过指令来改变向量的位置。但可通过协处理器CP15配置
    • ARM中断异常的各个向量在向量表中的分配
    • 如下图:
      • notion image
        如果是高端向量表的话就只要将中断向量地址的前16位修改一下就好了

    2.9.2 ARM异常响应(***)

    2.9.2.0 ARM异常响应过程概述(***)

    在ARM处理器中,当异常发生时,完成当前指令后,处理器可以通过两次跳转转移到中断(异常)服务程序执行异常中断处理。异常处理完毕后返回原来的程序断点继续执行原来的程序。如下图:
    notion image

    2.9.2.1 进入异常

    • 在异常发生后,ARM内核会作以下工作(硬件完成):
      • 在适当的LR中保存断点的地址:ARM都将当前PC寄存器的值(运行指令地址加4或加8 )复制(取决于异常的类型) 到LR中;(无论是那种处理器状态,无论是发生什么中断,都是PC直接复制
      • 把当前程序状态寄存器(CPSR)中的内容保存到模式私有寄存器SPSR中(这里就保存了处理器的状态
      • 将寄存器CPSR中的MODE域设置为中断(异常)应进入的运行模式;
      • 对CPSR的I位和F位进行相应的设置,以防止再次响应同一个中断请求。
      • 强制PC从相关的异常向量处取指,即到中断向量表中获取中断向量,转向用户所编写的中断(异常)服务程序。
    • 即下面的伪代码:
      • 注:异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时(这个说不清楚具体是硬件处理的哪一步,只需要知道是硬件做的事情就好了),会自动切换到ARM状态。

    2.9.2.2 异常返回

    • 当异常结束时,异常处理程序必须做如下处理:
      • 将SPSR的值复制回CPSR
      • 将LR中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同。
    • 注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值(还会恢复模式)

    2.9.2.3 异常进入/退出示例

    • 前提条件:程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断(处理器状态与中断类型影响返回的指令)
    • 异常全过程
      • 用户程序运行时发生IRQ中断硬件完成以下动作(硬件)
        • 将当前PC的内容存入IRQ模式的LR寄存器(也可以在跳转前做,这是硬件决定的)
        • 将CPSR寄存器内容存入IRQ模式的SPSR寄存器
        • 设置MOD位,切换处理器模式至IRQ模式
        • 清零T位(进入ARM状态)
        • 置位I位(禁止IRQ中断。关于某种模式要关闭什么中断,看上面的中断分配)
        • 将向量地址存入PC,实现跳转
      • 说实话这些步骤的顺序并不重要,但是上面这个顺序是ppt上给出的主流顺序
        • 如下图:
          notion image
      • 在异常处理结束后,异常处理程序完成以下动作(软件)
        • 将SPSR寄存器的值复制回CPSR寄存器
        • 将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序(与流水线有关)
      • 如下图:
        • notion image
          需要注意的是这里因为原来的状态是Thumb,所以这里返回的时候是减2

    2.9.2.4 ARM异常进入/退出(***)

    这里并不是介绍异常进入退出的流程,而是更具体地去介绍一下异常进入退出时的细节
    • ARM处理器进入异常时R14所保存的值及退出时推荐指令
    • 如下图:
      • notion image
        这里说到复位中断下LR的值不可预知是因为复位是系统刚刚上电执行的第一个程序,LR并不指向返回地址(第一个程序没有返回地址)
    • 利用堆栈返回:如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用堆栈指令来恢复用户寄存器并实现返回。相关代码如下:
    • SUB LR,LR,#4 ;计算返回地址 -4或-8 STMFD SP!,{R0-R3,LR} ;保存使用到的寄存器 . . . LDMFD SP!,{R0-R3,PC}^ ;中断返回
      • 需要注意的是这里出栈返回的时候有一个"^"。他的含义为:中断返回指令的寄存器列表(其中必须包括PC)后的“^”符号表示这是一条特殊形式的指令。它指示在从存储器中装载PC的同时PC是最后恢复的),CPSR也得到恢复(从SPSR恢复)

    2.9.3 ARM异常描述(***)

    2.9.3.0 ARM异常优先级

    ARM按事件的紧急程度为每个中断(异常)都定义了一个固定的优先级别。当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序。如下图:
    notion image
    下面逐个介绍每一个中断异常的处理过程(与上面的通用的过程都差不多,只不过更细了)

    2.9.3.1 复位中断

    • 复位中断的发生:当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片其他复位源会改变这个内核信号),ARM处理器放弃正在执行的指令,当nRESET信号再次变为高电平时,将产生复位中断
    • 发生复位的两种情况:
      • 系统初始运行时的正常上电;
      • 由程序引起的复位
    • 复位中断响应流程(硬件执行)
      • 强制M[4 : 0]变为b100011,系统进入管理模式;
      • 将CPSR中的控制位T清零,处理器处于ARM状态;
      • 将CPSR中的控制位I和F置位,IRQ和FIQ中断禁止;
      • 强制PC从地址0x00(需要判断是高端向量表还是低端向量表)开始对下一条指令进行取指;
    • 如下图:
      • notion image
        在系统复位后,进入管理模式对系统初始化。复位后,除PC和CPSR之外的所有寄存器的值都是随机的所以上面是没有保存断点和保存CPSR的操作的,因为复位中断是启动的第一个程序,不存在返回的问题

    2.9.3.2 中断请求异常IRQ(***)

    • 中断请求异常IRQ的发生:只有当CPSR中相应的中断屏蔽被清除时,才可能发生中断请求(IRQ)异常,IRQ异常是一个由nIRQ输入端的低电平所产生的正常中断。当一个IRQ异常中断发生时,内核切换到中断模式,表明产生了中断。
    • IRQ响应流程(硬件)
      • 将异常处理程序的返回地址(PC寄存器中的值)保存到异常模式下的R14(R14_irq或者LR)中,即“中断返回地址+4”(涉及流水线问题,所以返回的时候需要-4。这里是以ARM状态为例)
      • 用户模式的CPSR被保存到新的IRQ中断异常模式SPSR_irq中。
      • 修改模式位,设置为IRQ模式,此时用户模式下的R13和R14将不可操作,而IRQ模式下的R13和R14变为可操作,即R13irq保存IRQ中断模式的堆栈指针,R14irq保存了“IRQ中断返回地址+4”。
      • 清零T标志位,CPU进入ARM状态。
      • 关闭中断。将I位置1,禁止新的IRQ中断产生,但是不限制FIQ中断的发生(F位保持原有状态)。
      • 设置IRQ模式下的PC为IRQ异常处理程序的中断入口向量地址(需要区分高低端向量表)
    • 如下图:
      • notion image
    • IRQ返回:返回时,可以通过“SUBS PC,R14,#4”指令返回
    • 有一些注意点:
      • 实际上在中断模式下执行的是“SUBS PC,R14,#4”指令,同时在SUB指令尾部有一个S,并且PC是目的寄存器,所以CPSR将自动从SPSR寄存器中恢复。
      • 也就是说,当PC是目的寄存器的时候(也就是前面的寄存器),如果加上了S后缀表示要修改CPSR寄存器,那么这个时候并不会根据指令结果来修改状态寄存器而是直接从SPSR中恢复
      • 如果用户需要嵌套IRQ中断,那么必须在中断服务程序中重新使能IRQ中断(因为硬件已经关闭一般中断了),并将R14压入R13所指向的IRQ堆栈之中以预先保留返回地址(中断服务程序),并且还需通过压入IRQ堆栈来预先保留ISR(中断服务程序)将会使用的R0~R12的值,这时就可以对异常进行处理了。
      • 上面这段话说的比较绕,就是说如果要中断嵌套的话,在被抢占的中断中要保存返回地址,而在抢占的中断中要保存现场(需要使用的寄存器)。转换成一个通式就是,在所有的中断服务程序中,要先保存断点以及需要使用的寄存器,这样就能支持中断嵌套了

    2.9.3.3 快速中断请求异常FIQ

    • FIQ快速中断简介:有些嵌入式系统的应用对实时性要求比较高,需要足够快的中断响应速度,比如数据转移或通道处理。ARM在设计上充分地考虑了嵌入式系统的这一特点,在IRQ异常之外还设计了一种快速中断请求(FIQ)异常,并在硬件结构和资源分配上给予了足够的支持
    • FIQ支持(如何减少快速中断的相应延时?)
      • 专门为快中断配置了较多的私有寄存器,从而可使中断服务程序有足够的寄存器来使用,而不必与被中断服务程序使用同一组寄存器,这样就免去了因寄存器冲突而必需的保护及恢复现场工作。
      • ARM把FIQ的中断向量放在了中断(异常)向量表末尾 0X0000001C处,因此它后面没有其它中断向量,允许用户将中断服务程序直接放在这里。(减少一次跳转)
    • FIQ的发生:只有当CPSR中相应的F位被清零时(没有屏蔽快速中断),才可能发生FIQ异常。将ARM内核的nFIQ信号拉低,可实现外部产生FIQ,FIQ异常是优先级最高的外部中断。内核进入FIQ处理程序之后,FIQ、IRQ同时禁止任何外部中断源再次发生中断,除非在软件中重新使能IRQ、FIQ请求。当F控制位被清零时,ARM在每条指令执行结束时检测FIQ同步器输出端的低电平。
    • FIQ异常进入与退出:FIQ异常进入与退出的流程与IRQ类似,这里就不做过多赘述(唯一的区别应该就是要多关一个中断,以及进入的模式不一样)
    • 这里只给出进入FIQ的流程图:
      • notion image

    2.9.3.4 未定义指令异常

    • 未定义指令异常简介:未定义指令异常是内部异常中断。当ARM处理器遇到一条自己和系统内任何协处理器无法执行的指令时,就会发生未定义指令异常,从而进入中断处理程序;软件可使用这一机制,通过仿真未定义的协处理器来扩展ARM指令集(就是在中断服务程序中自定义这一条未定义指令需要做的事)。
    • 未定义指令异常响应流程:步骤跟上面大同小异,要看详细的文字说明就看IRQ的
    • 如下图:
      • notion image
        这里PC的值就是
    • 未定义指令异常的返回:在仿真未定义的指令后(就是执行完未定义指令异常的中断服务程序),不管处于哪种处理器操作状态(ARM或Thumb状态),处理器执行下面的指令返回:
    • ;MOVS指令将R14的值写入PC,CPSR将自动从SPSR寄存器中恢复(因为有S后缀)并返回到未定义指令之后的指令。 MOVS PC, R14_und
      • 也就是要跳过未定义的指令(就算是自定义的指令也在中断服务程序中执行完了)

    2.9.3.5 中止异常

    • 中止异常简介:中止表示当前对存储器的访问不能被完成,这是由外部ABORT输入信号引起的异常中断。
    • 中止异常的触发:Abort(中止)主要用于虚拟存储器的管理中。在采用虚拟存储器的系统中,处理器可以产生任意的地址。当某个地址的数据无效MMU(存储器管理单元)将产生一个abort中止
    • 中止类型(实际上就是一级中断向量表中的中止,在模式中都对应了中止模式)
      • 预取指中止:由程序存储器出错引起的中止异常;
      • 数据中止:由数据存储器出错引起的中止异常。
    • 下面分别介绍这两个中止异常
    • 预取指中止
      • 预取指中止异常简介 :
      • 当发生预取中止时,ARM内核将预取的指令标记为无效,但在指令到达流水线的译码阶段时才进入异常(所以此时PC是异常指令的下一条指令)。如果指令在流水线中因为分支而没有被执行,中止将不会发生。
        • 或者说:在指令预取时,无法正确读出指令(比如指令地址错误),该指令被标记成有问题的指令(是为了将之前的指令执行结束),这时,流水线上该指令之前的指令继续执行,当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。指令预取异常是由当前执行的指令自身产生的,当产生中断时,是处于译码阶段程序计数器PC的值指向当前产生异常指令后面的那条指令
      • 预取指令中止响应流程(步骤相同,看IRQ)
      • 如下图:
        • notion image
      • 预取指令中止返回
      • SUBS PC, R14_abt, #4 ;在中止模式下,执行该指令返回(ARM状态) SUBS PC, R14_abt, #2 ;在中止模式下,执行该指令返回(Thumb状态)
        • SUBS指令将R14的值减4(或减)写入PC,CPSR将自动从SPSR寄存器中恢复并重试被中止的指令(所以需要减4或者减2)
    • 数据中止异常
      • 数据中止异常简介:数据中止异常表明数据存储器不能识别ARM处理器的数据读写请求,说明此次ARM处理器的读数据操作无效。当发生数据中止异常时,理想的状况是进入数据中止异常的ISR,然后在内存中挑选出问题,再重新执行导致异常的指令。于是就会将PC返回2条指令也就是将R14的值减去8(或减4),并将结果存入PC
      • 数据中止异常相应流程(步骤相同,看IRQ)
      • 如下图:
        • notion image
      • 数据中止返回
      • SUBS PC, R14_abt, #8 ;在中止模式下,执行该指令返回(ARM状态) SUBS PC, R14_abt, #4 ;在中止模式下,执行该指令返回(Thumb状态)
        • SUBS指令将R14的值减8(Thumb指令集减4)写入PC(返回并重新执行导致异常的指令),CPSR将自动从SPSR寄存器中恢复并重试被中止的指令(因为有S后缀并且目的寄存器为PC)。
    • 中止异常的注意点:无论如何,中止异常返回的时候都是返回原指令位置并重新执行

    2.9.3.6 SWI软件中断异常

    • SWI软件中断异常简介:事实上,所有的任务都是在用户模式下运行的,因此任务只能读CPSR而不能写CPSR。任务由用户模式切换到特权模式的唯一途径,就是使用一个SWI指令调用。SWI指令强迫处理器从用户模式切换到SVC管理模式,并且IRQ中断自动关闭(看中断向量分配),所以软件中断方式常被用于系统调用。只有处理器切换到系统模式时,IRQ中断才能继续使用。由于它是由用户在程序中使用指令而产生的中断,所以叫做软中断。它也是所有中断(异常)中唯一的一个同步事件(因为知道他什么时候来,但是其他的异常都是随机发生的)
    • SWI软件中断异常执行流程(与上面的中断差不多,看IRQ)
    • 如下图:
      • notion image
    • SWI软件中断异常返回
    • SWI处理程序通过执行下面的指令返回
      • MOVS指令将R14的值写入PC,CPSR将自动从SPSR寄存器中恢复并返回到SWI指令之后的指令(由于指令带了S后缀并且目的寄存器为PC)。
    Paper2PX4
    Loading...
    Noah
    Noah
    永远年轻,永远热泪盈眶
    公告
    ❗❗复习笔记问题❗❗
    由于兼容性问题
    导入md文件可能导致了一些格式错误
    🌹如发现格式错误,请联系我~🌹
    🌹如博客内容有误也欢迎指出~🌹