ARM 异常介绍

2023-11-12

一、中断概念:
  • CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程
  • 硬件引起的中断不可预测,随机性
  • 软中断:事先在程序中安排特殊指令,CPU 执行到该类指令时,转去执行相应的一段预先安排好的程序,然后再返回来执行原来的程序

二、ARM 体系异常分类:
  • 复位异常(Reset)
  • 数据异常(Data Abort)
  • 快速中断异常(FIQ)
  • 外部中断异常(IRQ)
  • 预取异常(Prefetch Abort)
  • 软中断异常(SWI)
  • 未定义异常(Undefined interrupt)

三、异常处理伪代码及 7 种异常
  1. 异常处理伪代码:
R14_<exception_mode> = return link
SPSR_<exception_mode> = CPSR
CPSR[4:0] = exception mode number
CPSR[5] = 0 /*进入 ARM 状态*/
If <enception_mode> == reset or FIQ then
CPSR[6] = 1 /*屏蔽快速中断 FIQ*/
CPSR[7] = 1 /*屏蔽外部中断 IRQ*/
PC = exception vector address
  1. 复位异常
  • 概念
当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,复位异常中断通常用于系统上电和系统复位两种情况。
  • 步骤:
设置异常中断向量表
初始化数据栈和寄存器
初始化存储系统,如系统中的 MMU
初始化关键的 I/O 设备
使能中断
处理器切换到合适的模式
初始化C变量,跳转到应用程序执行
  • 伪代码
R14_svc = UNPREDICTABLE value
SPSR_svc = UNPREDICTABLE value
CPSR[4:0] = 0B10011 /*进入特权模式*/
CPSR[5] = 0 /*处理器进入 ARM 态*/
CPSR[6] = 1 /*禁止快速中断*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0000
Else
PC = 0x00000000
  1. 未定义指令异常
  • 概念
当 ARM 处理器执行协处理器指令时,它必须等待一个外部协处理器答应后,才能真正执行这条指令。若协处理器没有响应,则发生未定义指令异常。未定义指令异常可用于在没有物理协处理器的系统上,对协处理器进行软件仿真,或通过软件仿真实现指令集扩展。
  • 步骤
将仿真程序入口地址链接到向量表中未定义指令异常中断入口处(0x00000004 或 0xffff0004),并保存原来的中断处理程序
读取该未定义指令的 bits[27:24],判断其是否是一条协处理器指令。如果 bits[27:24]值为 0b1110 或 0b110x,则该指令是一条协处理器指令;否则由软件仿真实现协处理器功能,可以通过 bits[11:8] 来判断要仿真的协处理器功能(类似于 SWI 异常实现机制)
如果不仿真该未定义指令,则程序跳转到原来的未定义指令异常中断的中断处理程序行
  • 伪代码
r14_und = address of next instruction after the undefined instruction
SPSR_und = CPSR
CPSR[4:0] = 0b11011 /*进入未定义指令模式*/
CPSR[5] = 0 /*处理器进入 ARM 状态*/
/*CPSR[6] 保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff00004
Else
PC = 0x00000004
  1. 软中断异常
  • 概念
这是一个由用户定义的中断指令(SWI)。该异常由执行 SWI 指令产生,可用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制实现系统功能调用。
  • 伪代码
r14_svc = address of next instruction after the SWI instruction
SPSR_und = CPSR
CPSR[4:0] = 0b10011 /*进入特权模式*/
CPSR[5] = 0 /*处理器进入 ARM 态*/
/*CPSR[6] 保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff000C
Else
PC = 0x0000000C
  1. 预取异常
  • 概念
预取异常是由系统存储器报告的。当处理器预取的指令的地址不存在,或者该地址不允许当前指令访问(权限不够)时,将产生预取异常。
如果系统中不包含 MMU,指令预取异常中断处理程序只是简单地报告错误并退出;若包含 MMU,引起异常的指令的物理地址被存储到内存中。
  • 伪代码
r14_svc = address of the aborted instruction + 4
SPSR_und = CPSR
CPSR[4:0] = 0b10111
CPSR[5] = 0
/*CPSR[6] 保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff000c
Else
PC = 0x0000000c
  1. 数据异常
  • 概念
数据异常是由存储器发生数据中止信号,它由存储器访问指令 Load/Store 产生。 
当数据访问指令的目标地址不存在,或者该地址不允许当前指令访问(权限不够)时,将产生数据访问中止异常。
  • 产生数据访问中止异常时,寄存器的值修改规则
r14 的值只与发生数据异常的指令地址有关,与 PC 值无关
如果指令中没有指定基址寄存器回写,则基址寄存器的值不变
如果指令中指定了基址寄存器回写,则寄存器的值和具体芯片的 Abort Models 有关,由芯片的生成商指定
如果指令只加载一个通用寄存器的值,则通用寄存器的值不变
如果是批量加载指令,则寄存器中的值不可预知
如果指令加载协处理器寄存器的值,则被加载寄存器的值不可预知
  • 伪代码
r14_abt = address of the aborted instruction + 8
SPSR_abt = CPSR
CPSR[4:0] = 0b10111
CPSR[5] = 0
/*CPSR[6] 保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0010
Else
PC = 0x00000010
  1. 外部中断异常
  • 概念
当处理器的外部中断请求引脚有效,而且 CPSR 的寄存器的 I 控制位被清除时,处理器产生外部中断请求异常中断。系统中各外设通过该异常中断请求处理服务。
  • 伪代码
r14_abt = address of the next instruction to be executed + 4
SPSR_irq = CPSR
CPSR[4:0] = 0b10010 /*进入特权模式*/
CPSR[5] = 0 /*处理器进入 ARM 状态*/
/*CPSR[6] 保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0018
Else
PC = 0x00000018
  1. 快速中断异常
  • 概念
当处理器的外部快速中断请求引脚有效,而且 CPSR 的 F 控制位被清除时,处理器产生外部快速中断请求异常中断。
  • 伪代码
r14_abt = address of the next instruction to be executed + 8
SPSR_fiq= CPSR
CPSR[4:0] = 0b10001 /*进入FIQ模式*/
CPSR[5] = 0
CPSR[6] = 1
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff001c
Else
PC = 0x0000001c

四、FIQ 与 IRQ 比较
  • 相同点
都只是普通中断:
当我们程序定义了该中断,并且在程序运行的时候产生了 IRQ/FIQ 中断,则此时的芯片运行过程:①中断处理器利用IRQ请求线来告诉ARM,②ARM切换到 IRQ/FIQ 模式运行
  • 不同点
FIQ 速度快,IRQ 速度慢,原因:
  1. FIQ模式提供了更多的寄存器,r8-r14 和 SPSR,而 IRQ 模式只有 r13-r14 和 SPSR,这就意味着在ARM的IRQ模式下,中断处理程序自己要保存R8到R12这几个寄存器,然后退出中断处理时程序要恢复这几个寄存器,而FIQ模式由于这几个寄存器都有banked寄存器,模式切换时CPU自动保存这些值到banked寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快.不要小看这几个寄存器,ARM在编译的时候,如果你FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。
  2. FIQ 比 IRQ 有更高优先级,如果 FIQ 和 IRQ 同时产生,那么 FIQ 先处理。
  3. 在symbian系统里,当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软中断全被禁止,所有的中断被屏蔽。所以FIQ就会很快执行,不会被其他异常或者中断打断,所以它又比IRQ快了。而IRQ不一样,当ARM处理IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ,所以FIQ比IRQ快多了。
  4. 另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM 异常介绍 的相关文章

  • 线程安全的向量和字符串容器?

    我之前发过一个问题 在嵌入式 Linux 平台上使用 std string 时出现段错误 https stackoverflow com questions 2412667 seg fault when using stdstring on
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • RAM 存储二进制数和汇编语言的冒泡排序

    我必须使用 ARM v7 执行一个例程 在 RAM 内存中存储 10 个二进制数 然后使用冒泡排序对这些数字从高到低进行排序 我应该如何开始 func bubbleSortAscendingU32 ldr r3 r0 4 mov r1 9
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者

随机推荐

  • 汽车保养项注意-2

    基本信息 大众朗逸刹车油每4万公里可更换一次 价格在200元左右 这应该定期更换 5万换一次即可 刹车片6 8万公里换一次 刹车盘7万公里 发动机内部养护 燃油系统养护 四轮定位是对整车行车轨迹的检查修正 包括悬挂 底盘 零部件等的调整 动
  • OAuth2四种模式

    OAuth2四种模式 一 隐式授权模式 Implicit Grant 流程图 步骤 优缺点及适用场景 二 授权码授权模式 Authorization code Grant 流程图 步骤 优缺点及适用场景 三 密码模式 Resource Ow
  • 计算机操作系统中常用算法总结

    计算机操作系统中常用算法总结 一 动态分区分配算法 1 首次适应算法 最先适应算法 按照分区的先后次序 从头开始查找 找到符合要求的第一个分区 2 循环首次适应算法 下次适应算法 按照分区的先后次序 从上次已分配的分区起查找 到达最后一个分
  • 上知天文,下知地理,还能替人写脚本!人工智能的进阶ChatGPT

    ChatGPT是OpenAI在11月30日推出的聊天机器人 于12月1日起对公众免费开放 自从这东西出来之后 大家对此的讨论热情越发浓烈 ChatGPT具体可以干些什么 帮你写论文 检讨书 情书 甚至情诗也能信手拈来 以上都是网友测试它写出
  • python numpy数组

    1 数组创建 import numpy arr numpy array 11 22 33 44 55 print arr 输出 11 22 33 44 55 数组属性查看 print type arr 输出
  • java 注解 @Retention @interface 元数据

    java注解 即是注释了 百度解释 也叫元数据 一种代码级别的说明 个人理解 就是内容可以被代码理解的注释 一般是一个类 元数据 也叫元注解 是放在被定义的一个注解类的前面 是对注解一种限制 只有两个 Retention 和 Target
  • 程序员常见系统错误代码大全:1到15841

    程序员常见系统错误代码大全 1到15841 提示 使用浏览器的Ctrl F键盘组合来搜索错误代码 要么搜索错误消息本身 要么只搜索错误代码 例如 错误代码635 系统错误代码大全 1到15841 错误代码1 功能不正确 ERROR INVA
  • IDEA获取gitee仓库的数据时,发生错误

    以本人遇到的情况为例 以上错误与本地的代码没有关系 主要原因是gitee仓库上的application yml配置文件的格式编写有误所导致 修改正确之后即可成功获取
  • DTO与Entity相互转化

    import java lang reflect Method import java util concurrent ConcurrentHashMap import org slf4j Logger import org slf4j L
  • 关于path用变量的问题思考

    1 用go解析路由时 中间件里相对路由做统一处理 或者是对于一组路由做处理 只能挨个正则去匹配 要不就多写代码 侵入业务 2 路由不可读 命名再不规范的话 抓包也痛苦 需要看代码才能理解这个接口是做什么的 和前端对接口时 前端 接口名字是什
  • 微服务回归单体,代码行数减少75%,性能提升1300%

    关注并星标腾讯云开发者 每周3 谈谈我在腾讯的架构设计经验 第5期 李浩津 13倍性能重构 搜索内容架构 C 微服务群改造 内容架构是 QQ 浏览器搜索的内容接入和计算层 主要负责腾讯域内的内容接入和处理 当前接入了多个合作方的上千类内容
  • leaflet可视化平台搭建

    leaflet viz Leaflet可视化平台 https github com zrysmt leaflet viz leaflet是一个开源的前端地图交互类库 比较轻量级 支持移动端 而且有丰富的插件资源可供我们使用 Echarts是
  • matplotlib绘制3d图形出现空白,解决办法

    如果出现如下图空白 或者出现下面报错MatplotlibDeprecationWarning Axes3D fig adding itself to the figure is deprecated since 3 4 Pass the k
  • 三大框架 之 Hibernate查询(一对多、多对多、查询关系)

    目录 一对多 表之间关系 表之间关系建表原则 一对多关系配置 建立表 建立ORM 添加配置文件 在hibernate cfg xml中的标签里 添加核心配置文件 引入工具类 编写测试类 级联操作 什么是级联 级联分类 级联是有方向性 级联保
  • openfeign使用报错:No Feign Client for loadBalancing defined.

    错误描述 nested exception is java lang IllegalStateException No Feign Client for loadBalancing defined Did you forget to inc
  • DDR中的ODT功能详解及波形对比

    ODT on die termination 即为片内端接 就是将端接电阻放在了芯片内部 这个功能只有在DDR2以上的数据信号才有 而有了ODT功能 原本需要在PCB板上加串联电阻的数据信号就不需要再额外添加端接了 只需要芯片内部打开ODT
  • 敌兵布阵

    http acm hdu edu cn showproblem php pid 1166 Problem Description C国的死对头A国这段时间正在进行军事演习 所以C国间谍头子Derek和他手下Tidy又开始忙乎了 A国在海岸线
  • java将两个有序链表合并成有序链表

    利用递归法将两有序链表合并成链表 且合并后的链表仍然有序 比较链表1和链表2的第一个结点数据 如果head1 data
  • DDoS攻击重大历史事件

    历史上有名ddos的攻击事件很多 涉及行业包括政治 经济 军事等各个行业 下面列举一下2016年比较有名的几起DDOS事件 1 暴雪DDoS攻击 LizardSquad组织对暴雪公司战网服务器发起DDoS攻击 包括 星际争霸2 魔兽世界 暗
  • ARM 异常介绍

    一 中断概念 CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程 硬件引起的中断不可预测 随机性 软中断 事先在程序中安排特殊指令 CPU 执行到该类指令时 转去执行相应的一段预先安排好的程序 然后再返回来执行原来的