ARM体系结构详解之ARM异常处理

合集下载

ARM的七种异常类型

ARM的七种异常类型

ARM7支持六种操作模式:(1)用户模式(usr):正常的程序执行状态(2)FIQ模式(fiq):支持数据传送或通道处理(3)IRQ模式(irq):用于通用的中断处理(4)管理模式(svc):用于操作系统的保护模式(5)异常模式(abt):数据或者指令预取异常时进入(6)无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。

大部分的应用程序在用户模式下执行。

其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。

ARM 的中央寄存器集是16 个用户寄存器R0 – R15。

这些寄存器均是32 位宽度,R0 – R12 没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。

R13被用作栈指针(stack pointer,SP)。

R14被称为链接寄存器(link register, LR),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。

这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。

如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(R13)。

R15 是程序计数器(program counter, PC)。

有趣的是,许多指令也可以在R13 – R15中执行,就像它们是标准的用户寄存器。

ARM中断的问题ARM的七种异常类型---------1> 复位异常2> 数据访问中止异常3> 快速中断请求异常4> 一般中断请求5> 预取指令异常6> 软件中断异常7> 未定义异常-------------------------问题:1> 为什么除了进入复位异常模式外,在别的异常处理模式中都允许FIQ中断?2> 数据访问中止异常的优先级大于 FIQ异常,为什么在数据访问异常处理模式中,还允许 FIQ中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为FIQ中断的优先级 < 数据异常中断优先级,也不会进入 FIQ中断处理程序啊,这样不就更没有用处了??ARM体系的各种异常的分析(学习日记)- [ARM7TDMI]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/10669519.html1.复位异常(1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;(2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC(0x00000000)和CPSR (nzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。

ARM的异常处理学习笔记转贴

ARM的异常处理学习笔记转贴

ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。

当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。

当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。

在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。

1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。

(2)、外部产生的中断复位、FIQ、IRQ。

2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。

b、通过设置PC跳转到复位中断向量处执行称为软复位。

(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。

(3)、软件中断这是一个由用户定义的中断指令(SWI)。

可用于用户模式下的程序调用特权操作指令。

在实时操作系统中可以通过该机制实现系统功能调用。

(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。

(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。

(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。

系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。

(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。

ARM体系结构与编程

ARM体系结构与编程
规则: | ARMv | n | variants | x(variants) | 分成四个组成部分: ·ARMv -- 固定字符,即ARM Version ·n -- 指令集版本号。迄今为之,ARM架构版本发布了7个系列, 所以n=[1:7]。其中最新的版本是第7版 ·variants -- 变种。 ·x(variants) -- 排除x后指定的变种 常见的变种有: ·T -- Thumb指令集 ·M -- 长乘法指令 ·E -- 增强型DSP指令 ·J -- Java加速器Jazelle ·SIMD -- ARM媒体功能扩展
和嵌入式微处理器相比,微控制器的最大特点是单片化,体积大大减小 ,从而使功耗和成本下降、可靠性提高。微控制器是目前嵌入式系统工业的 主流。微控制器的片上外设资源一般比较丰富,适合于控制,因此称微控制 器。
嵌入式微控制器
嵌入式微控制器目前的品种和数量最多,比较有代表性的通用 系列包括8051、P51XA、MCS-251、MCS-96/196/296、 C166/167、MC68HC05/11/12/16、68300等。另外还有许多半通 用系列如:支持USB接口的MCU 8XC930/931、C540、C541; 支持I2C、CAN-Bus、LCD及众多专用MCU和兼容系列。目前
2021/2/5
ARM分类
基于指令集体系结构(构架ISA)的分类 ARM V1 体系是最初版本,只有26位的寻址空间,没有乘法指 令,最终没有商业化 ARM V2 体系与V1体系同为26位寻址空间,具有乘法和加法指 令,支持协处理器 ARM V3 体系的寻址范围扩展到32位,具有乘法和加法指令, 支持协处理器 ARM V4 体系增加了半字存储操作,对调试的支持以及支持嵌 入的ICE ARM V5 体系增加了DSP指令支持和对Java指令的支持 ARM V6 体系增加了媒体指令,ARMv6指令集合中加入了超过 60条SIMD单指令多数据指令 ARM V7 体系定义了三种独立的内核型--A(应用领域), R( 实时领域),M(控制领域)

arm 解决程序崩溃的方法

arm 解决程序崩溃的方法

在ARM架构中,程序崩溃可能由很多原因导致,例如硬件故障、软件错误、内存问题等。

解决程序崩溃的方法需要根据具体的原因来决定:
1. 硬件故障:如果程序崩溃是由于硬件故障引起的,那么需要修复或更换硬件组件。

例如,如果存储器出现故障,则可能需要更换存储器芯片。

2. 软件错误:如果程序崩溃是由于软件错误引起的,那么需要调试程序以查找错误原因。

这可以通过使用调试器、查看日志文件、进行backtrace等方法来实现。

3. 内存问题:如果程序崩溃是由于内存问题引起的,那么需要检查程序的内存访问模式。

例如,如果程序访问了无效的内存地址,则需要进行内存修复或增加内存空间。

4. 对于想要生成core文件的异常情况,需要进行以下配置:sysctl -w kernel.core_pattern=/mnt/core.%e.%p chmod 666 /mnt/ -R ulimit -c unlimited。

这样在程序崩溃时,就会在/mnt目录下生成core文件,然后可以使用gdb进行调试。

解决程序崩溃需要具体问题具体对待,一般需要调试程序以查找错误原因,并根据错误原因采取相应的措施来修复程序。

ARM 处理器工作状态与工作模式 ARM 体系结构所支持的异常

ARM 处理器工作状态与工作模式 ARM 体系结构所支持的异常

深入内核逻辑一个宇宙通用的事实是:结构决定功能!我们以典型的ARM嵌入式处理器内核的一般特征为例,,看看ARM设想的功能是如何被“构造”出来的。

主要说两个内容:•ARM处理器工作状态与工作模式•ARM体系结构所支持的异常基础概念字(Word):在ARM体系结构中,字的长度为32位(在8位/16位处理器体系结构中,字的长度一般为16位)。

•半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度一致。

•字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位。

问:计算机存储设备是按______ (A:字Word,B:半字Half-Word,C:字节Byte)编址的。

处理器工作状态ARM状态:正在执行ARM指令的处理器的状态。

Thumb状态:正在执行Thumb指令的处理器的状态。

不同的状态下,代码密集度不同,,ARM状态按字(32位)存储代码,Thumb状态按半字(16位)存储代码,这种特性有利于我们在必要的时候调整单位存储空间的代码容量,压缩代码占用空间。

这两个状态可以根据情况软件切换,,,后面我们还会再次提到这个话题,,,Note:对于ARM 32位处理器,两种状态下代码存储密集度不同,但在执行时仍是32位的!这就是说,代码可以压缩,但执行效率并不会下降,CPU仍是按字执行的啊!不过,Thumb状态下的指令的使用有某些限制,属于ARM状态下的指令的一个子集。

另外,调整代码密集度的优点在后来的ARM一些版本中可以自动切换,,,不需要程序员再过多费神,这就是所谓Thumb2状态:一种混合型指令集,降低功耗具有高代码压缩性处理器工作模式回顾,前面说过ARM内核采用了大量内部寄存器的特性,,以便有利于支持流水线技术,,,那么这些“大量内部寄存器”如何运作?工作模式本质上就是指内核中的这堆寄存器的功能分配和使用方法ARM处理器内部寄存器一起看,,这里一共有37个32位寄存器•其中,31个通用寄存器,包括程序寄存器(PC);•6个状态寄存器:。

ARM体系结构详解精

ARM体系结构详解精

ARM嵌入式系统第2章ARM体系结构ARM微处理器的编程模型♦ARM徴处理器的工作状态♦ARM体系结构的存储器格式♦ARM体系结构的指令长度及数据宽度♦ARM微处理器的处理器模式♦ARM体系结构的寄存器组织♦ARM微处理器的异常状态字、半字、字节字(Word)在ARM体系结构中,字的长度为32位半字(Half-Word)在ARM体系结构中,半字的长度为16位字节(Byg)在ARM体系结构中,字节的长度为8位。

ARM微处理器的工作状态(1)字对齐:四字节对齐半字对齐:两字节对齐两种状态:♦ARM状态:处理器执行32位的字对齐的令♦Thumb状态:处理器执行16位的、半字对齐的Thumb指令处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。

I ARM微处理器的工作状态(2 )状态切换:BX {<cond>} <Rm><cond>指令的条件码。

忽略时无条件执行。

<Rm>子存器中为跳转的目标地址,当<Rm><存器的bit[O]为0时, 目标地址处的指令为ARM指令;当<Rm>^存器的bit[O]为1时,目标地址处的指令为Thumb 指令。

伪代码:if ConditionPassed(cond) thenT Flag=Rm[O]PC=Rm AND OxFFFFFFFEARM微处理器在复位或上电时处于ARM状态,发生异常时处于ARM状态。

右ARM体系结构的存储器格式(1)ARM体系结构所支持的最大寻址空间为4GB (2^字节)♦大端格式(Big Endian)字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

♦小端格式(Little Endian)低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

字地址字地址右ARM 体系结构的存储器格式(2)(0H)=0123H (4H)=4567H (8H)=89ABHBig Endian(0H)=3210H (4H)=7654H (8H)=BA98HLittle Endian右ARM 体系结构的存储器格式(3)8 9 AB4 5 6 7 0123一 “A ・■ • rO= 0x11223344 I 11 I 22 33 : 44 ILittle endian Big endianR2 =异FI*右 ARM 体系结构的指令长度及数据宽度♦指令长度:32位(在ARM 状态下) 16位(在Thumb 状态下)♦数据宽度: 字节(8位) 半字(16位) 字(32位)三种数据宽度对存储器及外部设备的访问。

ARM异常处理机制

ARM异常处理机制

关键词: ARM;异常处理;异常中断;VIC;SWI
中图分类 号:TP311. 11
文献标识码:A
作为嵌入式系统处理器,为了保证系统的实时 性和程序执行的稳定性,ARM 处理器建立了一套 完整的异常处理机制。ARM 处理器共有 7 种异常
NOP LDR LDR
;保留向量 PC, IRQ_Addr PC, FIQ_Add r
3)将返回地址修正为 PC 4,并保存到相应 的 LR 寄存器中;
4)异常向量地址入 PC,跳转并执行中断服务 程序。
1.2 用户程序中需要关心的问题
1)异常向量的重新定位
收稿日期:2006-01-07
作者简介:李 莉(1974 - ),女,山东青岛人。硕士,讲师。主要研究方向为单片机及嵌入式系统。
快速中断请求 FIQ
FIQ 模式
各异常都有固定的优先级,依次为:复位、数
据中止、FIQ、IRQ、预取指中止、未定义指令和
SWI。由表 1 可知,各异常向量之间只有 4 个字节
的空间,因此通常在向量表中放置跳转指令,程序
如下:
Vectors
LDR LDR LDR LDR LDR
PC , R eset_Addr PC , Undef_Addr PC , SWI_Ad dr PC , PAbt_Addr PC , DAbt_Addr
未定义指令
未定义模式
0x00000 008
软件中断 (SWI)
特权模式
0x00000 00C 预取指中止(从存储器取指出错) 中止模式
0x00000 010 数据中止(数据访问存储器出错) 中止模式
0x00000 014
保留
保留
0x00000 018

关于ARM的内核架构介绍

关于ARM的内核架构介绍

张凌001关于ARM的内核架构很多时候我们都会对M0,M0+,M3,M4,M7,arm7,arm9,CORTEX-A系列,或者说AVR,51,PIC等,一头雾水,只知道是架构,不知道具体是什么,有哪些不同?今天查了些资料,来解解惑,不是很详细,但对此有个大体了解。

咱先来当下最火的ARM吧1.ARMARM即以英国ARM(Advanced RISC Machines)公司的内核芯片作为CPU,同时附加其他外围功能的嵌入式开发板,用以评估内核芯片的功能和研发各科技类企业的产品.ARM 微处理器目前包括下面几个系列,以及其它厂商基于 ARM 体系结构的处理器,除了具有ARM 体系结构的共同特点以外,每一个系列的 ARM 微处理器都有各自的特点和应用领域。

- ARM7 系列- ARM9 系列- ARM9E 系列- ARM10E 系列- ARM11系列- Cortex 系列- SecurCore 系列- OptimoDE Data Engines- Intel的Xscale- Intel的StrongARM ARM11系列2. Cortex 系列32位RISCCPU开发领域中不断取得突破,其设计的微处理器结构已经从v3发展到现在的v7。

Cortex 系列处理器是基于ARMv7架构的,分为Cortex-M、Cortex-R和Cortex-A三类。

由于应用领域的不同,基于v7架构的Cortex处理器系列所采用的技术也不相同。

基于v7A的称为“Cortex-A系列。

高性能的Cortex-A15、可伸缩的Cortex-A9、经过市场验证的Cortex-A8处理器以及高效的Cortex-A7和Cortex-A5处理器均共享同一体系结构,因此具有完整的应用兼容性,支持传统的ARM、Thumb指令集和新增的高性能紧凑型Thumb-2指令集。

1Cortex-M系列Cortex-M系列又可分为Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4;2Cortex-R系列Cortex-R系列分为Cortex-R4、Cortex-R5、Cortex-R7;3Cortex-A 系列Cortex-A系列分为Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A50等 ,同样也就有了对应内核的Cortex-M0开发板、Cortex-A5开发板、Cortex-A8开发板、Cortex-A9开发板、Cortex-R4开发板等等。

ARM架构

ARM架构
R15(PC) 状态寄存器 CPSR SPSR R15 CPSR
R13(SP)
R13
R13
R13_svc R13_svc R14_svc R14_svc
2-3-1 ARM状态下的寄存器组织
寄存器类别 寄存器在汇编中的名 称 用户 用户 R0(a1) R1(a2) R2(a3) R3(a4) R4(v1) R5(v2) R6(v3) 通用寄存器 和程序计数 器 R7(V4) R8(V4) R9(SB,v6) R0 R0 R1 R1 R2 R2 R3 R3 R4 R4 R5 R5 R6 R6 R7 R7 R8 R8 R9 R9 R10 R10 R11 R11 R8 R9 各模式下实际访问的寄存器 系统 系统 管理 管理 中止 中止 R0 R1 R2 R3 R4 R5 R6 R7 R8_fiq R8_fiq R9_fiq R9_fiq R10_fiq R10_fiq R11_fiq R11_fiq 未定义 未定义 中断 中断 快中断 快中断
1-4-1 常见ARM微处理器系列介绍
ARM9系列微处理器在高性能和低功耗特性方面提供 最佳的性能:
5级整数流水线,指令执行效率更高。 提供1.1MIPS/MHz的哈佛结构。 支持32位ARM指令集和16位Thumb指令集。 支持32位的高速AMBA总线接口。 全性能的MMU,支持Windows CE、Linux、Palm OS 等多种主流 嵌入式操作系统。 MPU支持实时操作系统。 支持数据Cache和指令Cache,具有更高的指令和数据处理能力。
2-1 ARM微处理器的工作状态
处理器状态: ARM9处理器内核使用V4T版本的ARM结构,具有 两种操作状态:
ARM状态:32位,这种状态下执行的是字方式的ARM指令 Thumb状态:16位,这种状态下执行半字方式的ARM指令。

arm异常处理 el级别

arm异常处理 el级别

arm异常处理 el级别ARM异常处理 EL级别ARM处理器是一种广泛应用于嵌入式系统和移动设备的处理器架构。

在ARM架构中,异常处理是一种重要的机制,用于处理硬件或软件引发的异常情况。

其中,EL级别异常(Exception Level)是ARM处理器中一种特殊的异常级别,本文将详细介绍EL级别异常处理的相关内容。

一、EL级别异常概述在ARM处理器中,异常分为四个级别:EL0、EL1、EL2和EL3。

EL0是用户级别,用于运行应用程序;EL1是内核级别,用于操作系统内核的运行;EL2和EL3是虚拟化扩展级别,用于虚拟化和安全扩展。

EL级别异常是指在特定级别下发生的异常情况。

二、EL级别异常分类EL级别异常主要分为同步异常和中断异常两类。

1. 同步异常同步异常是指由当前指令执行引起的异常,包括:- 未定义指令异常:执行未定义的指令时触发的异常。

- 系统调用异常:执行系统调用指令(例如Linux中的int 0x80)时触发的异常。

- 中止异常:执行中止指令(例如ARM的bkpt指令)时触发的异常。

- 数据访问异常:读写未映射内存、权限不足或对只读内存进行写操作时触发的异常。

2. 中断异常中断异常是指由外部中断或定时器中断引起的异常,包括:- 外部中断:来自外部设备的中断信号,如键盘输入、网络数据到达等。

- 定时器中断:由定时器触发的周期性中断信号。

三、EL级别异常处理流程EL级别异常处理的基本流程如下:1. 异常触发当发生同步异常或中断异常时,ARM处理器会自动进入异常模式,并切换到相应的EL级别。

2. 异常处理器异常处理器是用于处理异常的特殊代码段,通常由操作系统提供。

在异常模式下,ARM处理器会跳转到异常处理器的入口地址。

3. 异常处理异常处理器根据异常类型进行相应的处理,可能包括:- 保存当前上下文:将当前被打断的程序状态保存到特定的寄存器或栈中,以便在异常处理完成后能够恢复执行。

- 处理异常原因:根据异常类型进行相应的处理,如处理未定义指令异常、权限异常等。

ARM异常中断以及对ARM异常返回地址的分析

ARM异常中断以及对ARM异常返回地址的分析
处理器动作: 执行完当前指令后,进入中断异常 R14_irq = address of next instruction to be executed + 4; SPSR_irq = CPSR; …. …. If high vectors configured then PC = 0xFFFF0018 Else PC = 0x00000018
返回地址:SUBS PC,R14,#8 返回地址分析: 当进入异常时,R14_abt = address of the aborted instruction + 8
所以要返回到有问题的指令处重新执行,所以返回的地址为 R14-8 IRQ 中断异常:
产生原因: 当处理器的外部中断请求引脚有效,且 CPSR 寄存器的 I 控制位被清除 时,处理器产生外部中断 IRQ 异常。
是因为当前指令即引起软件异常中断的指令执行后所引起的,说明当前指令已近执行,当从
中断返回时,执行的指令应该是当前指令的下一条指令,即待执行指令的地址应该是 0x3004, 而 R14 中存放的即为 0x3004,所以返回时使用将 R14 的值直接赋给 PC 即可。
指令预期中止异常: 发生原因:若在指令预取阶段遇到无效指令时,系统存储器将该预取的指令标记为无
效指令,当处理器试图去执行这一条被标记为预取无效的指令时,将产生指令预取中止异常, 注意若处理器没有执行无效指令时将不会产生异常中断(在流水线中存在一条分支指令,导 致该非法指令没有执行,将不会产生该异常)。
处理器动作: R14_abt = address of the aborted instruction + 4 SPSR_abt = CPSR ….. …..
2、各异常分析
举个小例子,下面是一段 ARM 汇编代码: (后面的返回地址分析中将会用到此图)

arm处理器异常中断响应过程

arm处理器异常中断响应过程

arm处理器异常中断响应过程ARM处理器是一种广泛应用于移动设备、嵌入式系统和服务器等领域的处理器架构。

在运行过程中,处理器可能会遇到各种异常情况,如访问非法内存、除零错误等。

当这些异常发生时,ARM处理器需要做出相应的中断响应,以保证系统的稳定性和安全性。

ARM处理器异常中断响应的过程可以分为异常触发、异常处理和恢复执行三个阶段。

首先是异常触发阶段。

当处理器在执行指令时,发生了某种异常情况,例如访问了非法的内存地址,处理器会立即检测到异常,并将当前指令的状态保存起来。

同时,处理器会根据异常类型,确定异常向量的地址,将控制转移到异常向量所指向的地址处。

接下来是异常处理阶段。

当处理器进入异常向量所指向的地址时,会执行相应的异常处理程序。

这个程序通常是由操作系统或应用程序提供的,用于处理不同类型的异常。

在异常处理程序中,可以进行一系列的操作,例如保存现场、记录异常信息、处理异常原因等。

处理程序还可以根据需要选择继续执行或终止当前指令。

最后是恢复执行阶段。

在异常处理程序执行完毕后,处理器会根据异常返回地址,将控制权返回到引发异常的指令处,继续执行后续指令。

在返回之前,处理器可能会进行一些必要的恢复操作,如恢复现场、清除异常状态等。

这样,系统就可以继续正常运行,不受异常的影响。

需要注意的是,ARM处理器还提供了一些特殊的异常处理方式,如中断(Interrupt)和陷阱(Trap)。

中断是外部设备触发的异常,用于异步事件的处理,例如外部设备的输入输出请求。

陷阱是由程序主动触发的异常,用于实现系统调用和调试功能。

这些异常的触发和处理方式与一般异常略有不同,但整体的处理过程仍然符合前述的异常中断响应流程。

在ARM处理器中,异常中断响应是保证系统正常运行和异常处理的关键环节。

通过合理的异常处理程序和恢复机制,可以有效地应对各种异常情况,提高系统的可靠性和稳定性。

同时,开发人员也需要根据具体应用场景和需求,灵活地配置和调整异常处理方式,以满足不同的需求。

第三节ARM体系结构

第三节ARM体系结构
SPSR_fiq
一般的通用寄存器
寄存器类别 寄存器在汇编中的名称
用户
系统
R0(a1)
R1(a2)
R2(a3)其中R0~R7为
R3(a4)
未R分4(v1) 组的寄存器,也
通用寄存器 和程序计数

就R是5(v2) 说对于任何处理 R6(v3)
器R模7(v4) 式,这些寄存器 都对应于相同的32位 R8(v5)
管理 (svc) 操作系下统保访护问代码用户模系统式复位的和寄软件存中器断响就应比时进较入方此模式
中止 (abt) 未定义 (und)
用或于存支储便 可持器虚 保,以拟护而使内存且用和操这/ 作个在A系模RM统式7TD的访MI一问没有些一大用特 些处权 受任 控务 的 支软持件硬仿资件真协源处。理器的 未定义指令异常响应时进入此模式
各模式下实际访问的寄存器
用户
系统
管理
中止
未定义
RR00
在汇编语言中寄存
R1
器R0~R13为保存数据
R2
或地址值的通用寄存器。
R3
它们是完全通用的寄存器, R4
不会被体系结构作为特殊
R5
用途,并且可用于任何使
R6
用通用寄存器的指令。
R7
R8
R9
R10
R11
R12
R13
RR1133__ssvc
R13_abt
SSPPSSRR__fifqiq
ARM状态各模式下可以访问的寄存器
寄存器类别 寄存器在汇编中的名称
通用寄存器和 程序计数器
状态寄存器
R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13(SP) R14(LR) R15(PC) CPSR SPSR

简述arm处理器异常处理过程

简述arm处理器异常处理过程

简述arm处理器异常处理过程ARM处理器是一种常用的嵌入式处理器架构,广泛应用于移动设备、嵌入式系统和物联网等领域。

在ARM处理器的运行过程中,会出现各种异常情况,如硬件故障、软件错误等。

为了保证系统的稳定性和可靠性,ARM处理器采用了异常处理机制来处理这些异常情况。

ARM处理器的异常处理过程可以分为两个阶段:异常发生阶段和异常处理阶段。

异常发生阶段是指异常事件发生时的处理过程,而异常处理阶段是指异常事件被捕获后的处理过程。

在异常发生阶段,ARM处理器会首先检测到异常事件的发生,并保存当前的处理状态。

然后,根据异常事件的类型,ARM处理器会进入相应的异常处理程序。

ARM处理器支持的异常类型包括中断、数据终止、指令终止、外部中断等。

每种异常类型都有对应的异常处理程序。

在异常处理阶段,ARM处理器会根据异常事件的类型执行相应的异常处理程序。

异常处理程序的执行过程包括以下几个步骤:首先,ARM处理器会保存当前的处理状态,包括程序计数器、寄存器等。

然后,ARM处理器会根据异常事件的类型执行相应的异常处理代码。

异常处理代码可以是硬件中断处理程序、软件异常处理程序或操作系统内核的异常处理程序等。

在执行异常处理代码时,ARM处理器会根据异常事件的优先级进行中断屏蔽,以保证异常处理的顺序和可靠性。

最后,ARM处理器会恢复保存的处理状态,并继续执行异常处理之前的程序。

在异常处理过程中,ARM处理器还提供了一些特殊的异常处理指令,用于处理特定的异常情况。

例如,ARM处理器提供了异常返回指令,用于从异常处理程序返回到之前的程序。

此外,ARM处理器还提供了一些特殊的异常处理寄存器,用于保存异常处理过程中的状态信息。

ARM处理器的异常处理过程是一个复杂而精细的机制,能够有效地处理各种异常情况。

通过异常处理机制,ARM处理器可以保证系统的稳定性和可靠性,提高系统的容错能力和可维护性。

同时,ARM 处理器的异常处理机制也为开发者提供了一种方便和灵活的异常处理方式,可以根据实际需求进行异常处理程序的编写和调试。

ARM的7种异常与5种异常模式的对应关系

ARM的7种异常与5种异常模式的对应关系

ARM处理器中有7种异常情况:
快速中断请求,中断请求,预取指中止,数据中止,软件中断,未定义指令,复位
快速中断请求异常进入快中断模式,支持高速数传输及通道处理(FIQ异常响应时进入此模式)
中断请求异常进入中断模式,用于通用中断处理,(IRQ异常响应时进入此模式)
预取指中止,数据中止异常进入中止模式,用于支持虚拟内存和/或存储器保护
未定义指令异常进入未定义模式,支持硬件协处理器的软件仿真(未定义指令异常响应时进入此模式)
软件中断,复位异常进入管理模式,操作系统保护代码(系统复位和软件中断响应时进入此模式)
CPRS的I位为中断禁止位,F位为快中断禁止位。

ARM之Cortex-M内核中断异常系统详解

ARM之Cortex-M内核中断异常系统详解

ARM之Cortex-M内核中断异常系统详解问题最近在使用STM32F3芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理?在调试时,发现有中断有挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下!简介 中断(也称为“异常”)是微控制器一个很常见的特性。

中断一般是由硬件(例如外设、外部引脚)产生,当中断产生以后 CPU 就会中断当前的程序执行流程转而去处理中断服务中指定的操作。

所有的Cortex-M 内核都会系统一个用于中断处理的组件:NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)。

它处理处理中断,还处理其他需要服务的事件(例如 SVC 指令),通常称为“异常”。

​按照 ARM 的说法,中断也是一种异常。

Cortex-M3和 Cotex-M4 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1个 Systick(滴答定时器)定时器中断和多个系统异常。

而 Cortex-M0 最多支持32个IRQ、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。

IRQ:多数由定时器、IO端口、通信接口等外设产生NMI:通常由看门狗定时器或者掉电检测器等外设产生其他:主要来自系统内核注意,本文所说的 Cortex-M 主要指定是 Cotex-M3和 Cotex-M4。

Cortex-M0、Cortex-M0+、Cortex-M1 基于 ARMv6-M。

与Cotex-M3和 Cotex-M4相比,他们的指令集较小。

而且,Cortex-M1 是专门为FPGA应用设计的,没有独立MCU。

异常类型 Cortex-M 处理器的异常中,编号 1~15 的为系统异常,16及以上的则为中断输入。

arm内核全解析_arm内核体系结构分类介绍

arm内核全解析_arm内核体系结构分类介绍

arm内核全解析_arm内核体系结构分类介绍ARM处理器是英国Acor n有限公司设计的低功耗成本的第一款RISC微处理器。

全称为Ad vanced RISC Machine。

ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。

ARM内核特点ARM处理器为RISC芯片,其简单的结构使ARM内核非常小,这使得器件的功耗也非常低。

它具有经典RISC的特点:* 大的、统一的寄存器文件;* 简单的寻址模式;* 统一和固定长度的指令域,3地址指令格式,简化了指令的译码。

编译开销大,尽可能优化,采用三地址指令格式、较多寄存器和对称的指令格式便于生成优化代码;* 单周期操作,ARM指令系统中的指令只需要执行简单的和基本的操作,因此其执行过程在一个机器周期内完成;* 固定的32位长度指令,指令格式固定为32位长度,这样使指令译码结构简单,效率提高;* 采用指令流水线技术。

ARM内核体系结构ARM架构自诞生至今,已经发生了很大的演变,至今已定义了7种不同的版本:V1版架构:该架构只在原型机ARM1出现过,其基本性能包括基本的数据处理指令(无乘法)、字节、半字和字的Load/Store指令、转移指令,包括子程序调用及链接指令、软件中断指令、寻址空间64MB。

V2版架构:该版架构对V1版进行了扩展,如ARM2与ARM3(V2a版)架构,增加的功能包括乘法和乘加指令、支持协处理器操作指令、快速中断模式、SWP/SWPB的最基本存储器与寄存器交换指令、寻址空间64MB。

V3版架构:该版对ARM体系结构作了较大的改动,把寻址空间增至32位(4G B),增加了当前程序状态寄存器CPSR和程序状态保存寄存器 SPSR以便于异常处理。

增加了中止和未定义2种处理器模式。

ARM6就采用该版结构。

指令集变化包括增加了M RS/MSR指令,以访问新增的CPSR /SPSR寄存器、增加了从异常处理返回的指令功能。

Ach5ARM异常处理

Ach5ARM异常处理

LR-4
ቤተ መጻሕፍቲ ባይዱ
LR=0x8008
LR=0x8004
12345 6 7 8
Address 0x8000 0x8004 0x8008 0x8FEC 0X8FF0 0x8FF4
Operation BL 0X8FEC SUB ORR AND ORR EOR
FDELA FD F FDE FDE FD E
F-Fetch D-Decode E-Execute L-Linkret A-Adjust
Operation ADD SUB ORR AND ORR EOR
12345 6 7 8
FDE FDE FDE FDE FDE FD E
F-取指 D-解码 E-执行 该例中6个时钟周期执行6条指令 所有操作都在寄存器中执行 指令周期数(CPI)=1
《嵌入式系统》
cycle
分支流水线PC->举LR 例
将寄返存回器地,址每,个保异存常到模堆式栈有自己的堆栈指针。这个堆栈
指 针进应入必异须常在处系理统启动时初始化。
对R14进行调整
STM R13!,{R0-R3,R14}(将R0-R3,R14保存到堆栈)
异常处理...
退出异常处理
LDM R13!,{R0-R3,PC}^
《嵌入式系统》
返回地址调节
《嵌入式系统》
流水线示意
第1条指令 PC-8 取指 译码 执行 第2条指令 PC-4 取指 译码 第3条指令 PC 取指
发生异常,中断程序跳转
执行
返回位置
译码 执行
《嵌入式系统》
最佳流水线
cycle Address 0x8000 0x8004 0x8008 0x800C 0X8010 0x8014

aarch64系统级体系架构之异常级别

aarch64系统级体系架构之异常级别

aarch64系统级体系架构之异常级别aarch64系统级体系架构之异常级别1.简述2.树莓派启动深度解析3.不同异常级别需要注意的问题1.简述系统的异常级别对于arm芯⽚来说⾮常的重要,对于操作系统层⾯上来说,理解芯⽚的体系架构,将很容易的进⼊状态,随⼼所欲的去玩转芯⽚,对于做应⽤来说,熟悉芯⽚的体系架构,可以解决⾮常棘⼿的问题,⽐如系统的安全还有就是实时性响应问题。

⽐如我们的⼿机指纹加密数据,实际上是在安全模式下的,此时对于运⾏在⾮安全模式下的操作系统,其实是获取不到指纹的数据的,只是处理安全模式下发送过来的结果,类似的还有⽀付安全。

对于armv8异常级别,其实是⼀个很⼤的话题,但是深⼊理解之后,就会发现这时⼀个很有意思的东西。

看过盗梦空间的电影都知道,梦有好多层,但是那⼀层是真实的,那⼀层是梦境,真实到梦境如何切换,梦境到真实如何切换,这真的是不识庐⼭真⾯⽬,只缘⽣在此⼭中。

本⽂简单介绍⼀下树莓派启动的异常级别,如何从不同的exception level进⾏切换,同时启动的时候如何指定exception level,⼤体上去理解异常级别。

获得当前 ELAArch64 架构下CurrentEL⽤ 64 位表⽰,其中第 [3:2] 位表⽰ EL,[63:4] 和 [1:0] 都是保留位。

EL Meaning0b00EL00b01EL10b10EL20b11EL3通过下⾯的代码能够获得当前的 EL:// Move the contents of a PSR to a general-purpose register// 将 CurrentEL 值写⼊通⽤寄存器 x0mrs x0, CurrentEL// Logical Shift Right// 将 Xt 值右移 2 位lsr x0, x0, #2⽐如获取到的值是0b0100, 因为 [1:0] 2位是保留位,总是为0,所以右移 2 位就得到了上表中的0b01 EL。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM处理器异常处理所谓异常就是正常的用户程序被暂时中止,处理器就进入异常模式,例如响应一个来自外设的中断,或者当前程序非法访问内存地址都会进入相应异常模式。

1.1异常分类(1)复位异常当CPU刚上电时或按下reset重启键之后进入该异常,该异常在管理模式下处理。

(2)一般/快速中断请求CPU和外部设备是分别独立的硬件执行单元,CPU对全部设备进行管理和资源调度处理,CPU要想知道外部设备的运行状态,要么CPU定时的去查看外部设备特定寄存器,要么让外部设备在出现需要CPU干涉处理时“打断”CPU,让它来处理外部设备的请求,毫无疑问第二种方式更合理,可以让CPU“专心”去工作,这里的“打断”操作就叫做中断请求,根据请求的紧急情况,中断请求分一般中断和快速中断,快速中断具有最高中断优先级和最小的中断延迟,通常用于处理高速数据传输及通道的中数据恢复处理,如DMA等,绝大部分外设使用一般中断请求。

(3)预取指令中止异常该异常发生在CPU流水线取指阶段,如果目标指令地址是非法地址进入该异常,该异常在中止异常模式下处理。

(4)未定义指令异常该异常发生在流水线技术里的译码阶段,如果当前指令不能被识别为有效指令,产生未定义指令异常,该异常在未定义异常模式下处理。

(5)软件中断指令(swi)异常该异常是应用程序自己调用时产生的,用于用户程序申请访问硬件资源时,例如:printf()打印函数,要将用户数据打印到显示器上,用户程序要想实现打印必须申请使用显示器,而用户程序又没有外设硬件的使用权,只能通过使用软件中断指令切换到内核态,通过操作系统内核代码来访问外设硬件,内核态是工作在特权模式下,操作系统在特权模式下完成将用户数据打印到显示器上。

这样做的目的无非是为了保护操作系统的安全和硬件资源的合理使用,该异常在管理模式下处理。

(6)数据中止访问异常该异常发生在要访问数据地址不存在或者为非法地址时,该异常在中止异常模式下处理。

1.1.22异常发生的硬件操作在异常发生后,ARM内核会自动做以下工作:l保存执行状态:将CPSR复制到发生的异常模式下SPSR中;l模式切换:将CPSR模式位强制设置为与异常类型相对应的值,同时处理器进入到ARM执行模式,禁止所有IRQ中断,当进入FIQ快速中断模式时禁止FIQ中断;l保存返回地址:将下一条指令的地址(被打断程序)保存在LR(异常模式下LR_excep)中。

l跳入异常向量表:强制设置PC的值为相应异常向量地址,跳转到异常处理程序中。

(1)保存执行状态当前程序的执行状态是保存在CPSR里面的,异常发生时,要保存当前的CPSR里的执行状态到异常模式里的SPSR里,将来异常返回时,恢复回CPSR,恢复执行状态。

(2)模式切换硬件自动根据当前的异常类型,将异常码写入CPSR里的M[4:0]模式位,这样CPU就进入了对应异常模式下。

不管是在ARM状态下还是在THUMB状态下发生异常,都会自动切换到ARM状态下进行异常的处理,这是由硬件自动完成的,将CPSR[5]设置为0。

同时,CPU会关闭中断IRQ(设置CPSR寄存器I位),防止中断进入,如果当前是快速中断FIQ异常,关闭快速中断(设置CPSR寄存器F位)。

(3)保存返回地址当前程序被异常打断,切换到异常处理程序里,异常处理完之后,返回当前被打断模式继续执行,因此必须要保存当前执行指令的下一条指令的地址到LR_excep(异常模式下LR,并不存在LR_excep寄存器,为方便读者理解加上_excep,以下道理相同),由于异常模式不同以及ARM内核采用流水线技术,异常处理程序里要根据异常模式计算返回地址。

(4)跳入异常向量表该操作是CPU硬件自动完成的,当异常发生时,CPU强制将PC的值修改为一个固定内存地址,这个固定地址叫做异常向量(详见3.2.4章节)。

1.3异常返回地址由1.1.3节可知,一条指令的执行分为:取指,译码,执行三个主要阶段,CPU由于使用流水线技术,造成当前执行指令的地址应该是PC–8(32位机一条指令四个字节),那么执行指令的下条指令应该是PC–4。

在异常发生时,CPU自动会将将PC–4的值保存到LR里,但是该值是否正确还要看异常类型才能决定。

各模式的返回地址说明如下:(a)一般/快速中断请求:快速中断请求和一般中断请求返回处理是一样的。

通常处理器执行完当前指令后,查询FIQ/IRQ中断引脚,并查看是否允许FIQ/IRQ中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ/IRQ异常中断,当FIQ/IRQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当FIQ/IRQ异常中断产生时,处理器将值(pc-4)保存到FIQ/IRQ异常模式下的寄存器lr_irq/lr_irq中,它指向当前指令之后的第2条指令,因此正确返回地址可以通过下面指令算出:SUBS PC,LR_irq,#4;一般中断SUBS PC,LR_fiq,#4;快速中断注:LR_irq/LR_fiq分别为一般中断和快速中断异常模式下LR,并不存在LR_xxx寄存器,为方便读者理解加上_xxx(b)预取指中止异常:在指令预取时,如果目标地址是非法的,该指令被标记成有问题的指令,这时,流水线上该指令之前的指令继续执行,当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。

发生指令预取异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令,因此指令预取中止异常中断应该返回到产生该指令预取中止异常中断的指令处,而不是当前指令的下一条指令。

指令预取中止异常中断由当前执行的指令在ALU里执行时产生,当指令预取中止异常中断发生时,程序计数器pc的值还未更新,它指向当前指令后面第2条指令(对于ARM指令,它指向当前指令地址加8字节的位置;对于Thumb指令,它指向当前指令地址加4字节的位置)。

此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令的下一条指令,所以返回操作可以通过下面指令实现:SUBS PC,LR_abt,#4注:LR_abt为中止模式下LR,并不存在LR_abt寄存器,为方便读者理解加上_abt(c)未定义指令异常:未定义指令异常中断由当前执行的指令在ALU里执行时产生,当未定义指令异常中断产生时,程序计数器pc的值还未更新,它指向当前指令后面第2条指令(对于ARM指令,它指向当前指令地址加8字节的位置;对于Thumb指令,它指向当前指令地址加4字节的位置),当未定义指令异常中断发生时,处理器将值(pc-4)保存到lr_und中,此时(pc-4)指向当前指令的下一条指令,所以从未定义指令异常中断返回可以通过如下指令来实现:MOV PC,LR_und注:LR_und为未定义模式下LR,并不存在LR_und寄存器,为方便读者理解加上_und(d)软中断指令(SWI)异常:SWI异常中断和未定义异常中断指令一样,也是由当前执行的指令在ALU里执行时产生,当SWI指令执行时,pc的值还未更新,它指向当前指令后面第2条指令(对于ARM指令,它指向当前指令地址加8字节的位置;对于Thumb指令,它指向当前指令地址加4字节的位置),当未定义指令异常中断发生时,处理器将值(pc-4)保存到lr_svc中,此时(pc-4)指向当前指令的下一条指令,所以从SWI异常中断处理返回的实现方法与从未定义指令异常中断处理返回一样:MOV PC,LR_svc注:LR_svc为管理模式下LR,并不存在LR_svc寄存器,为方便读者理解加上_svc(e)数据中止异常:发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。

数据访问异常中断由当前执行的指令在ALU里执行时产生,当数据访问异常中断发生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置)。

此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令后面第2条指令,所以返回操作可以通过下面指令实现:SUBS PC,LR_abt,#8注:LR_abt为中止模式下LR,并不存在LR_abt寄存器,为方便读者理解加上_abt上述每一种异常发生时,其返回地址都要根据具体异常类型进行重新修复返回地址,再次强调下,被打断程序的返回地址保存在对应异常模式下的LR_excep里。

1.4异常向量表异常向量表是一段特定内存地址空间,每种ARM异常对应一个字长空间(4Bytes),正好是一条32位指令长度,当异常发生时,CPU强制将PC的值设置为当前异常对应的固定内存地址。

如表3-4所示是S3C2440的异常向量表。

表3-4异常向量表注:异常向量也可以出现在高地址0xFFFF0000处,当今操作系统为了控制内存访问权限,通常会开启虚拟内存,开启了虚拟内存之后,内存的开始空间通常为内核进程空间,和页表空间,异常向量表不能再安装在0地址处了ARM的例外优先级从高到低依次为Reset→Data abort→FIQ→IRQ→Prefetch abort→Undefined instruction/SWI。

跳入异常向量表操作是异常发生时,硬件自动完成的,剩下的异常处理任务完全交给了程序员。

由上表可知,异常向量是一个固定的内存地址,我们可以通过向该地址处写一条跳转指令,让它跳向我们自己定义的异常处理程序的入口,就可以完成异常处理了。

正是由于异常向量表的存在,才让硬件异常处理和程序员自定义处理程序有机联系起来。

异常向量表里0x00000000地址处是reset复位异常,之所以它为0地址,是因为CPU在上电时自动从0地址处加载指令,由此可见将复位异常安装在此地址处也是前后接合起来设计的,不得不感叹CPU设计师的伟大,其后面分别是其余7种异常向量,每种异常向量都占有四个字节,正好是一条指令的大小,最后一个异常是快速中断异常,将其安装在此也有它的意义,在0x0000001C地址处可以直接存放快速中断的处理程序,不用设置跳转指令,这样可以节省一个时钟周期,加快快速中断处理时间。

我们可以通过简单的使用下面的指令来安装异常向量表:b reset;跳入reset处理程序b HandleUndef;跳入未定义处理程序b HandSWI;跳入软中断处理程序b HandPrefetchAbt;跳入预取指令处理程序b HandDataAbt;跳入数据访问中止处理程序b HandNoUsed;跳入未使用程序b HandleIRQ;跳入中断处理程序b HandleFIQ;跳入快速中断处理程序通常安装完异常向量表,跳到我们自己定义的处理程序入口,这时我们还没有保存被打断程序的现场,因此在异常处理程序的入口里先要保存打断程序现场。

相关文档
最新文档