ARM异常处理详解

前言:

学习一门处理器最重要的就是掌握该处理器的指令集异常处理。

异常概念:

        处理器在正常执行程序时可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来转去处理这个异常的事件,异常处理后再返回到被异常打断的点继续执行

例如:

我现在正在学习,然后我妈叫我吃饭,这时我要停止学习去吃饭,吃完饭后我就重新到我吃饭之前学习的点继续学习。此时,吃饭就是一个异常事件    

 对于CPU,假设它在按顺序执行用户程序,而到了某一个位置,CPU要去处理异常,就会跳转到异常处理程序中,按顺序执行。

注意:用户程序和异常处理程序都是编程人员自己写的

假设我正在玩游戏,用户程序就是游戏,在玩游戏的途中,我觉得声音小了,按按钮加大声音,这时,相当于去处理异常了,跳转到了异常处理程序中,运行完后返回用户程序执行异常的那个位置。

异常与中断的区别

他们两个都是计算机系统中的事件,最重要的区别是,中断是外围设备向处理器发出的,可以理解为硬件,而异常是程序执行过程中出现的,可以理解为软件。即中断与硬件有关,异常与软件有关。

中断的产生是异步的,也就是说,它可以在任何时候发生,用于通知处理器要处理的事件,而异常的产生是同步的,也就是说,它只会在程序执行到某个特定的指令时发生,用于表示程序出现了错误或异常情况

处理中断需要保存当前程序的上下文,并跳转到中断服务程序中执行相应操作;处理异常则不需要保存当前程序的上下文,而是立即跳转到异常处理程序中处理异常情况。

异常处理机制

对于不同的处理器,他们对异常的处理流程大致相似,但是不同的处理器在具体的实现机制上有问题:比如处理器遇到哪些事件被认为是异常事件遇到异常事件后处理器有哪些操作处理器如何跳转到异常处理程序如何处理异常处理完异常后有如何返回到被打断的程序继续执行等。这些细节称为异常处理机制

ARM如何处理异常

ARM异常源

导致异常产生的事件称为异常源

上述处理机制中的第一条,处理器遇到哪些事件被认为是异常事件,就是哪些事件可以打断正在运行的程序

例如正在上课,老师叫李明出去,这只会打断李明的运行,而不会打断其他人。

ARM的7类异常源

ARM异常源
FIQ快速中断请求引脚有效
IRQ       外部中断请求引脚有效
Reset复位电平有效
Software Interrupt执行swi指令
Data Abort数据终止
Prefetch Abort执行预取中止
Undefined Instruction遇到不能处理的指令

异常模式

在ARM的8个基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式

异常源FIQIRQReset/SWIData Abort/Prefetch AbortUndefined Instruction
异常模式FIQIRQSVCAboutUndef

ARM产生异常后的动作(自动完成)

  1. 拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>(保存内容
  2. 修改CPSR的值
    2.1 修改中断禁止位禁止相应的中断
    2.2 修改模式位进入相应的异常模式
    2.3 修改状态位进入ARM状态
  3. 保存返回地址对应d下的LR_<mode>(保存地址
  4. 设置PC为相应的异常向量(异常向量表对应的地址)

ARM产生异常,会跳转去实现异常处理程序,那么这些动作怎么实现的?

如上,第一步,会将CPSR的内容拷贝到对应异常模式下的SPSR_<mode>

CPSR(Current Program Status Register):当前处理器状态

正如我们所知,ARM处理器做完异常处理后会以当前内容继续执行程序,那么就需要有一个寄存器保存CPSR(当前处理器)的值,即使用SPSR_<mode>来保存CPSR内容。

第二步,修改CPSR值。

我们已经拷贝了之前的CPSR的值,所以可以放心修改。首先要确保它在处理异常时不能被中断。

例如:

我正在写作业,我妈叫我去吃饭,那么我在吃饭的过程中,就不能有其他的中断来影响我,所以直接修改相应的禁止位。

IRQ禁止位被设置为1时,处理器将禁止所有外部中断的触发。就比如正在处理异常时,任何硬件操作信息都不能中断异常进行,但是异常优先级高的可以停止异常优先级低的先执行高优先级异常。

修改值的第二三步就好理解了,当执行异常处理程序时,模式位会变为相应异常模式,而异常处理程序的状态位是ARM状态。

第三步,保存返回地址。

正如我们所知,异常处理结束后会返回到遇到异常地址的下一个地址,不能执行完异常后自己的家都忘了在哪,所以我们需要保存返回地址,以便回到正确的家。

第四步,设置PC为相应的异常向量。

大家发现没有,看了上面三个步骤,好像都是在原地进行的,也就是在遇到异常的那个地址进行的,修改了很多,也保存了很多,但是并没有跳转到异常处理程序中。那么第四步即是跳转操作了,通过设置PC为相应的异常向量,跳转到异常处理程序中。

异常向量表是什么?

  • 异常向量表本质是内存中的一段代码
  • 表中为异常源分配了四个字节的存储空间
  • 遇到异常后处理器自动将PC修改为对应的地址,如下图,IRQ异常PC将会修改为0x18

 思考:

遇到异常后PC会跳转到异常向量表,那么我们能不能在每一个异常向量表下写我们的异常程序?这样可以跳转到对应地址后直接执行,是不是很方便?

答案:

错误,如上述第二点所知,异常向量表只为每个异常源分配了四个字节的内存,而异常程序通常很大,四个字节肯定装不下,所以这种方法是错误的。

那么在对应的异常向量表中,会写一个跳转程序使其跳转到你自己写的异常处理程序入口

ARM异常执行结束后,返回的动作(自己编写)

  1. 将SPSR_<mode>的值复制给CPSR,使处理器恢复之前的状态(内容
  2. 将LR_<mode>的值复制给PC,使程序跳转回被打断的地址继续执行(地址

至此,ARM遇到异常并执行的过程就是这样

总结一下:

网卡或者其他程序发出异常(假设为IRQ),在遇到异常而没跳转之前,那么会执行开头四步骤,赋值,修改,存地址,PC跳转,其中修改操作要进行三步,中断、模式、状态,PC要跳转到对应的异常向量表的异常源地址。这样实现了跳转操作。跳转后,每一个异常源里有跳转程序,这时才跳转到自己写的异常处理程序入口,也就是说跳转到执行异常程序经历了两次跳转。执行过程就是自己写的程序那样执行,执行结束后,会将之前赋值给SPSR_<mode>(存放的内容)值赋值给CPSR,而LR_<mode>(存放的地址)赋值给PC,使其跳转到被打断的地址而且保持之前状态继续执行。

异常优先级

当两个或者多个异常同时被遇到,那么异常处理的顺序就是重要问题,异常优先级就是处理这个问题的关键。

如下表,多个异常同时产生的服务顺序:

注意一下三个:

  • Reset(复位操作)优先级最高
  • FIQ比IRQ优先级高

 FIQ的响应速度比IRQ快的原因

  1. FIQ在异常向量表中位于表尾,所以可以直接把异常处理程序写到异常向量表之后,省去跳转时间。
  2. FIQ模式有5个私有寄存器(r8~r12),执行中断处理程序前无需压栈保存寄存器,可直接处理中断
  3. FIQ的优先级高于IRQ
    1. 两个中断同时发生先响应FIQ
    2. FIQ可以打断RIQ,但是RIQ不能打断FIQ
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
目录 第1 章 ARM 微处理器概述 5 1.1 ARM-Advanced RISC Machines 5 1.2 ARM 微处理器的应用领域及特点 5 1.2.1 ARM 微处理器的应用领域 5 1.2.2 ARM 微处理器的特点 6 1.3 ARM 微处理器系列 6 1.3.1 ARM7 微处理器系列 6 1.3.2 ARM9 微处理器系列 7 1.3.3 ARM9E 微处理器系列 7 1.3.4 ARM10E 微处理器系列 7 1.3.5 SecurCore 微处理器系列 8 1.3.6 StrongARM 微处理器系列 8 1.3.7 Xscale 处理器 8 1.4 ARM 微处理器结构 8 1.4.1 RISC 体系结构 8 1.4.2 ARM 微处理器的寄存器结构 9 1.4.3 ARM 微处理器的指令结构 9 1.5 ARM 微处理器的应用选型 10 1.6 本章小节 10 第2 章 ARM 微处理器的编程模型 11 2.1 ARM 微处理器的工作状态 11 2.2 ARM 体系结构的存储器格式 11 2.3 指令长度及数据类型 12 2.4 处理器模式 12 2.5 寄存器组织 13 2.5.1 ARM 状态下的寄存器组织 13 2.5.2 Thumb 状态下的寄存器组织 15 2.5.3 程序状态寄存器 16 2.6 异常(Exceptions) 18 2.6.1 ARM 体系结构所支持的异常类型 18 2.6.2 对异常的响应 18 2.6.3 从异常返回 19 2.6.4 各类异常的具体描述 19 2.6.5 异常进入/退出小节 20 2.6.6 异常向量(Exception Vectors) 20 2.6.7 异常优先级(Exception Priorities) 21 2.6.8 应用程序中的异常处理 21 2.7 本章小节 21 ARM 应用系统开发详解──基于S3C4510B 的系统设计 2 第3 章 ARM 微处理器的指令系统 22 3.1 ARM 微处理器的指令集概述 22 3.1.1 ARM 微处理器的指令的分类与格式 22 3.1.2 指令的条件域 23 3.2 ARM 指令的寻址方式 23 3.2.1 立即寻址 24 3.2.2 寄存器寻址 24 3.2.2 寄存器间接寻址 24 3.2.3 基址变址寻址 24 3.2.4 多寄存器寻址 25 3.2.5 相对寻址 25 3.2.6 堆栈寻址 25 3.3 ARM 指令集 25 3.3.1 跳转指令 25 3.3.2 数据处理指令 26 3.3.3 乘法指令与乘加指令 30 3.3.4 程序状态寄存器访问指令 32 3.3.5 加载/存储指令 32 3.3.6 批量数据加载/存储指令 34 3.3.7 数据交换指令 35 3.3.8 移位指令(操作) 35 3.3.9 协处理器指令 36 3.3.10 异常产生指令 38 3.4 Thumb 指令及应用 38 3.5 本章小节 39 第4 章 ARM 程序设计基础 40 4.1 ARM 汇编器所支持的伪指令 40 4.1.1 符号定义(Symbol Definition)伪指令 40 4.1.2 数据定义(Data Definition)伪指令 41 4.1.3 汇编控制(Assembly Control)伪指令 43 4.1.4 其他常用的伪指令 45 4.2 汇编语言的语句格式 48 4.2.1 在汇编语言程序中常用的符号 49 4.2.2 汇编语言程序中的表达式和运算符 49 4.3 汇编语言的程序结构 52 4.3.1 汇编语言的程序结构 52 4.3.2 汇编语言的子程序调用 52 4.3.3 汇编语言程序示例 53 4.3.4 汇编语言与C/C++的混合编程 55 4.4 本章小节 56 第5 章 应用系统设计与调试 57 ARM 应用系统开发详解──基于S3C4510B 的系统设计 3 5.1 系统设计概述 57 5.2 S3C4510B 概述 58 5.2.1 S3C4510B 及片内外围简介 58 5.2.2 S3C4510B 的引脚分布及信号描述 61 5.2.3 CPU 内核概述及特殊功能寄存器(Special Registers) 67 5.2.4 S3C4510B 的系统管理器(System Manager) 72 5.3 系统的硬件选型与单元电路设计 82 5.3.1 S3C4510B 芯片及引脚分析 82 5.3.2 电源电路 83 5.3.3 晶振电路与复位电路 83 5.3.4 Flash 存储器接口电路 85 5.3.5 SDRAM 接口电路 89 5.3.6 串行接口电路 93 5.3.7 IIC 接口电路 94 5.3.8 JTAG 接口电路 95 5.3.9 10M/100M 以太网接口电路 96 5.3.10 通用I/O 接口电路 100 5.4 硬件系统的调试 101 5.4.1 电源、晶振及复位电路 101 5.4.2 S3C4510B 及JTAG 接口电路 102 5.4.3 SDRAM 接口电路的调试 103 5.4.4 Flash 接口电路的调试 105 5.4.5 10M/100M 以太网接口电路 105 5.5 印刷电路板的设计注意事项 105 5.5.1 电源质量与分配 105 5.5.2 同类型信号线的分布 106 5.6 本章小节 106 第6 章 部件工作原理与编程示例 107 6.1 嵌入式系统的程序设计方法 107 6.2 部件工作原理与编程示例 108 6.2.1 通用I/O 口工作原理与编程示例 108 6.2.2 串行通讯工作原理与编程示例 111 6.2.3 中断控制器工作原理与编程示例 120 6.2.4 定时器工作原理与编程示例 123 6.2.5 GDMA 工作原理与编程示例 127 6.2.6 IIC 总线控制器工作原理 133 6.2.7 以太网控制器工作原理 138 主要特性 139 MAC 功能模块 140 带缓冲DMA 接口(Buffered DMA Interface) 144 以太网控制器特殊功能寄存器(Ethernet Controller Special Registers) 147 MAC 寄存器(Media Access Control(MAC)Register) 154 以太网控制器的操作(Ethernet Controller Operation) 160 发送一个帧(Transmitting a Frame) 162 ARM 应用系统开发详解──基于S3C4510B 的系统设计 4 接收一个帧(Receiving a Frame) 162 6.2.8 Flash 存储器工作原理与编程示例 162 6.3 BootLoader 简介 167 6.4 本章小节 167 第7 章 嵌入式uClinux 及其应用开发 168 7.1 嵌入式uClinux 系统概况 168 7.2 开发工具GNU 的使用 170 7.2.1 GCC 编译器 170 7.2.2 GNU Make 172 7.2.3 使用GDB 调试程序 177 7.3 建立uClinux 开发环境 180 7.3.1 建立交叉编译器 181 7.3.2 uClinux 针对硬件的改动 184 7.3.3 编译uClinux 内核 185 7.3.4 内核的加载运行 187 7.4 在uClinux 下开发应用程序 188 7.4.1 串行通信 190 7.4.2 socket 编程 195 7.4 .3 添加用户应用程序到uClinux 202 7.4.4 通过网络添加应用程序到目标系统 205 7.5 本章小结 207 第8 章ARM ADS 集成开发环境的使用 209 8.1 ADS 集成开发环境组成介绍 209 8.1.1 命令行开发工具 209 8.1.2 ARM 运行时库 218 8.1.3 GUI 开发环境(Code Warrior 和AXD) 219 8.1.4 实用程序 221 8.1.5 支持的软件 221 8.2 使用ADS 创建工程 222 8.2.1 建立一个工程 222 8.2.2 编译和链接工程 225 8.2.3 使用命令行工具编译应用程序 229 8.3 用AXD 进行代码调试 230 8.4 本章小结 233
似乎搞ARM开发入门都是用这本书。 上网搜了很久,勉强下载下来了 1分,算是搜索小费啦 然后我还转转成了PDF更合适大家看啦!嘿嘿 介绍如下: 目录 第1 章 ARM 微处理器概述 5 1.1 ARM-Advanced RISC Machines 5 1.2 ARM 微处理器的应用领域及特点 5 1.2.1 ARM 微处理器的应用领域 5 1.2.2 ARM 微处理器的特点 6 1.3 ARM 微处理器系列 6 1.3.1 ARM7 微处理器系列 6 1.3.2 ARM9 微处理器系列 7 1.3.3 ARM9E 微处理器系列 7 1.3.4 ARM10E 微处理器系列 7 1.3.5 SecurCore 微处理器系列 8 1.3.6 StrongARM 微处理器系列 8 1.3.7 Xscale 处理器 8 1.4 ARM 微处理器结构 8 1.4.1 RISC 体系结构 8 1.4.2 ARM 微处理器的寄存器结构 9 1.4.3 ARM 微处理器的指令结构 9 1.5 ARM 微处理器的应用选型 10 1.6 本章小节 10 第2 章 ARM 微处理器的编程模型 11 2.1 ARM 微处理器的工作状态 11 2.2 ARM 体系结构的存储器格式 11 2.3 指令长度及数据类型 12 2.4 处理器模式 12 2.5 寄存器组织 13 2.5.1 ARM 状态下的寄存器组织 13 2.5.2 Thumb 状态下的寄存器组织 15 2.5.3 程序状态寄存器 16 2.6 异常(Exceptions) 18 2.6.1 ARM 体系结构所支持的异常类型 18 2.6.2 对异常的响应 18 2.6.3 从异常返回 19 2.6.4 各类异常的具体描述 19 2.6.5 异常进入/退出小节 20 2.6.6 异常向量(Exception Vectors) 20 2.6.7 异常优先级(Exception Priorities) 21 2.6.8 应用程序中的异常处理 21 2.7 本章小节 21 ARM 应用系统开发详解──基于S3C4510B 的系统设计 2 第3 章 ARM 微处理器的指令系统 22 3.1 ARM 微处理器的指令集概述 22 3.1.1 ARM 微处理器的指令的分类与格式 22 3.1.2 指令的条件域 23 3.2 ARM 指令的寻址方式 23 3.2.1 立即寻址 24 3.2.2 寄存器寻址 24 3.2.2 寄存器间接寻址 24 3.2.3 基址变址寻址 24 3.2.4 多寄存器寻址 25 3.2.5 相对寻址 25 3.2.6 堆栈寻址 25 3.3 ARM 指令集 25 3.3.1 跳转指令 25 3.3.2 数据处理指令 26 3.3.3 乘法指令与乘加指令 30 3.3.4 程序状态寄存器访问指令 32 3.3.5 加载/存储指令 32 3.3.6 批量数据加载/存储指令 34 3.3.7 数据交换指令 35 3.3.8 移位指令(操作) 35 3.3.9 协处理器指令 36 3.3.10 异常产生指令 38 3.4 Thumb 指令及应用 38 3.5 本章小节 39 第4 章 ARM 程序设计基础 40 4.1 ARM 汇编器所支持的伪指令 40 4.1.1 符号定义(Symbol Definition)伪指令 40 4.1.2 数据定义(Data Definition)伪指令 41 4.1.3 汇编控制(Assembly Control)伪指令 43 4.1.4 其他常用的伪指令 45 4.2 汇编语言的语句格式 48 4.2.1 在汇编语言程序中常用的符号 49 4.2.2 汇编语言程序中的表达式和运算符 49 4.3 汇编语言的程序结构 52 4.3.1 汇编语言的程序结构 52 4.3.2 汇编语言的子程序调用 52 4.3.3 汇编语言程序示例 53 4.3.4 汇编语言与C/C++的混合编程 55 4.4 本章小节 56 第5 章 应用系统设计与调试 57 ARM 应用系统开发详解──基于S3C4510B 的系统设计 3 5.1 系统设计概述 57 5.2 S3C4510B 概述 58 5.2.1 S3C4510B 及片内外围简介 58 5.2.2 S3C4510B 的引脚分布及信号描述 61 5.2.3 CPU 内核概述及特殊功能寄存器(Special Registers) 67 5.2.4 S3C4510B 的系统管理器(System Manager) 72 5.3 系统的硬件选型与单元电路设计 82 5.3.1 S3C4510B 芯片及引脚分析 82 5.3.2 电源电路 83 5.3.3 晶振电路与复位电路 83 5.3.4 Flash 存储器接口电路 85 5.3.5 SDRAM 接口电路 89 5.3.6 串行接口电路 93 5.3.7 IIC 接口电路 94 5.3.8 JTAG 接口电路 95 5.3.9 10M/100M 以太网接口电路 96 5.3.10 通用I/O 接口电路 100 5.4 硬件系统的调试 101 5.4.1 电源、晶振及复位电路 101 5.4.2 S3C4510B 及JTAG 接口电路 102 5.4.3 SDRAM 接口电路的调试 103 5.4.4 Flash 接口电路的调试 105 5.4.5 10M/100M 以太网接口电路 105 5.5 印刷电路板的设计注意事项 105 5.5.1 电源质量与分配 105 5.5.2 同类型信号线的分布 106 5.6 本章小节 106 第6 章 部件工作原理与编程示例 107 6.1 嵌入式系统的程序设计方法 107 6.2 部件工作原理与编程示例 108 6.2.1 通用I/O 口工作原理与编程示例 108 6.2.2 串行通讯工作原理与编程示例 111 6.2.3 中断控制器工作原理与编程示例 120 6.2.4 定时器工作原理与编程示例 123 6.2.5 GDMA 工作原理与编程示例 127 6.2.6 IIC 总线控制器工作原理 133 6.2.7 以太网控制器工作原理 138 主要特性 139 MAC 功能模块 140 带缓冲DMA 接口(Buffered DMA Interface) 144 以太网控制器特殊功能寄存器(Ethernet Controller Special Registers) 147 MAC 寄存器(Media Access Control(MAC)Register) 154 以太网控制器的操作(Ethernet Controller Operation) 160 发送一个帧(Transmitting a Frame) 162 ARM 应用系统开发详解──基于S3C4510B 的系统设计 4 接收一个帧(Receiving a Frame) 162 6.2.8 Flash 存储器工作原理与编程示例 162 6.3 BootLoader 简介 167 6.4 本章小节 167 第7 章 嵌入式uClinux 及其应用开发 168 7.1 嵌入式uClinux 系统概况 168 7.2 开发工具GNU 的使用 170 7.2.1 GCC 编译器 170 7.2.2 GNU Make 172 7.2.3 使用GDB 调试程序 177 7.3 建立uClinux 开发环境 180 7.3.1 建立交叉编译器 181 7.3.2 uClinux 针对硬件的改动 184 7.3.3 编译uClinux 内核 185 7.3.4 内核的加载运行 187 7.4 在uClinux 下开发应用程序 188 7.4.1 串行通信 190 7.4.2 socket 编程 195 7.4 .3 添加用户应用程序到uClinux 202 7.4.4 通过网络添加应用程序到目标系统 205 7.5 本章小结 207 第8 章ARM ADS 集成开发环境的使用 209 8.1 ADS 集成开发环境组成介绍 209 8.1.1 命令行开发工具 209 8.1.2 ARM 运行时库 218 8.1.3 GUI 开发环境(Code Warrior 和AXD) 219 8.1.4 实用程序 221 8.1.5 支持的软件 221 8.2 使用ADS 创建工程 222 8.2.1 建立一个工程 222 8.2.2 编译和链接工程 225 8.2.3 使用命令行工具编译应用程序 229 8.3 用AXD 进行代码调试 230 8.4 本章小结 233

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值