【嵌入式系统复习总结】第二章 ARM 体系结构

文章目录

前情提要

本人是一名大三学生,由于期末复习需要,所以按照老师的ppt总结整理此笔记,希望对你有所帮助

第二章 ARM 体系结构

第二章目录

  • ARM微处理器概述
    • ARM处理器系列
    • RISC体系结构
  • ARM微处理器体系结构
    • ARM微处理器的工作状态 ARM和Thumb状态
    • ARM体系结构的存储器格式
    • 处理器模式
    • 寄存器组织
    • 异常

ARM(Advanced RISC Machines),既可以认为是一个公司的名字 ,也可以认为是对一类微处理器的通称 ,还可以认为是一种技术的名字

基于ARM的SOC设计

  • 从ARM或其他第三方购买IP
  • 集成IP,仿真,验证,完成SoC设计
  • 半导体制造公司完成流片

特点

  • 支持Thumb(16位)/ARM(32位)双指令集
  • 使用寄存器,指令执行速度更快
  • 大多数数据操作都在寄存器中完成
  • 寻址方式灵活简单,执行效率高
  • 指令长度固定

1. IP 核的概念:软核、硬核、固核

IP核(Intellectual Property) 知识产权

**硅知识产权核是预先设计好的电路功能模块,**根据IP核的提供方式,分为软核(Soft IP Core),固核(Firm IP Core)硬核(Hard IP Core)

  • 软核:综合之前的RTL代码,只经过功能仿真,需要经过综合以及布局布线才能使用。
  • 固核:完成软核的设计外,及门级电路综合和时序仿真等设计环节,以门级电路网表的形式提供给用户。
  • 硬核:基于物理描述并经过工艺验证,提供给用户的形式是电路物理结构、掩模版图和全套工艺文件。

2.了解:指令集架构、处理器系列、嵌入式系统总线

RISC体系结构

特点:精简指令集计算机RISC结构的产生是相对于传统的复杂指令集计算机CISC 结构而言的。

CISC(Complex Instruction Set Computer,复杂指令集计算机)缺点
  • 随着计算机技术的发展而不断引入新的复杂指令集,为支持这些新增的指令**,计算机的体系结构会越来越复杂**
  • 然而,在CISC指令集的各种指令中,其使用频率却相差悬殊,约20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%
基于不合理性提出了RISC(Reduced Instruction Set Computer,精简指令集计算机)的概念:
  • 指令系统相对简单 ,只要求硬件执行很有限最常用 的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成
  • RISC不是简单地减少指令, 而是把着眼点放在 :
    • 使计算机的结构更加简单;
    • 合理地提高运算速度。
  • RISC优先选取使用频度最高的简单指令,避免复杂指令;
  • 将指令长度固定 ,指令格式和寻址方式种类减少
RISC特点:
  • 指令规整、对称、简单。指令小于100条,基本寻址方式有2~3种。
  • 指令字长度一致 ,单拍完成,便于流水操作 ;
    • ARM7 三级流水线:取值,译码,执行;
    • ARM9 五级流水线:取值,译码,执行,访存,回写;
  • 大量的寄存器。寄存器不少于32个。数据处理器的指令只对寄存器的内容操作。只有加载/存储指令可以访问存储器。
CISC vs RISC
ARM处理系列
ARM处理器的分类
  • 基于指令集体系结构版本分类

    • v1,v2,v5,v6,v7,v8,v9等
  • 基于处理器系列分类

    • 基于ARM体系结构设计的处理器系列

    • ARM7,ARM9,ARM10,ARM11,StrongARM,XScale等

ARM架构发展系列
  1. V1版本 该版架构只在原型机ARM1 出现过**,**其基本性能:
    1. 基本的数据处理指令(无乘法)
    2. 字节、半字和字的LOAD/STORE指令
    3. 转移指令**,**包括子程序调用及链接指令
    4. 软件中断指令
    5. 寻址空间:64M字节(26)
  2. V2版架构 该版架构对V1版进行了扩展,如ARM2采用了V2架构,ARM3采用v2a架构,增加了以下功能:
    1. 乘法和乘加指令
    2. 支持协处理器操作指令
    3. 快速中断模式
    4. SWP/SWPB指令,实现存储器与寄存器数据交换
    5. 寻址空间:64M字节(26)
  3. V3版架构 从V3开始,ARM体系结构被大规模应用
    1. 寻址空间增至32位(4G字节)
    2. 增加了当前程序状态寄存器CPSR和备份程序状态寄存器SPSR以便于异常的处理。
      1. CPSR: Current Program Status Register
      2. SPSR: Saved Program Status Register
      3. MRS指令将状态寄存器的值保存到通用寄存器,
      4. MSR将通用寄存器中的值还原到状态寄存器
    3. 增加了中止abort和未定义二种异常模式。
    4. ARM6就采用该版架构
    5. 指令集变化如下:
      1. 增加了MRS/MSR指令,以访问新增的CPSR/SPSR寄存器
      2. 改进了从异常处理返回的指令功能
  4. V4版架构 V4版架构是应用最广泛的ARM体系结构, ARM7、ARM8、ARM9和StrongARM都采用该版架构。对V3版架构进行了进一步扩充, **引入了16位的Thumb指令集,**处理器存在两种工作状态,使ARM使用更加灵活。指令集中增加了以下功能:
    1. 有符号、无符号的半字和有符号字节的Load/Store指令。
    2. 引入了16位Thumb指令集
    3. 完善了软件中断SWI指令的功能
    4. 增加了处理器的系统模式。
  5. V5版架构 在V4版基本上增加了一些新的指令, ARM9E,ARM10和XScale都采用v5版架构,这些新增指令有:
    1. 提高ARM和Thumb指令集混合使用的效率
    2. 增加了前导零计数CLZ指令
    3. 引入了软件断点指令BKPT,进行中断调试
    4. 增加了信号处理指令
    5. 为协处理器增加更多可选择的指令
      CLZ:Count Leading Zeros,计算最高符号位与第一个1之间的0的个数;
  6. V6版架构
    1. 2001年发布
    2. 首先在ARM11处理器中使用
    3. 具备高性能DSP功能
    4. 引入全新的Jazelle技术,降低Java应用程序对内存的空间占用
    5. **增加了 SIMD(单指令流多数据流 )功能扩展,**提高了嵌入式应用系统的语音,图像处理能力。SIMD:Single Instruction Multiple Data,(XYZW,RGBA)
    6. 适合使用电池供电的便携式设备
  7. V7版架构
    1. 目前为止32位ARM处理器体系结构的最高版本
    2. Cortex系列基于V7架构
    3. Cortex-A---面向性能密集型系统的应用处理器内核
    4. Cortex-R---面向实时应用的高性能内核
    5. Cortex-M---面向各类嵌入式应用的微控制器内核
  8. V8版架构
    1. 2011年11月发布
    2. 首款支持64位指令集的处理器器架构
    3. 针对有更高性能要求的产品,如高档消费类电子
    4. 64位兼容32位
    5. ARMv8架构包含两个执行状态:AArch64和AArch32
  9. V9版架构
    1. 2021年3月发布
    2. 支持64位指令集的处理器器架构
    3. 针对有更高性能要求的产品,如高档消费类电子
    4. 64位兼容32位
    5. 引入机密计算技术Realm模块,防止像Spectre和Meltdown这样的新型安全漏洞攻击
    6. 对AI模块的升级,重点在于改善CPU的AI性能
    7. 扩展到PC、HPC高性能计算、深度学习等新市场
ARM处理器系列

[!NOTE]

命名规则

标志 含义 说明
T 支持Thumb指令集 Thumb指令集版本1:ARMv4T Thumb指令集版本2:ARMv5T Thumb-2:ARMv6T
D 片上调试 一个边界扫描链 JTAG,可使 CPU 进入调试模式
M 快速乘法器 32位乘32位得到64位,32位的乘加得到64位
I Embedded ICE 嵌入式跟踪宏单元,用于实现断点观测及变量观测的逻辑电路部分。提供片上断点和调试点
E DSP指令 增加了DSP算法处理器指令:16位乘加指令,饱和的带符号数的加减法,双字数据操作,cache预取指令
J Java加速器Jazelle 提高java代码的运行速度
S 可综合 提供VHDL或Verilog语言设计文件
  1. ARM7
    1. 低功耗
    2. EmbededICE软件调试方式 ICE:In Circuit Emulation,在线仿真器
    3. 0.9MIPS/MHz的3级流水线结构 MIPS:Million Instruction Per Second 每秒百万条指令
    4. 32位ARM指令集和16位的Thumb指令集
    5. 主频最高可达130MHz
    6. 该系列包括ARM7TDMI、ARM7TDMI-S、带有高速缓存处理器宏单元的ARM720T和扩充了Jazelle( java加速器)的ARM7EJ-S。
    7. ARM7系列广泛应用于多媒体和嵌入式设备,网络和调制解调器设备,以及移动电话、PDA等无线设备。
  2. AMR9 特点:
    1. 1.1MIPS/MHz的哈佛结构,5级流水线
    2. 32位ARM指令集和16位Thumb指令集
    3. 支持32位的高速AMBA总线接口
    4. 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统 MMU:Memory Management Unit
    5. 支持数据Cache和指令Cache,具有更高的指令和数据处理能力
    6. 该系列包括ARM9TDMI、ARM920T和带有高速缓存处理器宏单元的ARM940T。
    7. 主要应用于引擎管理、仪器仪表、安全系统和机顶盒等领域
  3. ARM10E ARM10E系列微处理器具有高性能、低功耗的特点,与ARM9器件相比较,在相同的时钟频率下,性能提高了近50%。
    1. 支持DSP指令集,适合于需要高速数字信号处理的场合。
    2. 6级整数流水线,指令执行效率更高,1.25MIPS/MHZ。
    3. 支持64位的高速AMBA总线接口。
    4. 支持VFP10浮点处理协处理器。
    5. 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。
    6. 支持数据Cache和指令Cache,具有更高的指令和数据处理能力
    7. 主频最高可达400M。
    8. ARM10E系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。
    9. ARM10E系列微处理器包含ARM1020E、ARM1022E和ARM1026EJ-S三种类型,以适用于不同的应用场合。
  4. SecurCore
    1. 该系列涵盖了SC100、SC110、SC200和SC210处理核。
    2. 该系列处理器主要针对新兴的安全市场,以一种全新的安全处理器设计为智能卡和其它安全IC开发提供独特的32位系统设计。
    3. 主要应用于一些对安全性要求较高的应用产品及应用系统,如电子商务、电子政务、电子银行业务、网络和认证系统等领域。
嵌入式系统总线

ARM微控制器使用的是AMBA总线体系结构

AMBA(Advanced Microcontroller Bus Architecture)是ARM公司公布的总线标准,AMBA 2.0规范定义了三种总线:

  • AHB总线(Advanced High-performance Bus):用于连接高性能系统模块。它支持突发数据传输方式及单个数据传输方式,所有时序 参考同一个时钟沿。
  • ASB总线(Advanced System Bus):用于连接高性能系统模块,在不必要使用AHB的高速特性的场合,它支持突发数据传输模式。
  • APB总线(Advance Peripheral Bus):是一个简单接口支持低性能的外围接口。
  • 3.0 引入AXI总线 (Advanced eXtensible Interface)

[!NOTE]

会画图

3.ARM 处理器的两种工作状态,及如何切换

ARM和Thumb状态

ARM微处理器的工作状态一般有两种:

  1. ARM状态---处理器执行32位的字对齐的ARM指令,伪指令CODE32声明;
  2. Thumb状态---处理器执行16位的、半字对齐的Thumb指令,伪指令CODE16声明。

Thumb指令可以看做是ARM指令压缩形式的子集

Thumb指令集的功能是32位ARM指令集的功能子集。Thumb在性能和代码大小之间提供了出色的折中。

  • 正在执行Thumb指令集的处理器是工作在Thumb状态下。

  • 正在执行ARM指令集的处理器是工作在ARM状态下。

  • 带状态切换的分支指令BX

代码密度:单位存储空间中包含的指令的个数。

4. 三级流水 vs 五级流水,大端格式 vs 小端格式

三级流水
  1. 第一级取指:取指级的任务是从程序存储器中读取指令。
  2. 第二级译码:译码级完成对指令的解析,并为下一个周期准备数据路径需要的控制信号。由指令与译码逻辑完成,不占用数据通路。
  3. **第三级执行:**执行完成指令要求的操作,并根据需要将结果写回目的寄存器。

注意:PC指向正被取指的指令,而非正在执行的指令

五级流水
  1. 第一级取指:取指级的任务是从程序存储器中读取指令。
  2. 第二级译码:译码级完成对指令的解析,并为下一个周期准备数据路径需要的控制信号。由指令与译码逻辑完成,不占用数据通路。
  3. **第三级执行:**执行完成指令要求的操作,并根据需要将结果写回目的寄存器。
  4. 第四级访存如果不是对存储器的访问指令,本级流水线为一个空的时钟周期
  5. 第五级写入

ARM9具有5级流水线,将存储器的访问和寄存器写操作分别有单独的流水线来处理,解决了3级流水线LDR/STR指令执行阶段的延迟,提高了指令执行效率。

ARM体系结构的存储器格式

ARM体系结构可以用两种方法存储字数据,称为大端格式 (Big-Endian)和小端格式(Little-Endian )。

  • 大多数CPU是小端格式,如DSP,PC机

  • 单片机、网络传输的TCP/IP协议,是大端格式

  • 51单片机,是大端格式

  • ARM默认小端格式,但用户可设置大、小端格式。

  • 所以在使用TCP/IP协议通信的时候,要注意大、小端格式转换

大端格式(Big Endian)

​ 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端格式(Little Endian)

​ 低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

5. 处理器的工作模式,每种模式的特点,特权模式,异常模式

ARM体系结构支持7种处理器模式,分别为:

用户模式、系统模式、快中断模式、中断模式、管理模式、中止模式、未定义模式。

-----更好地支持操作系统并提高工作效率。

处理器模式 说明 备注
用户(usr) 正常程序工作模式 不能直接切换到其它模式
系统(sys) 用于支持操作系统的特权任务等 与用户模式类似,但具有可以直接切换到其它模式等特权
快中(fiq) 支持高速数据传输及通道处理 FIQ异常响应时进入此模式
中断(irq) 用于通用中断处理 IRQ异常响应时进入此模式
管理(svc) 操作系统保护代码 系统复位和软件中断响应时进入此模式
中止(abt) 用于支持虚拟内存和/或存储器保护 预取中止和数据中止
未定(und) 支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式
  • 除用户模式外,其它模式均为特权模式 。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由地切换处理器模式,而用户模式不能直接切换到别的模式。

  • 除去(用户和系统)这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。

  • 用户模式和系统模式这两种模式使用完全相同的寄存器组。

    系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

处理器启动时的模式转换图

总结:

  • ARM微处理器的运行模式可以通过软件改变(特权模式),也可以通过外部中断或异常处理改变。

  • 特权模式可以自由地访问系统资源和改变模式。

  • **大多数的应用程序运行在用户模式下,**当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。也不能改变模式。除非异常发生。

6. 寄存器组织,个数,特殊含义的寄存器 R13 R14 R15,CPSR,SPSR(读写 指令 MRS,MSR)

  • ARM处理器有**37(31+6)**个物理寄存器,31个通用寄存器和6个状态寄存器 。
  • 寄存器被安排成部分重叠的组。每种处理器模式都有不同的寄存器组。
  • 分组的寄存器在异常处理和特权操作时,可得到快速的上下文切换。
ARM状态下各模式寄存器
  • 所有的37个寄存器,分成两大类:

    • 31个通用32位寄存器;

    • 6个状态寄存器

  • 寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。

  • 寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中存在使用R13的指令。

  • R14为链接寄存器(LR),在结构上有两个特殊功能:

    • 在每种模式下,模式自身的R14版本用于保存子程序返回地址

    • 当发生异常时,该模式下的R14被设置成该异常模式将要返回的地址

    • R14寄存器与子程序调用的操作流程:

      1. 程序A执行过程中调用程序B;

      2. 程序跳转至标号Lable,执行程序B。同时硬件将"BL Lable"指令的下一条指令所在地址存入R14;

      3. 程序B执行最后,将R14寄存器的内容放入PC,实现子程序返回,返回程序A;MOV PC, LR;

    • R14寄存器与异常发生

      **异常发生时,**程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的

      区别在于有些异常有一个小常量的偏移。
      3. IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;


      6. 在程序B返回到程序A,然后在返回到用户模式下被中断的程序时,发生错误,将不能正确返回;

      **解决办法**是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下,或进入IRQ之后修改CPSR关闭使能位。
      
  • 寄存器R15为程序计数器(PC),它指向正在取指的地址。

    • 可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。

    • 如果R15使用的方式超出了这些限制,那么结果将是不可预测的。

    • 读取R15的限制

      正常操作时,从R15读取的值是处理器正在取指的地址 ,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)

      由于ARM指令总是以字为单位,所以R15寄存器的最低两位总是为0。

    • 写R15的限制

      正常操作时,写入R15 的值被当作一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。

  • 程序状态寄存器CPSR 为程序状态寄存器

    • 在异常模式中,另外一个寄存器"程序状态保存寄存器(SPSR)"可以被访问。
    • 每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。
Thumb状态下的寄存器(32位)(不考)

Thumb状态下的寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为:

  • 8个通用寄存器R0~R7;
  • 程序计数器(PC);
  • 堆栈指针(SP);
  • 链接寄存器(LR);
  • 有条件访问程序状态寄存器( CPSR)。

Thumb状态寄存器在Arm状态寄存器上的映射

程序状态寄存器---CPSR(1)+SPSR(5)

CPSR反映了当前处理器的状态:

  • 4个条件码标志;
  • 2个中断控制位;
  • 5个对当前处理器模式进行编码的位;
  • 1个指示当前执行指令的工作状态位;
  • 保留位。

SPSR:备份程序状态字,保存异常事件发生之前的CPSR.

  • 每个异常模式带有一个备份程序状态寄存器,用于保存在异常事件发生之前的CPSR;CPSR和SPSR通过特殊指令进行访问。
  • 条件代码标志

    • 大多数"数值处理指令"可以选择是否影响条件代码标志位(指令带S后缀);但有些指令执行总是影响条件代码标志。
    • 所有ARM指令都可按条件来执行,而Thumb指令中只有分支指令可按条件执行。
    • N:运算结果的最高位反映在N标志位。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;
    • Z:指令结果为0时Z=1(表示比较结果"相等"),否则Z=0;
    • C:
      • 当进行加法运算,并且最高位产生进位时C=0,否则C=1。
      • 当进行减法运算,并且最高位产生借位时C=0,否则C=1。
      • 对于移位操作指令,C为从最高位最后移出的值,其它指令C通常不变;
    • V: 当进行加法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。
  • 保留位

    • 保留位被保留将来使用。为了提高程序的可移植性,当改变CPSR标志和控制位时,请不要改变这些保留位。另外,请确保程序的运行不受保留位的值影响,因为将来的处理器可能会将这些位设置为1或者0。
  • 控制位

    • 最低8位为控制位,当发生异常时,这些位被硬件改变。当处理器处于一个特权模式时,可用软件操作这些位。

    • CPSR模式位设置表

      M[4:0] 模式 M[4:0] 模式
      10000 用户 10111 中止
      10001 快中断 11011 未定义
      10010 中断 11111 系统
      10011 管理

      注意:不是所有模式位的组合都定义了有效的处理器模式,如果使用了错误的设置,将引起一个无法恢复的错误。

CPSR/SPSR的读写指令

状态寄存器访问指令MRS,MSR:

  • MRS: 状态寄存器到通用寄存器的传送指令(读状态寄存器)
  • MSR: 通用寄存器到状态寄存器的传送指令(写状态寄存器)
  • MRS和MSR指令可以实现对状态寄存器的读、修改、写操作,即修改状态寄存器的值。
assembly 复制代码
MRS  R1, CPSR 	;读取CPSR保存到通用寄存器R1
MSR  CPSR, R1	; 传送R1到CPSR

7. 五种异常模式,7 种异常类型,复位的向量地址 0x0,复位的优先级

异常:

只要正常的程序流被暂时中止,处理器就进入异常模式。

例如响应一个来自外设的中断。在处理异常之前,ARM7TDMI内核保存当前的处理器状态,这样当处理程序结束时可以恢复执行原来的程序。

​ 如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常,详见"异常优先级"部分。

异常处理模式

异常类型 模式 向量地址
复位 管理 0x00000000
未定义指令 未定义 0x00000004
软件中断(SWI) 管理 0x00000008
预取中止(取指令存储器中止) 中止 0x0000000C
数据中止(数据访问存储器中止) 中止 0x00000010
IRQ(中断) IRQ 0x00000018
FIQ(快速中断) FIQ 0x0000001C

异常优先级

异常类型
  1. 复位:
    1. 当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片的其它复位源会改变这个内核信号),ARM7TDMI处理器放弃正在执行的指令。
    2. 当nRESET信号再次变为高电平时,ARM处理器执行下列操作:
      1. 强制M[4:0]变为b10011(管理模式)
      2. 置位CPSR中的I和F位;写入1,先禁止.
      3. 清零CPSR中的T位;写入0,处理器为arm状态。
      4. 强制PC从地址0x00开始进行取指;

8. 异常进入、退出过程、7 种异常类型的返回地址

异常的入口和出口

如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。

中断处理代码的开始部分和退出部分

assembly 复制代码
SUB   LR,LR,#4	;计算返回地址(偏移-4) LR就是R14该模式下的R14被设置成该异常模式将要返回的地址 
STMFD SP!,{R0-R3,LR} ;保存使用到的寄存器 这条指令将R0、R1、R2、R3和LR寄存器的内容保存到堆栈中。
. . .
LDMFD SP!,{R0-R3,PC}^	;中断返回 这条指令将R0、R1、R2、R3和PC寄存器的内容从堆栈中恢复。

注意:

  • 中断返回指令的寄存器列表(其中必须包括PC)后的"^"符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。
  • 这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。如R13_irq
  • 这个堆栈指针应必须在系统启动时初始化。
  • 指令末尾的"!"告诉汇编器,在寄存器被保存后,栈指针(SP)应该被更新。
进入异常

在异常发生后,ARM7TDMI内核会作以下工作:

  1. 在适当的LR中保存下一条指令的地址(R14_irq),当异常入口来自:

    • ARM状态,那么ARM7TDMI将当前指令地址加4或加8复制(取决于异常的类型)到LR中
  2. 将CPSR复制到适当的SPSR(如SPSR_irq)中;

  3. 置位I位(禁止IRQ中断)

    清零T位(进入ARM状态)

    设置MOD位,切换处理器模式至IRQ模式

  4. 强制PC从相关的异常向量处取指。

注:

  • ARM7TDMI内核在中断异常时置位中断禁止标志(CPSR 第I位赋值=0x1),这样可以防止不受控制的异常嵌套。

  • 异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。

退出异常

除了复位异常外,其余的异常都需要返回。

当异常结束时,异常处理程序必须:

  1. 将SPSR(如SPSR_irq)的值复制回CPSR;

  2. 若在进入异常处理时设置了**中断禁止标志(I/F位)**则清零该标志。

  3. 将LR(如R14_irq)中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同;

假如指令A 是"BL"指令,则当执行该指令时,会把PC(=0x8008)保存到LR 寄存器里面,但是接下去处理器会马上对LR 进行一个自动的调整动作:LR=LR-0x4=PC-0x4

无论发生什么异常(除复位),内核总是会首先将 PC-4 放到LR寄存器中。

异常的类型
  1. 软件中断 SWI

    • 使用软件中断(SWI)指令可以进入管理模式,通常用于请求一个特定的管理函数。

    • SWI处理程序通过执行下面的指令返回:

      assembly 复制代码
      MOVS    PC,R14_svc

      ​ 这个动作恢复了PC和CPSR并返回到SWI之后的指令。

    • SWI处理程序读取操作码以提取SWI函数编号。

      assembly 复制代码
      SWI 12 ;产生软中断,中断号为12
    • 异常是由当前执行的指令本身(SWI 12)引起的, 当产生中断时,程序计数器PC的值还未更新(未更新的意思就是PC还没有加4,仍然为0x8008)

      assembly 复制代码
      ;LR_svc=PC-4=0x8004
      MOVS    PC,R14_svc;异常返回
  2. 未定义指令异常 UND

    • 当ARM7TDMI处理器遇到一条自己和系统内任何协处理器都无法处理的指令 时,ARM7TDMI内核执行未定义指令异常程序

    • 软件可使用这一机制通过模拟未定义的协处理器指令来扩展ARM指令集。

    • 在模拟处理了失败的指令后,陷阱程序执行下面的指令:

      assembly 复制代码
      MOVS    PC,R14_und

      这个动作恢复了PC和CPSR并返回到未定义指令之后的指令。

    • **异常是由当前执行的指令自身(指令未定义)产生的,**当产生中断时,程序计数器PC的值还未更新(未更新的意思就是PC还没有加4,PC=0x8008)

      assembly 复制代码
      ;LR_und=PC-4=0x8004
      MOVS    PC,R14_und

      返回指令计算与SWI一致

  3. 快速中断请求(FIQ)

快速中断请求(FIQ)适用于对一个突发事件的快速响应,这得益于在ARM状态中,快中断模式有8个专用的寄存器(R8-R15)可用来满足寄存器保护的需要(这可以加速上下文切换的速度)。

​ 不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:

assembly 复制代码
SUBS    PC,R14_fiq,#4

在一个特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。

注意还要再减4 后面有提到

  1. 中断请求(IRQ)
  • 中断请求(IRQ)异常是一个由nIRQ输入端的低电平 所产生的正常中断(在具体的芯片中,nIRQ由片内外设拉低,nIRQ是内核的一个信号,对用户不可见)。

  • IRQ的优先级低于FIQ。进入FIQ处理时FIQ和IRQ都被禁。在一个特权模式下,可通过置位CPSR中的I 位来禁止IRQ。

  • 不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:

assembly 复制代码
SUBS    PC,R14_irq,#4

IRQ或FIQ中断时的返回地址


指令不会被中断打断,A指令执行完以后才能响应中断,此时PC已更新,PC指向指令D的地址(地址0x800C),LR =PC-4保存的地址值是C 的地址0x8008。中断返回后应该执行B指令,所以返回操作是:

assembly 复制代码
;快速中断的返回指令
SUBS    PC,R14_fiq,#4
;中断请求的返回指令
SUBS    PC,R14_irq,#4

FIQ为什么比IRQ快呢?

  • FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理
  • ARM的FIQ模式提供了更多的banked寄存器,R8,R9,R10,R11,R12,模式切换时CPU自动保存这些值到banked寄存器,退出FIQ模式时自动恢复
  • FIQ的中断向量地址在0x0000001C,而IRQ的在0x00000018。这样可以直接在1C处放FIQ的中断处理程序,不需要跳转,所以响应速度快。
  • IRQ和FIQ的中断响应延迟有区别,IRQ的响应并不及时,从Verilog仿真来看,IRQ会延迟几个指令周期才跳转到中断向量处
  1. 中止(ABT)

​ 中止发生在对存储器的访问不能完成时,当出现异常后,要重新再执行一次这条指令,中止包含两种类型:

  1. 预取中止: 发生在指令预取过程中
  2. 数据中止: 发生在对数据访问时

预取中止

  • 当发生预取中止时,ARM7TDMI内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常。

  • 如果指令在流水线中因为发生分支而没有被执行,中止将不会发生

  • 在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令:

    assembly 复制代码
    SUBS    PC,R14_abt,#4
  • 减4的原因。

  • **预取异常是由于指令自身引起的,**所以当产生中止时,程序计数器PC的值还未更新;

  • PC指向指令C的地址(地址0x8008),LR =PC-4保存的地址值是B 的地址0x8004。中断返回后应该执行A指令,所以返回操作是:

    assembly 复制代码
     SUBS    PC,R14_abt,#4

    要返回产生异常的指令,重新执行该指令

数据中止

​ 在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令,这个动作恢复了PC和CPSR并重试被中止的指令:

assembly 复制代码
 SUBS    PC,R14_abt,#8
  • 返回减8的原因

  • 数据访问异常中断由当前执行的指令在ALU里执行时产生,当数据访问异常中断发生时,程序计数器pc的值已经更新

    PC指向指令D的地址(地址0x800C),LR =PC-4保存的地址值是B 的地址0x8008。中断返回后应该执行A指令,所以返回操作是:

    assembly 复制代码
    SUBS    PC,R14_abt,#8
异常类型和返回的指令
相关推荐
冷眼看人间恩怨5 分钟前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
析木不会编程15 分钟前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉4 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6774 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣5 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室5 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费5 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
Hejjon6 小时前
SpringBoot 整合 SQLite 数据库
笔记
liyinuo20177 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
艺术家天选8 小时前
STM32点亮LED灯
stm32·单片机·嵌入式硬件